1

我有一个应用程序,它将像一个 p2p 软件一样工作,所有对等点都将相互交谈。由于通信将是 TCP,我认为我可以使用epool(4)以便可以处理多个连接。由于每个对等点都会非常频繁地发送数据,我认为我将与每个对等点建立一个持久连接,该连接将在应用程序生命周期内使用。

现在,我不知道如何处理的一件事是,由于连接从未关闭,我怎么知道何时应该停止接收数据read()并再次调用epool_wait()以收听更多包?还是有更好的方法来处理持久的 TCP 连接?

4

3 回答 3

2

您应该将套接字设置为非阻塞,并且当 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 循环。但是就像上面的代码一样处理返回值。

于 2010-03-03T18:01:13.957 回答
1

那应该是'epoll',而不是'epool'......不熟悉epoll,但是看看这里的Beej's guide,看看使用'poll'的套接字的例子......看看那里的第7.2节看看它是怎么做的,还可以看看第 9.17 节中“poll”的用法......

希望这会有所帮助,最好的问候,汤姆。

于 2010-03-03T14:16:18.550 回答
0

read() 读取立即可用的尽可能多的数据(但不会超出您的要求)。只需在活动套接字上运行 read() ,并使用足够大的缓冲区(您可能不需要它比 MTU 大...... 2048 字节就可以了)并在完成时调用 epoll_wait() 。

于 2010-03-03T14:10:11.863 回答