- 论坛徽章:
- 0
|
本帖最后由 rookie睿 于 2014-11-11 17:44 编辑
截取原函数如下- #ifdef _WIN32
- if ((fd = socket(inaddr.sin_family, SOCK_STREAM, 0)) == JB_INVALID_SOCKET)
- #else
- if ((fd = socket(inaddr.sin_family, SOCK_STREAM, 0)) < 0)
- #endif
- {
- return(JB_INVALID_SOCKET);
- }
- /* wait for connection to complete */
- FD_ZERO(&wfds);
- FD_SET(fd, &wfds);
- tv->tv_sec = 30;
- tv->tv_usec = 0;
-
-
- log_error(LOG_LEVEL_GPC, "int connect() : before select");
-
- /* MS Windows uses int, not SOCKET, for the 1st arg of select(). Wierd! */
- if (select((int)fd + 1, NULL, &wfds, NULL, tv) <= 0)
- {
- log_error(LOG_LEVEL_GPC, "in select");
- close_socket(fd);
- return(JB_INVALID_SOCKET);
- }
复制代码 我改为epoll 如下
- #ifdef _WIN32
- if ((fd = socket(inaddr.sin_family, SOCK_STREAM, 0)) == JB_INVALID_SOCKET)
- #else
- if ((fd = socket(inaddr.sin_family, SOCK_STREAM, 0)) < 0)
- #endif
- {
- return(JB_INVALID_SOCKET);
- }
- epollfd = epoll_create(1024);
-
- ev.data.fd = fd;
- ev.events = EPOLLIN | EPOLLET;
- int epollctl_value = epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev);
-
-
- log_error(LOG_LEVEL_GPC, "epollctl_value == %d", epollctl_value);
-
- tv->tv_sec = 30;
- tv->tv_usec = 0;
-
- if( epoll_wait(epollfd, events, 1024, -1) <= 0)
- {
- log_error(LOG_LEVEL_GPC, "in epoll_wait epollfd == %d", epollfd);
- close_socket(fd);
- return(JB_INVALID_SOCKET);
- }
复制代码 select情况下 if (select((int)fd + 1, NULL, &wfds, NULL, tv) <= 0)这句是可以监听到文件描述符的
但是在epoll情况下 if( epoll_wait(epollfd, events, 1024, -1) <= 0) 监听不到 一直处于阻塞状态 求解epoll_wait为什么监听不到? |
|