在TCP 下我可以在包头上加上数据包包的长度,然后就可以准确的接收改包。
但是在UDP下, 如果我先接包头(4个字节) 他就会提示WSAEMSGSIZE 错误,意思就是接收长度的缓冲区太小recvfrom(s,buf + off, 4, flags, from, fromlen);如果UDP 不能这样做的话, 那么他是怎么发送一个大包的?
我试过 我发10K 的数据, 他接的只有1K左右,剩下的难道就丢了?还是下N个包的组合? 

解决方案 »

  1.   

    在局域网下,你必须,申请一个10k的buff.在公网下,你根本发不出去。接收方啥也收不到。
      

  2.   

    直接申请一个大的buffer,一次recvfrom接收即可。
      

  3.   

    我是就是在公网的环境下 发现 我发10K 他只接收1K 这样。然后才改成包头是长度这样接包。
    然后在局域网内测试,发现WSAEMSGSIZE 这个错误我应该怎么做?才能保证我发多少, 他就接多少呢?(其他丢包情况,不考虑的情况下)
      

  4.   

    就算一个包200K  他发送也是一次性发完的吗?还是要发多次,然后我们根据sendto返回值,检查有没有发完?
      

  5.   

    修改下socket缓冲区大小试试,有接受缓冲区和发送缓冲区,都可以修改的
      

  6.   

    多次从socket读数据, 然后在接收端进行数据组合
      

  7.   

    从本质上理解:
    1、UDP是有边界的,你可以简单的认为他的单位是“个”。
    2、UDP包大小有上限,即64K。(MTU会根据情况进行分包,但你不用管这些)
    3、当你提供的接收Buf小于实际包大小时,你会收到WSAEMSGSIZE。意思就是说,你提供的容器太小,只能装下部分数据,装不下的那部分已经被扔掉了。所以,申请个大点儿的Buffer,传递给recvfrom函数就好了。
      

  8.   

    非常感谢~ 我的buff够大, 还需要组包吗?
      

  9.   

    UDP的分包和组包是对用户隐藏的。有分就有组,对应用层毫无影响。
    假设你发一个40K的包,如果能收到,一定是40K的包,不会被拆分。
      

  10.   

    WSAEMSGSIZE
    说明你使用recvfrom里投递的缓冲太小了
    把缓冲放大就行
    公网大于mtu也是可以传的
    只是网关路由设备会自动进行拆包和重新封包,
    你上层不用理会这些
    但是公网传输,一般不建议使用大UDP包,因为丢包的话,开销太大
      

  11.   

    问题没解决, 只能用UDT 试试了