套接字在非阻塞时无法接受连接?
Socket can't accept connections when non-blocking?
EDIT:我的accept调用的伪编码搞砸了,现在它反映了我实际在做什么。
我有两个插座。我正试图在两者之间使用send/recv。当监听套接字被阻塞时,它可以看到连接并接收它。当它不阻塞时,我放入一个繁忙的等待(只是为了调试它),它超时了,总是出现错误EWOULDBLOCK
。为什么侦听套接字在阻塞时无法看到它可以看到的连接?
代码大部分是在函数中分离的,但这里有一些我正在做的伪代码。
int listener = -2;
int connector = -2;
int acceptedSocket = -2;
getaddrinfo(port 27015, AI_PASSIVE) results loop for listener socket
{
if (listener socket() == 0)
{
if (listener bind() == 0)
if (listener listen() == 0)
break;
listener close(); //if unsuccessful
}
}
SetBlocking(listener, false);
getaddrinfo("localhost", port 27015) results loop for connector socket
{
if (connector socket() == 0)
{
if (connector connect() == 0)
break; //if connect successful
connector close(); //if unsuccessful
}
}
loop for 1 second
{
acceptedSocket = listener accept();
if (acceptedSocket > 0)
break; //if successful
}
这只是在最终结束超时循环之前输出一个EWOULDBLOCK
的巨大列表errno。如果我在每个循环交互中为接受的套接字输出文件描述符,那么它永远不会被分配文件描述符。
SetBlocking的代码如下:
int SetBlocking(int sockfd, bool blocking)
{
int nonblock = !blocking;
return ioctl(sockfd,
FIONBIO,
reinterpret_cast<int>(&nonblock));
}
如果我使用阻塞套接字,无论是通过调用SetBlocking(listener, true)
还是完全删除SetBlocking()
调用,连接都不会有问题。
另外,请注意,这种具有相同实现的连接在Windows、Linux和Solaris中都可以使用。
由于存在紧密的循环,您不会让操作系统完成您的请求。这就是VxWorks和其他版本的区别——你基本上抢占了你的内核。
请使用select(2)
或poll(2)
来等待连接。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- 从网链套接字请求连接设备的列表
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 如何在 2 台主机之间保持 UDP 套接字连接打开
- C++关闭套接字以启动新连接
- Opencv 不适用于套接字连接
- 使用单个套接字处理多个传入的 UDP 连接
- 连接UDP套接字,但仍然接收来自其他源的数据报
- C++通过套接字连接发送矢量
- 为什么我在蓝牙连接()上收到"java.io.IOException:读取失败,套接字可能关闭或超时,读取re
- boost1.62 在 docker 容器中重新连接后套接字损坏
- 尝试连接到 TCP 套接字 (Linux) 时连接被拒绝
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- 接受套接字,但m_socket.远程终结点引发 传输终结点未连接
- 提振.Asio:对每个连接/套接字使用“io_service”是件好事吗?