选择在 Windows 7 上无法正常工作
select doesn't works correctly on Windows 7
All:)
我有一些在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:运行
FTControlServerThread:收到
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:运行
FTControlServerThread:收到
pkt->ft_tos = UCHAR_MAX
QFuture: waitForFinished ()
Client alive true
QFuture:完成了
这就是我所期待的。
有人遇到过这样的不当行为吗?
提前感谢!
注:@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;
}
}
...
}
和从服务器GUI调用recv
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;
}
...
}
first:允许使用cout
复位errno
。它通常不这样做,但它可以,特别是在第一次使用时,它必须设置区域设置。您需要将errno
的值保存在一个临时变量中,或者使用fprintf
及其朋友-作为C库函数POSIX控制其行为。
其次:在Windows中,您需要使用WSAGetLastError()
而不是errno
。
我建议你做一个宏sock_errno
,在Linux/unix上是(errno)
,在Windows上是(WSAGetLastError())
。这将使您能够以独立于平台的方式进行编码。
- 查看更多信息:http://msdn.microsoft.com/en-us/library/windows/desktop/ms737828(v=vs.85).aspx
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程