繁体   English   中英

阻止接受

[英]Blocking accept

我正在编写TCP / IP套接字服务器。

我的问题是,当我(例如)telnet我的服务器并且不发送任何数据时,我的接受呼叫阻塞并且不接受任何新的连接。

当我发送任何内容或退出telnet接受停止阻止时,我可以处理发送的数据并接受开始接受新的连接。

main() {
   socket = bind_listen();

   while(1) {
       user_socket = accept(socket);
       ssl = SSL_new(ctx);
       SSL_set_fd(ssl, user_socket);
       SSL_accept(ssl);

       event.data.fd = user_socket;
       event.events = EPOLLIN | EPOLLONESHOT;

       epoll_proof = epoll_ctl(poll_fd, EPOLL_CTL_ADD, user_socket, &event);
   }
}

epoll_wait()和处理数据有几个线程。 任何想法? 谢谢!

那是因为你的程序是一个单一的线程。 在第一步中它等待连接,之后,当建立连接时,它等待输入。
你有几个选项让它等待几个连接并接受它们:线程,选择和fcntl。

您可以使用多路复用器,例如select或poll族。

这将告诉您什么时候可以运行接受w / out被阻止。

如果您不知道如何使用多路复用器,我认为select是最简单的解决方案: http//linux.die.net/man/2/select

这也可以避免阻塞读/写等不良情况。

首先,您应该轮询侦听文件描述符(使用selectpollepoll / kqueue ),并且只有在准备好读取时才调用accept

其次,更具体地说,如果您要使用边缘触发的epoll ,则需要先将套接字设置为非阻塞模式。 然后,当你被告知它已准备好读取时,你需要在循环中调用accept ,直到你返回-1并出现错误EAGAINEWOULDBLOCK - 可能有多个连接请求一次等待,而边缘触发的轮询仅警报你在状态变化 ,所以你需要耗尽插座。

在一个非常,非常幼稚的方式,你也可以用投票废除, 与非阻塞套接字的工作,无论是在繁忙的循环,或与一种睡眠循环。 但这完全是浪费,并且与正确的epoll / kqueue解决方案(或您的平台提供的任何轮询机制)相比,并没有给您带来任何epoll

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM