当前位置: 技术问答>linux和unix
linux下使用UDP建立网络连接问题
来源: 互联网 发布时间:2017-03-02
本文导语: 我能不能接收的时候只接收一个字节,也就是按字节接收呢,这样我就可以很容易的使用环形buff来处理接收到的数据。但是我在使用下面的函数(将128改为1),也就是每次只接收一个字符。 recvfrom(sock,recvBuffer,128,0,(s...
我能不能接收的时候只接收一个字节,也就是按字节接收呢,这样我就可以很容易的使用环形buff来处理接收到的数据。但是我在使用下面的函数(将128改为1),也就是每次只接收一个字符。
recvfrom(sock,recvBuffer,128,0,(struct sockaddr*)&toAddr,&addrLen)
操作的时候不能达到效果。只能收到数据的第一位,后面的数据好像就不在缓冲区中了。和串口的操作不一样呀,求高手指点一下。我的程序是
while(1)
{
recvfrom(sock_fd,&buff[count],1,0,(struct sockaddr*)&toAddr,&addrLen);
count=(count+1)%sizeof(buff);
}
recvfrom(sock,recvBuffer,128,0,(struct sockaddr*)&toAddr,&addrLen)
操作的时候不能达到效果。只能收到数据的第一位,后面的数据好像就不在缓冲区中了。和串口的操作不一样呀,求高手指点一下。我的程序是
while(1)
{
recvfrom(sock_fd,&buff[count],1,0,(struct sockaddr*)&toAddr,&addrLen);
count=(count+1)%sizeof(buff);
}
|
UDP是报文,不是字节流,TCP可以分批接受,UDP则按包接受,buffer不够就截断了再也读不到了,解释如下:
The recvfrom() function shall return the length of the message written to the buffer pointed to by the buffer argument. For message-based sockets, such
as SOCK_RAW, SOCK_DGRAM, and SOCK_SEQPACKET, the entire message shall be read in a single operation. If a message is too long to fit in the supplied
buffer, and MSG_PEEK is not set in the flags argument, the excess bytes shall be discarded. For stream-based sockets, such as SOCK_STREAM, message
boundaries shall be ignored. In this case, data shall be returned to the user as soon as it becomes available, and no data shall be discarded.
|
recvfrom是不行的,你还是想别的办法吧!就算不按字节接收,也可以使用环形buffer啊!只是偏移量由1变成了包的长度。