gpt4 book ai didi

c++ - 选择在 Windows 7 上无法正常工作

转载 作者:行者123 更新时间:2023-11-28 03:25:25 25 4
gpt4 key购买 nike

全部:)

我有一些代码可以在 Linux 和 WinXP 上正常工作

int FlowTestIP::do_recvfrom()
{
int ret;
struct timeval timeout;// = {2, 0};
timeout.tv_sec = 2;
timeout.tv_usec = 0;

fd_set rfds;
while(running) {
FD_ZERO(&rfds);
FD_SET(m_socket, &rfds);
ret = select(m_socket + 1, &rfds, 0, 0, &timeout);
cout << "// select ret = " << ret << " (errno = " << errno << ")" << endl;
if (ret == -1 || ret == 0) {
if (!(ret == 0 && errno == 0))
cout << "select ret = " << ret << " (errno = " << errno << ")" << endl;
return ret;
}
if (FD_ISSET(m_socket, &rfds)) {
cout << WSAGetLastError() << endl;
break;
}
}
return recvfrom(m_socket, in_buf, mtu, 0, (struct sockaddr *)&si_other, (socklen_t *)&otherAddrSize);
}

但在 Windows 7 中,即使退出客户端应用程序,in 也会继续循环。错误的输出是

...
// select ret = 1 (errno = 0)
0
// select ret = 1 (errno = 0)
0
// select ret = 1 (errno = 0)
0
FTControlServerThread::run
FTControlServerThread::recieved
pkt->ft_tos = UCHAR_MAX
QFuture::waitForFinished()
client alive true
// select ret = 1 (errno = 0)
0
// select ret = 1 (errno = 0)
0
// select ret = 1 (errno = 0)
0

通常(在 WinXP 和 Linux 上)输出将是

...
// select ret = 1 (errno = 0)
0
// select ret = 1 (errno = 0)
0
// select ret = 1 (errno = 0)
0
FTControlServerThread::run
FTControlServerThread::recieved
pkt->ft_tos = UCHAR_MAX
QFuture::waitForFinished()
client alive true
QFuture::finished

这就是我所期待的。

有没有人遇到过这种不当行为?

提前致谢!

附言正如@JoachimPileborg 要求展示我如何调用此函数:

FlowTest::recv(char *payload, size_t size)  
{
...
while (running) {
len = do_recvfrom(); // it virtual method of class FlowTest
if (len == -1 || len == 0) {
return len;
}

if (running && !transport_recv_helper()) {
continue;
} else {
break;
}
}
...
}

recv 从服务器 GUI 调用

void FlowTestServer::runTest(FlowTestServerHelper handler)
{
...
if ((ret = server->recv(rcvdData, (size_t *)&size)) == -1 || ret == 0 || size == 0) {
if (server_busy == 0)
break;
cout << "can't receive data (size == " << size << "; ret = " << ret << ")" << endl;
continue;
}
...
}

最佳答案

首先:允许使用cout重置errno。它通常不会,但它可以,尤其是在必须设置语言环境的首次使用时。您需要将 errno 的值保存在临时变量中,或使用 fprintf 和 friend - 作为 C lib 函数 POSIX 控制其行为。

其次:在 Windows 中,您需要使用 WSAGetLastError() 而不是 errno

我建议你做一个宏 sock_errno 在 Linux/unix 上是 (errno) ,在 Windows 上是 (WSAGetLastError()) .这将使您能够以独立于平台的方式进行编码。

关于c++ - 选择在 Windows 7 上无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14196009/

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