Делаю так, запускаю цикл добавляю два события, потом после того как читаю из сокета, пытаюсь удалить event_del() событие из мониторинга, но оно не удаляется объясните плизз, в чём дело ? тут цикл тормозиться так как после почтения с делаю close(fd), но event_dispatch(); не завершается так как события не были удалены. | Код |
struct client { struct event ev_read; struct event ev_write; };
int setnonblock(int fd);
int make_connect (int srv_sck) { if( connect(srv_sck, (struct sockaddr *)&sa, sizeof(sa)) == -1 ) { fprintf(stderr, "Can't connect to port %d .\n", 80); close(srv_sck); return -1; } return 1; }
void on_read(int fd, short ev, void *arg) {
struct client *client = (struct client *)arg; perror("Read"); char buf[8196]; memset(buf, 0, 8196);
if (read(fd, buf, sizeof(buf)) > 0) { if (!event_del(&client->ev_read) ) perror("\tYap ev_write was deleted"); else perror("can't delete ev_read");
close(fd); free(client); return; } }
void on_write(int fd, short ev, void *arg) { struct client *client = (struct client *)arg; perror("Write"); char http_request[2048]; memset(http_request, 0, 2048); strcpy(http_request, "GET / HTTP/1.0\r\n\r\n");
if (write(fd, http_request, strlen(http_request)) > 0 ) { if (!event_del(&client->ev_write) ) perror("\tYap ev_write was deleted"); else perror("can't delete ev_write");
return; } }
int main(int argc, char **argv) {
struct hostent *hptr; static char *host = "localhost";
if( (hptr = gethostbyname(host)) == NULL) { fprintf(stderr, "Can't get host %s .\n", host); return 1; } int port = 80; sa.sin_family = AF_INET; sa.sin_port = htons(port); memcpy((char*)&sa.sin_addr.s_addr, (char*)hptr->h_addr, hptr->h_length); event_init(); // libevent init
int srv_sck; int reuseaddr_on = 1; struct event ev_read, ev_write;
if ( (srv_sck = socket( AF_INET, SOCK_STREAM, 0 )) == -1 ) perror("socket"); if (setsockopt(srv_sck, SOL_SOCKET, SO_KEEPALIVE, &reuseaddr_on, sizeof(reuseaddr_on)) == -1) perror("setsockopt");
make_connect(srv_sck);
if (setnonblock(srv_sck) < 0) perror("setnonblock");
struct client * client = calloc(1, sizeof(*client));
event_set(&ev_read, srv_sck, EV_READ|EV_PERSIST, on_read, client); event_add(&ev_read, NULL);
event_set(&ev_write, srv_sck, EV_WRITE|EV_PERSIST, on_write, client); event_add(&ev_write, NULL);
event_dispatch();
return 0; }
int setnonblock(int fd) { int flags; flags = fcntl(fd, F_GETFL); if (flags < 0) return flags; flags |= O_NONBLOCK; if (fcntl(fd, F_SETFL, flags) < 0) return -1;
return 0; }
|
Это сообщение отредактировал(а) fray - 8.4.2008, 18:09
|