C 阻塞接受
我正在编程一个TCP/IP Socketserver 我的问题是,当我(例如)telnet我的服务器并且不发送任何数据时,我的accept调用阻塞并且不接受任何新的输入连接 当我发送任何内容或退出telnet accept stops阻塞时,我可以处理发送的数据并开始接受新的输入连接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
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,然后等待套接字上的事件?当发生我必须接受的事件时()?