使用的套接字:udp
我有一个发送5000个字节的客户端和一个带有此代码的服务器:
客户代码:
cod = sendto (sFd, (void *) buffer, 5000, 0, (struct sockaddr *)
&soc, sizeof (struct sockaddr_in));
服务器代码:
//leghtBuffer = 5000
while (lenghtBuffer > 0 )
{
//I will insert a signal if pass more than 30 s ...
cod = recvfrom (sFd, buffer,256 , 0, (struct sockaddr *) &clientSoc, &lungimeSocket);
printf("Am received %d bytes " ,cod );
lenghtBuffer = lenghtBuffer - cod;
}
如何从中读取超过1次256字节(仍然使用Udp套接字)?
答案 0 :(得分:3)
UDP是基于消息(数据报)的传输协议,而不是基于TCP的流。每个sendto / recvfrom都按照完整的消息工作。
在发送端,每次调用sendto()都会创建一个指定大小和数据的数据报,在你的情况下是5000字节。
在接收端,每次调用recvfrom()都会复制接收缓冲区中的下一条消息。由于您的数据报是5000字节,但您只提供了256字节的缓冲区,因此您的数据报在被复制时会被截断为256字节。
recvfrom() OpenGroup规范澄清了这种情况下的行为:
对于基于消息的套接字(如SOCK_DGRAM和SOCK_SEQPACKET),必须在单个操作中读取整个消息。如果消息太长而无法容纳在提供的缓冲区中,并且在flags参数中未设置MSG_PEEK,则会丢弃多余的字节。
您希望将接收端的缓冲区增加到5000字节以占据整个数据报