带佬们能帮我看一下我有没有理解错下面的代码吗?
poll的是别人库里面写的,然后我改成使用epoll的方式,他这个就是用poll去监听某一个sock吧,但是我印象中应该是监听很多sock才对,反正跟着他的这种方式写了个epoll版本的,但是现在epoll这种方式传输文件到一半就没了,不知道怎么回事
带佬们帮忙看看呗,谢谢啦
inline ssize_t select_write(socket_t sock, time_t sec, time_t usec) {
#ifdef CPPHTTPLIB_USE_POLL
struct pollfd pfd_read;
pfd_read.fd = sock;
pfd_read.events = POLLOUT;
auto timeout = static_cast<int>(sec * 1000 + usec / 1000);
return handle_EINTR([&]() { return poll(&pfd_read, 1, timeout); });
#elifdef CPPHTTPLIB_USE_EPOLL
int epollfd;
struct epoll_event event[EPOLLEVENTS];
struct epoll_event ev;
auto timeout = static_cast<int>(sec * 1000 + usec / 1000);
epollfd = epoll_create(FDSIZE);
ev.events = EPOLLOUT;
ev.data.fd = sock;
epoll_ctl(epollfd, EPOLL_CTL_ADD, sock, &ev);
return handle_EINTR([&](){return epoll_wait(epollfd, event, 1000, timeout); });
/*hanle_EINTR*/
template <typename T> inline ssize_t handle_EINTR(T fn) {
ssize_t res = 0;
while (true) {
res = fn();
if (res < 0 && errno == EINTR) { continue; }
break;
}
return res;
}