Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用epoll处理多个TCP连接上的数据_C_Sockets_Asynchronous_Tcp_Epoll - Fatal编程技术网

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

使用epoll处理多个TCP连接上的数据,c,sockets,asynchronous,tcp,epoll,C,Sockets,Asynchronous,Tcp,Epoll,我有一个应用程序,它将像一个p2p软件一样工作,所有的对等方都将相互交谈。由于通信将是TCP,我想我可以使用它来处理多个连接。由于每个对等机都会经常发送数据,我认为我将建立一个到每个对等机的持久连接,该连接将在应用程序生命周期内使用 现在,我不知道如何处理的一件事是,由于连接从未关闭,我如何知道何时应该停止使用read()接收数据,并再次调用epool\u wait(),以在更多包后侦听?或者有更好的方法处理持久TCP连接吗?read()读取尽可能多的立即可用的数据(但不能超过您的请求)。只需在

我有一个应用程序,它将像一个p2p软件一样工作,所有的对等方都将相互交谈。由于通信将是TCP,我想我可以使用它来处理多个连接。由于每个对等机都会经常发送数据,我认为我将建立一个到每个对等机的持久连接,该连接将在应用程序生命周期内使用


现在,我不知道如何处理的一件事是,由于连接从未关闭,我如何知道何时应该停止使用
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系统上更易于移植。:-)是的,这是我的错别字:)谢谢你的链接。