do udp插座将收到的数据划分为不同的消息,或者recv一次读取了尽可能多的数据?

问题描述 投票:0回答:1
LLETSADE我有一个发件人应用程序和一个通过UDP通信的接收器应用程序。 首先,在发件人应用程序中,我以两个单独的调用发送了一些数据。首先,我发送这15个字节:

[MYHEADER]hello

...然后,此后立即发送15个字节:

[MYHEADER]world

现在,在接收器应用程序中,我在同一端口上聆听,其插件绑定到同一地址。假设自上次检查接收器插座以来,这两条消息都已经到达(并按照相同的顺序)。

there是一些伪代码,它显示了我如何轮询每个帧传入数据的插座:

uint32 PendingSize; while (Socket->HasPendingData(PendingSize)) { uint32 BytesRead; uint8 MessageData[kMaxMessageSize]; if (Socket->Recv(MessageData, kMaxMessageSize, BytesRead)) { // Do stuff here // Will BytesRead be equal to PendingSize? } }

HasPendingData

ioctlsocket

FIONREAD

呼叫
PendingSize
,返回数据是否在接收缓冲区中等待,并填充字节数量的数量。 
Recv
调用
recv
将这些数据读为我可以阅读的缓冲区。如果它返回真实,那么我会回复我收到的数据。

在这里是我的问题。以下哪些情况准确反映了这种情况下会发生什么?
eptionA.


HasPendingData

返回true,并显示待处理的大小为15个字节。 Recv给我消息

[MYHEADER]hello
  1. HasPendingData
    返回true,并显示待处理的大小为15个字节。
    Recv
    给我消息
    [MYHEADER]world
  2. HasPendingData
    返回false.
    optionb.
  3. HasPendingData
  4. 返回true,并显示待处理的大小为30个字节。
Recv

给我消息[MYHEADER]hello[MYHEADER]world

    HasPendingData
  1. 返回false.
    
    
    
    任何洞察力都受到赞赏。谢谢!
    	
  2. UDP数据报是个体和独立的。
  3. send()
  4. sendto()
每次发送一个新的数据报。

recv()
c++ network-programming udp winsock
1个回答
4
投票
recvfrom()

读一个整个数据报。 如果您的缓冲区太小而无法接收给定的数据报,您将获得一个错误,如果您未指定

WSAEMSGSIZE

flag。

MSG_PEEK
告诉您套接字接收缓冲区中的原始字节总数,而不是数据报数量或这些数据报的大小。  这在
文献

中清楚地说明了这一点

 -fionRead
用于确定可以从套接字读取网络输入缓冲区中的数据待处理量。 ARGP参数指向一个无符号的长度值,其中ioctlsocket存储结果。 FionRead返回可以在单个调用中读取的数据量,该数据可能与插座上排队的数据总数不同。 
如果是面向消息的(例如,类型sock_dgram),FionRead仍然返回网络缓冲区中未决数据的量写在发送或发送函数调用中。
如果您需要检查下一个数据报的大小,请使用
FIONREAD
标志调用

recv()

recvfrom()
。 确定数据报的实际大小后,您可以在没有标志的情况下读取它,从而将其从套接字缓冲区中删除。 否则,只需分配足够大的缓冲区,以容纳您将收到的最大数据报,甚至只有65535,这是UDP支持的最大尺寸。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.