Udp从读到结束

时间:2015-03-27 10:03:20

标签: c linux udp client-server

使用的套接字: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套接字)?

1 个答案:

答案 0 :(得分:3)

UDP是基于消息(数据报)的传输协议,而不是基于TCP的流。每个sendto / recvfrom都按照完整的消息工作。

在发送端,每次调用sendto()都会创建一个指定大小和数据的数据报,在你的情况下是5000字节。

在接收端,每次调用recvfrom()都会复制接收缓冲区中的下一条消息。由于您的数据报是5000字节,但您只提供了256字节的缓冲区,因此您的数据报在被复制时会被截断为256字节。

recvfrom() OpenGroup规范澄清了这种情况下的行为:

  

对于基于消息的套接字(如SOCK_DGRAM和SOCK_SEQPACKET),必须在单个操作中读取整个消息。如果消息太长而无法容纳在提供的缓冲区中,并且在flags参数中未设置MSG_PEEK,则会丢弃多余的字节。

您希望将接收端的缓冲区增加到5000字节以占据整个数据报