使用epoll处理多个TCP连接上的数据

时间:2010-03-03 14:03:23

标签: c sockets asynchronous tcp epoll

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

现在,我不知道如何处理的一件事是,由于连接永远不会关闭,我怎么知道何时应该停止使用read()接收数据并再次调用epool_wait()来收听经过更多套餐?或者有更好的方法来处理持久性TCP连接吗?

3 个答案:

答案 0 :(得分: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循环。但是像上面的代码一样处理返回值。

答案 1 :(得分:1)

应该是'epoll',而不是'epool'......不熟悉epoll,但是请看看Beej的guide,看看使用'poll'的套接字示例...看看那里的第7.2节,看看它是如何完成的,关于'民意调查'的用法,请看第9.17节......

希望这有帮助, 最好的祝福, 汤姆。

答案 2 :(得分:0)

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