使用epoll处理多个TCP连接上的数据
我有一个应用程序,它将像一个p2p软件一样工作,所有的对等方都将相互交谈。由于通信将是TCP,我想我可以使用它来处理多个连接。由于每个对等机都会经常发送数据,我认为我将建立一个到每个对等机的持久连接,该连接将在应用程序生命周期内使用使用epoll处理多个TCP连接上的数据,c,sockets,asynchronous,tcp,epoll,C,Sockets,Asynchronous,Tcp,Epoll,我有一个应用程序,它将像一个p2p软件一样工作,所有的对等方都将相互交谈。由于通信将是TCP,我想我可以使用它来处理多个连接。由于每个对等机都会经常发送数据,我认为我将建立一个到每个对等机的持久连接,该连接将在应用程序生命周期内使用 现在,我不知道如何处理的一件事是,由于连接从未关闭,我如何知道何时应该停止使用read()接收数据,并再次调用epool\u wait(),以在更多包后侦听?或者有更好的方法处理持久TCP连接吗?read()读取尽可能多的立即可用的数据(但不能超过您的请求)。只需在
现在,我不知道如何处理的一件事是,由于连接从未关闭,我如何知道何时应该停止使用
read()
接收数据,并再次调用epool\u wait()
,以在更多包后侦听?或者有更好的方法处理持久TCP连接吗?read()读取尽可能多的立即可用的数据(但不能超过您的请求)。只需在活动套接字上运行read(),并使用足够大的缓冲区(您可能不需要比MTU大的缓冲区…2048字节),完成后调用epoll_wait()。这应该是“epoll”,而不是“epool”…不熟悉epoll,但看看这里的Beej,看看使用“poll”的套接字示例……看看这里的第7.2节,看看它是如何实现的,也看看第9.17节,看看“poll”的用法
希望这有帮助,
顺致敬意,
Tom。您应该将套接字设置为非阻塞,并且当epoll指示有数据要读取时 您应该在循环中调用read(),直到read()返回-1且errno为ewooldblock 也就是说,您的读取循环可能看起来像:
for(;;)
ssize_t ret;
ret = read(...);
if(ret == 0) {
//client disconnected, handle it, remove the fd from the epoll set
break;
} else if(ret == -1) {
if(errno == EWOULDBLOCK) {
// no more data, return to epoll loop
} else {
//error occured, handle it remove the fd from the epoll set
}
break;
}
// handle the read data
}
如果您没有在epoll中使用边缘触发模式,那么您实际上并不需要循环—您可以只进行一次读取,然后返回epoll循环。但是,处理返回值就像上面的代码一样。只是出于好奇:为什么epoll(顺便说一句:它不是“epool”)而不是常规的轮询或选择(我想这两者都更便于携带)?或者,您可以使用
recv
而不是read
,并提供MSG\u DONTWAIT
标志。也不要忘记您的SIGPIPE
处理。如果((EWOULDBLOCK==errno)| |(EAGAIN==errno))
,则使其在其他Unix系统上更易于移植。:-)是的,这是我的错别字:)谢谢你的链接。