读书人

libevent为啥总通知accept事件

发布时间: 2013-09-07 14:12:44 作者: rapoo

libevent为什么总通知accept事件
偷懒,没去跟代码。。。。

测试网上的例子:http://blog.csdn.net/funkri/article/details/9352955


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <assert.h>

#include <event2/event.h>
#include <event2/bufferevent.h>

#define LISTEN_PORT 9999
#define LISTEN_BACKLOG 32

void do_accept(evutil_socket_t listener, short event, void *arg);
void read_cb(struct bufferevent *bev, void *arg);
void error_cb(struct bufferevent *bev, short event, void *arg);
void write_cb(struct bufferevent *bev, void *arg);

int main(int argc, char *argv[])
{
WSADATA wsa_data;
if (0 != WSAStartup(MAKEWORD(2, 2), &wsa_data))
{
printf("WSAStartup failed: %d", WSAGetLastError());
return(false);
}

evutil_socket_t listener;
listener = socket(AF_INET, SOCK_STREAM, 0);
assert(listener > 0);
evutil_make_listen_socket_reuseable(listener);

struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = 0;
sin.sin_port = htons(LISTEN_PORT);

if (bind(listener, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
perror("bind");
return 1;
}

if (listen(listener, LISTEN_BACKLOG) < 0) {
perror("listen");
return 1;
}

printf ("Listening...\n");

evutil_make_socket_nonblocking(listener);

struct event_base *base = event_base_new();
assert(base != NULL);
struct event *listen_event;
listen_event = event_new(base, listener, EV_READ|EV_PERSIST, do_accept, (void*)base);
event_add(listen_event, NULL);


event_base_dispatch(base);

printf("The End.");
return 0;
}

void do_accept(evutil_socket_t listener, short event, void *arg)
{
struct event_base *base = (struct event_base *)arg;
evutil_socket_t fd;
struct sockaddr_in sin;
socklen_t slen;
fd = accept(listener, (struct sockaddr *)&sin, &slen);
if (fd < 0) {
perror("accept");
return;
}
if (fd > FD_SETSIZE) {
perror("fd > FD_SETSIZE\n");
return;
}

printf("ACCEPT: fd = %u\n", fd);

struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, read_cb, NULL, error_cb, arg);
bufferevent_enable(bev, EV_READ|EV_WRITE|EV_PERSIST);
}

void read_cb(struct bufferevent *bev, void *arg)
{
#define MAX_LINE 256
char line[MAX_LINE+1];
int n;
evutil_socket_t fd = bufferevent_getfd(bev);

while (n = bufferevent_read(bev, line, MAX_LINE), n > 0) {
line[n] = '\0';
printf("fd=%u, read line: %s\n", fd, line);

bufferevent_write(bev, line, n);
}
}

void write_cb(struct bufferevent *bev, void *arg)
{

}

void error_cb(struct bufferevent *bev, short event, void *arg)
{
evutil_socket_t fd = bufferevent_getfd(bev);
printf("fd = %u, ", fd);
if (event & BEV_EVENT_TIMEOUT) {
printf("Timed out\n"); //if bufferevent_set_timeouts() called


}
else if (event & BEV_EVENT_EOF) {
printf("connection closed\n");
}
else if (event & BEV_EVENT_ERROR) {
printf("some other error\n");
}
bufferevent_free(bev);
}



客户端,只创建一个连接,可是上面代码总是调用do_accept(),并从perror("accept");这出去,其实没错误

PS: 现在要写个服务器,自己是有一套代码,但是怕以后别人不好维护,所以,向直接用libevent来做,
个人本身没有libevent使用经验,刚开始看,项目比较急,很可能要用之前自己的那一套了。。。。
[解决办法]
在Google上搜其它相关例子代码再试试?

读书人网 >C语言

热点推荐