我有一个应用程序,它将像一个 p2p 软件一样工作,所有对等点都将相互交谈。由于通信将是 TCP,我认为我可以使用epool(4)以便可以处理多个连接。由于每个对等点都会非常频繁地发送数据,我认为我将与每个对等点建立一个持久连接,该连接将在应用程序生命周期内使用。
现在,我不知道如何处理的一件事是,由于连接从未关闭,我怎么知道何时应该停止接收数据read()
并再次调用epool_wait()
以收听更多包?还是有更好的方法来处理持久的 TCP 连接?
您应该将套接字设置为非阻塞,并且当 epoll 指示有数据要读取时,您应该在循环中调用 read() 直到 read() 返回 -1 并且 errno 为 EWOULDBLOCK
也就是说,您的读取循环可能看起来像:
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 中使用边缘触发模式,你就不需要循环——你可以只做 1 次读取并返回到 epoll 循环。但是就像上面的代码一样处理返回值。
那应该是'epoll',而不是'epool'......不熟悉epoll,但是看看这里的Beej's guide,看看使用'poll'的套接字的例子......看看那里的第7.2节看看它是怎么做的,还可以看看第 9.17 节中“poll”的用法......
希望这会有所帮助,最好的问候,汤姆。
read() 读取立即可用的尽可能多的数据(但不会超出您的要求)。只需在活动套接字上运行 read() ,并使用足够大的缓冲区(您可能不需要它比 MTU 大...... 2048 字节就可以了)并在完成时调用 epoll_wait() 。