gpt4 book ai didi

c++ - 套接字在非阻塞时不能接受连接?

转载 作者:行者123 更新时间:2023-11-30 04:26:14 25 4
gpt4 key购买 nike

编辑:弄乱了我对 accept 调用的伪编码,它现在反射(reflect)了我实际在做什么。

我有两个 socket 。我正在尝试在两者之间使用发送/接收。当监听套接字处于阻塞状态时,它可以看到连接并接收它。当它是非阻塞时,我会忙着等待(只是为了调试它)并且它超时,总是出现错误 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++ - 套接字在非阻塞时不能接受连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11674031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com