[英]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
这也可以避免阻塞读/写等不良情况。
首先,您应该轮询侦听文件描述符(使用select
, poll
或epoll
/ kqueue
),并且只有在准备好读取时才调用accept
。
其次,更具体地说,如果您要使用边缘触发的epoll
,则需要先将套接字设置为非阻塞模式。 然后,当你被告知它已准备好读取时,你需要在循环中调用accept
,直到你返回-1
并出现错误EAGAIN
或EWOULDBLOCK
- 可能有多个连接请求一次等待,而边缘触发的轮询仅警报你在状态变化 ,所以你需要耗尽插座。
在一个非常,非常幼稚的方式,你也可以用投票废除, 只与非阻塞套接字的工作,无论是在繁忙的循环,或与一种睡眠循环。 但这完全是浪费,并且与正确的epoll
/ kqueue
解决方案(或您的平台提供的任何轮询机制)相比,并没有给您带来任何epoll
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.