相关疑难解决方法(0)

C中的非阻塞udp套接字编程:我得到了什么?

我在理解recv()/ recvfrom()从非阻塞UDP套接字返回时遇到了问题.

更具体一点,与TCP相比(如果我错了,请纠正我):

  • 阻塞套接字(TCP或UDP)将不会从recv()返回,直到缓冲区中有一些数据.这可以是一些字节数(TCP)或完整数据报(UDP).

  • 非阻塞TCP套接字要么返回EWOULDBLOCK(linux)/ WSAEWOULDBLOCK(窗口),要么返回当前缓冲区中的字节.由于TCP数据是流,因此返回多少字节无关紧要.

现在的问题是:

  • 如果没有可用数据,非阻塞UDP套接字也会返回WOULDBLOCK(linux)/ WSAEWOULDBLOCK(windows).但是如果有数据可用,非阻塞UDP套接字只返回一些字节,这可能意味着你只得到一半数据报或UDP套接字总是返回完整的数据报吗?

编辑:

我对"数据报的一半"的意思是:如果我在套接字当前正在接收数据报时调用recv()会发生什么.在那一刻,缓冲区中有一些字节,但数据报尚未完成.

您的解释和评论表示赞赏.谢谢!

sockets udp tcp nonblocking blocking

8
推荐指数
1
解决办法
8654
查看次数

c ++套接字选择和接收问题

下面是我遇到套接字编程问题的代码片段.在选择调用之后,如果我没有在第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)

c++ sockets select recv

2
推荐指数
1
解决办法
3641
查看次数

标签 统计

sockets ×2

blocking ×1

c++ ×1

nonblocking ×1

recv ×1

select ×1

tcp ×1

udp ×1