全部:)
我有一些代码正确适用于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中,即使退出客户端应用程序,也会继续循环。 输出错误
...
//选择ret = 1(errno = 0)
0
//选择ret = 1(errno = 0)
0
//选择ret = 1(errno = 0)
0
FTControlServerThread ::运行
FTControlServerThread ::收到
pkt-> ft_tos = UCHAR_MAX
QFuture :: waitForFinished()
客户活着真实 //选择ret = 1(errno = 0)
0
//选择ret = 1(errno = 0)
0
//选择ret = 1(errno = 0)
0
normaly(在WinXP和Linux上)输出将是
...
//选择ret = 1(errno = 0)
0
//选择ret = 1(errno = 0)
0
//选择ret = 1(errno = 0)
0
FTControlServerThread ::运行
FTControlServerThread ::收到
pkt-> ft_tos = UCHAR_MAX
QFuture :: waitForFinished()
客户活着真实 QFuture ::已完成
这就是我在等待它。
有没有人遇到这种不端行为?
提前致谢!
P.S。正如@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;
}
...
}
答案 0 :(得分:2)
首先:允许使用cout
重置errno
。它通常不会,但它可以,尤其是在必须设置语言环境时首次使用时。您需要将errno
的值保存在临时变量中,或者使用fprintf
和朋友 - 作为C lib函数,POSIX控制其行为。
其次:在Windows中,您需要使用WSAGetLastError()
而不是errno
。
我建议你制作一个宏sock_errno
,它在Linux / unix上为(errno)
,在Windows上为(WSAGetLastError())
。这将使您能够以独立于平台的方式进行编码。