Linux,套接字,非阻塞连接
我想创建一个非阻塞连接。像这样:
socket.connect(); // returns immediately
为此,我使用了另一个线程,无限循环和Linux epoll。像这样(伪代码):
// in another thread
{
create_non_block_socket();
connect();
epoll_create();
epoll_ctl(); // subscribe socket to all events
while (true)
{
epoll_wait(); // wait a small time(~100 ms)
check_socket(); // check on EPOLLOUT event
}
}
如果我先运行服务器,然后运行客户端,那么一切正常。如果我先运行客户端,请稍等一会儿,再运行服务器,然后客户端将无法连接。
我究竟做错了什么?也许可以做不同的事情?
-
您应该使用以下步骤进行异步连接:
- 用创建套接字
socket(..., SOCK_NONBLOCK, ...)
- 开始与
connect(fd, ...)
- 如果返回值既不是也不
0
是EINPROGRESS
,则中止并返回错误 - 等待直到
fd
发出准备输出的信号 - 检查插座的状态
getsockopt(fd, SOL_SOCKET, SO_ERROR, ...)
- 做完了
没有循环-除非您要处理
EINTR
。如果首先启动客户端,则应该
ECONNREFUSED
在最后一步看到错误。如果发生这种情况,请关闭插座并从头开始。如果不查看更多详细信息,很难分辨代码出了什么问题。我想,您不会因
check_socket
操作错误而中止。 - 用创建套接字
-
Java中的非阻塞套接字写与阻塞套接字写
2021-01-30 关注 0 浏览80 1答案
-
Linux阻塞与非阻塞串行读取
2021-02-02 关注 0 浏览108 1答案
-
如何在非阻塞套接字上处理OpenSSL SSL_ERROR_WANT_READ / WANT_WRITE
2021-02-02 关注 0 浏览78 1答案
-
Linux非阻塞FIFO(按需记录)
2021-02-02 关注 0 浏览80 1答案
-
如何在Linux上查看/更改套接字连接超时?
2021-02-01 关注 0 浏览120 1答案
-
如果在超时之前没有收到任何数据,Python的socket.recv()对于非阻塞套接字返回什么?
2021-01-29 关注 0 浏览94 1答案
-
Linux中的内存分配是非阻塞的吗?
2021-02-01 关注 0 浏览87 1答案
-
ICMP套接字(Linux)
2021-02-02 关注 0 浏览102 1答案
-
如何获得无阻塞套接字connect()?
2021-01-29 关注 0 浏览83 1答案
-
doRedis在Ubuntu Linux,R和RStudio中出现奇怪的套接字连接错误
2021-02-01 关注 0 浏览201 1答案