1.UDP数据包接收时,应用层的socket的接收buf如果小于到达包的大小,那buf中就只存储可接收的大小,这个包余下数据会被丢弃,再也收不到。
2.recvfrom返回0 ,并不代表对方关闭socket,对方可以发送0个长度空包
3.如果客户端没有先使用connect设置通信的对方地址
a。那必须使用sendto 、recvfrom
b。即使服务器没有开,sendto依然可以成功,但recvfrom会一直阻塞
如果先connect了
a。那除send、recv还可以用sendo、recvfrom。
b。如果服务器不可达,先send、sendto(这会成功),然后recv,recvrom会返回错误-1.(如果没有先send或者sendto,客户端就收不到服务器不可达的ICMP包,recv、recvfrom依然会一直阻塞)
udp的发送send、sendto不会因为服务器不可达,不能联通而报错,
之所以服务器不可达,客户端在没有先connect的情况下recv、recvfrom会一直阻塞是因为tcp/ip 协议栈不会将ICMP包返回给未连接的socket(虽然send.、sendto没有报错,但实际上这个socket并没有连接过)
void main()
{
int sock=socket(AF_INET,SOCK_DGRAM,0);
struct sockaddr_in serverAddr;
memset(&serverAddr,0,sizeof(serverAddr));
serverAddr.sin_port=htons(7899);
serverAddr.sin_family=AF_INET;
serverAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
connect(sock,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
int ret1,ret2;
//一定要先sendto,不然收不到icmp包,recv还是会阻塞
ret1=sendto(sock,"22",3,0,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
char a[10];
ret2=recvfrom(sock,a,10,0,NULL,NULL);
sprintf(a,"ret1=%d,ret2=%d:\n",ret1,ret2);
perror(a);
}