在TCP 下我可以在包头上加上数据包包的长度,然后就可以准确的接收改包。
但是在UDP下, 如果我先接包头(4个字节) 他就会提示WSAEMSGSIZE 错误,意思就是接收长度的缓冲区太小recvfrom(s,buf + off, 4, flags, from, fromlen);如果UDP 不能这样做的话, 那么他是怎么发送一个大包的?
我试过 我发10K 的数据, 他接的只有1K左右,剩下的难道就丢了?还是下N个包的组合?
但是在UDP下, 如果我先接包头(4个字节) 他就会提示WSAEMSGSIZE 错误,意思就是接收长度的缓冲区太小recvfrom(s,buf + off, 4, flags, from, fromlen);如果UDP 不能这样做的话, 那么他是怎么发送一个大包的?
我试过 我发10K 的数据, 他接的只有1K左右,剩下的难道就丢了?还是下N个包的组合?
然后在局域网内测试,发现WSAEMSGSIZE 这个错误我应该怎么做?才能保证我发多少, 他就接多少呢?(其他丢包情况,不考虑的情况下)
1、UDP是有边界的,你可以简单的认为他的单位是“个”。
2、UDP包大小有上限,即64K。(MTU会根据情况进行分包,但你不用管这些)
3、当你提供的接收Buf小于实际包大小时,你会收到WSAEMSGSIZE。意思就是说,你提供的容器太小,只能装下部分数据,装不下的那部分已经被扔掉了。所以,申请个大点儿的Buffer,传递给recvfrom函数就好了。
假设你发一个40K的包,如果能收到,一定是40K的包,不会被拆分。
说明你使用recvfrom里投递的缓冲太小了
把缓冲放大就行
公网大于mtu也是可以传的
只是网关路由设备会自动进行拆包和重新封包,
你上层不用理会这些
但是公网传输,一般不建议使用大UDP包,因为丢包的话,开销太大