recvfrom()的一次调用只能返回一个UDP包。此种说法正确吗?

来源:百度知道 编辑:UC知道 时间:2024/06/22 03:17:47
1.recvfrom()的一次调用只能返回一个UDP包。此种说法正确吗?
2.send()和sendto()函数参数中的buffer有长度限制吗?
我对左稚幻回答的第二条有疑问:
我一个程序中,接收端一下发了1024*1024字节(一次send调用,设置buffer为1024*1024长,全填满了数据),接收端也用一次recv调用(提供了1024*1024长的缓冲区),能一次完全接收到发送的1024*1024个字节。为什么?
(我是在本机上测试的)

1.一次recvfrom()调用只能返回一个UDP数据包。
2.send()函数参数中的buffer长度有限制,此长度限制取决于底层协议的数据包最大长度,这个长度可以通过getsockopt函数设置SO_MAX_MSG_SIZE参数获得,如果发送的数据包超过底层协议的最大长度则返回WSAEMSGSIZE错误,同时不发送任何数据。
sendto()函数参数中的buffer长度也有限制,这个限制更明显一些,数据包的数据部分(不包括数据头)的长度不能超过512字节。
3.send()与sendto()正常返回均不能保证发送的数据被接受方正确接收,还要看缓冲区是否已满。当缓冲区为空时,recv与recvfrom均阻塞等待(除非设置为非阻塞,此时将返回WSAEWOULDBLOCK错误),因此只要socket正常连接,且缓冲区有数据内容,recv与recvfrom函数虽延迟但均能正常接收数据包。
希望我的回答你能满意:)

你好,我看了你添加的内容,我上面所说的最大长度512字节是指UDP数据包可以发送的的最大长度,针对的是sendto函数,而你测试时使用的则是TCP连接中的send函数,两者使用的协议不同,因此缓冲区的长度当然不同了,我使用getsockopt测试,得到我本机接受方的最大缓冲为8192字节,测试代码如下:
#include <stdio.h>
#include "winsock2.h"

void main() {

WSADATA wsaData;
SOCKET ListenSocket;
sockaddr_in service;

int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if( iResult != NO_ERROR )
printf("Error at WSAStartup\n");

ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP