下面是我在套接字编程方面遇到的代码片段。在之后选择调用,如果我没有在第9行上放置睡眠,在Windows XP上,第11行接收到1字节(而不是4字节从服务器发送为整数),当我检查xmlSize时,它被设置为0.因为iResult为1,执行继续,并在第15行第二次接收时调用xmlSize = 0,并且iResult设置为0,之后因为iResult = 0连接已关闭。C++套接字选择和接收问题
但是在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){
13 printf("Bytes received: %d, XML Size:%d", iResult, xmlSize);
14
15 iResult = recv(server_socket, xml, xmlSize, 0);
16 if (iResult > 0){
17 xml[xmlSize] = '\0';
18 printf("Bytes received: %d", iResult);
19 operation_connection(xml);
20 }
21 else if (iResult == 0){
22 printf(LL_INTERR, CLOG("Connection closed"));
23 break;
24 }
25 else{
26 printf("recv failed with error: %d", WSAGetLastError());
27 break;
28 }
29 }
30 else if (iResult == 0){
31 printf(LL_INTERR, CLOG("Connection closed"));
32 break;
33 }
34 else{
35 printf("recv failed with error: %d", WSAGetLastError());
36 break;
37 }
38 }
你知道,有没有保证,通过对recv的单个呼叫(接收)的字节数相匹配的数量通过一次调用send()发送的字节? – 2010-02-01 11:44:17
好吧,我现在看到了这个问题,但我不希望这样的行为,因为recv函数需要将字节数作为参数。那么你有什么建议? – whoi
该数字是最大字节数,因此请继续调用recv()并调整该数字,直到读取四个字节。 – 2010-02-01 12:10:32