event socket读写

三个接口即可搞定event_set、event_add、event_dispatch

如果设置为EV_PERSIST,则不需要重复调用event_add。


static void
multiple_write_cb(evutil_socket_t fd, short event, void *arg)
{
struct event *ev = arg;
int len;


len = 128;
if (woff + len >= (int)sizeof(wbuf))
len = sizeof(wbuf) - woff;


len = write(fd, wbuf + woff, len);
if (len == -1) {
fprintf(stderr, "%s: write\n", __func__);
if (usepersist)
event_del(ev);
return;
}


woff += len;


if (woff >= (int)sizeof(wbuf)) {
shutdown(fd, SHUT_WR);
if (usepersist)
event_del(ev);
return;
}


if (!usepersist) {
if (event_add(ev, NULL) == -1)
exit(1);
}
}


static void
test_multiple(void)
{
struct event ev, ev2;
int i;


/* Multiple read and write test */
setup_test("Multiple read/write: ");
memset(rbuf, 0, sizeof(rbuf));
for (i = 0; i < (int)sizeof(wbuf); i++)
wbuf[i] = i;


roff = woff = 0;
usepersist = 0;


event_set(&ev, pair[0], EV_WRITE, multiple_write_cb, &ev);
if ( event_add(&ev, NULL) == -1)
exit(1);
event_set(&ev2, pair[1], EV_READ, multiple_read_cb, &ev2);
if (event_add(&ev2, NULL) == -1)
exit(1);
event_dispatch();


if (roff == woff)
test_ok = memcmp(rbuf, wbuf, sizeof(wbuf)) == 0;


cleanup_test();
}


static void
test_persistent(void)
{
struct event ev, ev2;
int i;


/* Multiple read and write test with persist */
setup_test("Persist read/write: ");
memset(rbuf, 0, sizeof(rbuf));
for (i = 0; i < (int)sizeof(wbuf); i++)
wbuf[i] = i;


roff = woff = 0;
usepersist = 1;


event_set(&ev, pair[0], EV_WRITE| EV_PERSIST, multiple_write_cb, &ev);
if (event_add(&ev, NULL) == -1)
exit(1);
event_set(&ev2, pair[1], EV_READ|EV_PERSIST, multiple_read_cb, &ev2);
if (event_add(&ev2, NULL) == -1)
exit(1);
event_dispatch();


if (roff == woff)
test_ok = memcmp(rbuf, wbuf, sizeof(wbuf)) == 0;


cleanup_test();
}


static void
test_combined(void)
{
struct both r1, r2, w1, w2;


setup_test("Combined read/write: ");
memset(&r1, 0, sizeof(r1));
memset(&r2, 0, sizeof(r2));
memset(&w1, 0, sizeof(w1));
memset(&w2, 0, sizeof(w2));


w1.nread = 4096;
w2.nread = 8192;


event_set(&r1.ev, pair[0], EV_READ, combined_read_cb, &r1);
event_set(&w1.ev, pair[0], EV_WRITE, combined_write_cb, &w1);
event_set(&r2.ev, pair[1], EV_READ, combined_read_cb, &r2);
event_set(&w2.ev, pair[1], EV_WRITE, combined_write_cb, &w2);
tt_assert(event_add(&r1.ev, NULL) != -1);
tt_assert(!event_add(&w1.ev, NULL));
tt_assert(!event_add(&r2.ev, NULL));
tt_assert(!event_add(&w2.ev, NULL));
event_dispatch();


if (r1.nread == 8192 && r2.nread == 4096)
test_ok = 1;


end:
cleanup_test();
}


static void
test_simpletimeout(void)
{
struct timeval tv;
struct event ev;


setup_test("Simple timeout: ");


tv.tv_usec = 0;
tv.tv_sec = SECONDS;
evtimer_set(&ev, timeout_cb, NULL);
evtimer_add(&ev, &tv);


evutil_gettimeofday(&tset, NULL);
event_dispatch();


cleanup_test();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值