C 阻塞接受

C 阻塞接受,c,tcp-ip,socketserver,C,Tcp Ip,Socketserver,我正在编程一个TCP/IP Socketserver 我的问题是,当我(例如)telnet我的服务器并且不发送任何数据时,我的accept调用阻塞并且不接受任何新的输入连接 当我发送任何内容或退出telnet accept stops阻塞时,我可以处理发送的数据并开始接受新的输入连接 main() {    socket = bind_listen();    while(1) {        user_socket = accept(socket);        ssl = SSL_ne

我正在编程一个TCP/IP Socketserver

我的问题是,当我(例如)telnet我的服务器并且不发送任何数据时,我的accept调用阻塞并且不接受任何新的输入连接

当我发送任何内容或退出telnet accept stops阻塞时,我可以处理发送的数据并开始接受新的输入连接

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()和处理数据。
有什么想法吗?谢谢

您可以使用多路复用器,如select或poll系列

这将告诉您何时可以运行accept w/out被阻止

如果您不知道如何使用多路复用器,我认为select是最简单的解决方案:


这也将避免诸如阻塞读/写之类的坏情况。

您可以使用多路复用器,如select或poll系列

这将告诉您何时可以运行accept w/out被阻止

如果您不知道如何使用多路复用器,我认为select是最简单的解决方案:


这还可以避免诸如阻塞读/写之类的坏情况。

这是因为您的程序是单线程。在第一步中,它等待连接,然后,当连接建立时,它等待输入。

您有几个选项可以让它等待几个连接并全部接受它们:线程、选择和fcntl。

这是因为您的程序是一个单线程。在第一步中,它等待连接,然后,当连接建立时,它等待输入。

您有几个选项可以让它等待几个连接并全部接受它们:线程、选择和fcntl。

首先,您应该轮询侦听文件描述符(使用
Select
poll
epoll
/
kqueue
),并且仅在准备读取时调用
accept

其次,更具体地说,如果要使用边缘触发的
epoll
,则需要首先将套接字设置为非阻塞模式。然后,当您被告知它已准备好读取时,您需要在循环中调用
accept
,直到返回
-1
,并出现错误
EAGAIN
eWoldBlock
——可能有多个连接请求同时等待,并且边缘触发的轮询只会在状态更改时提醒您,因此您需要清空套接字


以一种非常非常幼稚的方式,您还可以取消轮询,只使用非阻塞套接字,无论是在忙循环中还是在一种睡眠循环中。但这完全是浪费,与适当的
epoll
/
kqueue
解决方案(或您的平台提供的任何轮询机制)相比,这不会给您带来任何好处。

首先,您应该轮询侦听文件描述符(使用
select
poll
epoll
//kqueue)只有当它准备好阅读时,才调用
accept

其次,更具体地说,如果要使用边缘触发的
epoll
,则需要首先将套接字设置为非阻塞模式。然后,当您被告知它已准备好读取时,您需要在循环中调用
accept
,直到返回
-1
,并出现错误
EAGAIN
eWoldBlock
——可能有多个连接请求同时等待,并且边缘触发的轮询只会在状态更改时提醒您,因此您需要清空套接字


以一种非常非常幼稚的方式,您还可以取消轮询,只使用非阻塞套接字,无论是在忙循环中还是在一种睡眠循环中。但这完全是浪费,与适当的
epoll
/
kqueue
解决方案(或您的平台提供的任何轮询机制)相比,这不会给您带来任何好处。

显示您的代码,最好是显示问题的最小可编译示例。没有提供足够的详细信息,但听起来好像你没有使用非阻塞套接字。(在POSIX上这意味着
fcntl
设置
O_NONBLOCK
,在Windows上这意味着涉及
ioctlsocket
,在这两种情况下都意味着处理所有套接字调用上的
EAGAIN
/
ewoodblock
错误。)我试图添加O_NONBLOCK,但没有解决我的问题。@nos epoll_ctl()这绝对不是问题所在。它挂起在accept()调用中。不太清楚问题出在哪里。尝试重新表述您的描述。显示您的代码,最好是显示问题的最小可编译示例。没有提供足够的详细信息,但听起来好像您没有使用非阻塞套接字。(在POSIX上这意味着
fcntl
设置
O_NONBLOCK
,在Windows上这意味着涉及
ioctlsocket
,在这两种情况下都意味着处理所有套接字调用上的
EAGAIN
/
ewoodblock
错误。)我试图添加O_NONBLOCK,但没有解决我的问题。@nos epoll_ctl()这绝对不是问题所在。它挂起在accept()调用中。不太清楚问题出在哪里。请尝试重新表述您的描述。所以我需要先调用select或epoll,然后等待套接字上的事件?当有一个事件我必须接受()?所以我需要先调用select或epoll,然后等待套接字上的事件?当发生我必须接受的事件时()?