我在理解recv()/ recvfrom()从非阻塞UDP套接字返回时遇到了问题.
更具体一点,与TCP相比(如果我错了,请纠正我):
阻塞套接字(TCP或UDP)将不会从recv()返回,直到缓冲区中有一些数据.这可以是一些字节数(TCP)或完整数据报(UDP).
非阻塞TCP套接字要么返回EWOULDBLOCK(linux)/ WSAEWOULDBLOCK(窗口),要么返回当前缓冲区中的字节.由于TCP数据是流,因此返回多少字节无关紧要.
现在的问题是:
编辑:
我对"数据报的一半"的意思是:如果我在套接字当前正在接收数据报时调用recv()会发生什么.在那一刻,缓冲区中有一些字节,但数据报尚未完成.
您的解释和评论表示赞赏.谢谢!
下面是我遇到套接字编程问题的代码片段.在选择调用之后,如果我没有在第9行上睡眠,在Windows XP上,第11行接收到1个字节(而不是从服务器发送4个字节作为整数),当我检查xmlSize时,它被设置为0.因为iResult是1,所以执行继续,并且在第15行第二次接收被调用xmlSize = 0,并且iResult被设置为0,之后因为iResult = 0连接被关闭.
但是在Windows 7上没有发生这种情况,程序很乐意读取4个字节并继续正常执行.然而在XP上,我睡了一觉(我刚刚做了这个)并且它有效,但为什么?
这段代码的缺陷是什么?
1 while(is_running())
2 {
3 FD_ZERO(&readfds);
4 FD_SET(server_socket, &readfds);
5 iResult = select(server_socket+1, &readfds, NULL, NULL, &tv);
6 if (!(iResult != SOCKET_ERROR && FD_ISSET(server_socket, &readfds) )) {
7 continue;
8 }
9 Sleep(500); // This Sleep is not required on Windows 7, but is required on 10 XP but WHY?
11 iResult = recv(server_socket, (char *)&xmlSize, sizeof(xmlSize), 0);
12 xmlSize = htonl(xmlSize);
13 if ( iResult > 0 ){ …Run Code Online (Sandbox Code Playgroud)