[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
HasPendingData
返回true,并显示待处理的大小为15个字节。 Recv
给我消息[MYHEADER]world
。
HasPendingData
返回false.
optionb.
HasPendingData
Recv
给我消息[MYHEADER]hello[MYHEADER]world
。
HasPendingData
任何洞察力都受到赞赏。谢谢!
send()
和sendto()
recv()
recvfrom()
读一个整个数据报。 如果您的缓冲区太小而无法接收给定的数据报,您将获得一个错误,如果您未指定
WSAEMSGSIZE
flag。
MSG_PEEK
告诉您套接字接收缓冲区中的原始字节总数,而不是数据报数量或这些数据报的大小。 这在文献:
中清楚地说明了这一点
-fionRead用于确定可以从套接字读取网络输入缓冲区中的数据待处理量。 ARGP参数指向一个无符号的长度值,其中ioctlsocket存储结果。 FionRead返回可以在单个调用中读取的数据量,该数据可能与插座上排队的数据总数不同。如果是面向消息的(例如,类型sock_dgram),FionRead仍然返回网络缓冲区中未决数据的量写在发送或发送函数调用中。 如果您需要检查下一个数据报的大小,请使用
FIONREAD
标志调用recv()
或
recvfrom()
。 确定数据报的实际大小后,您可以在没有标志的情况下读取它,从而将其从套接字缓冲区中删除。 否则,只需分配足够大的缓冲区,以容纳您将收到的最大数据报,甚至只有65535,这是UDP支持的最大尺寸。