TCP或UDP会把不太长的包粘起来或把太长的包截断,现在我并不想这种情况发生,我想一次send就让socket发一个包,如何做到?

解决方案 »

  1.   

    简要回答一下:
    1 TCP是流式的,所以发送者send(...)一个包时, 接受端可能分成几个包接受; 
      也有可能发送者send(...)多个包时, 接受端合成为一个包接受. 主要根据
      网络上流量状况
    2 socket有两种操作方式, 一种是阻塞的,另一种是非阻塞. 
      假如是阻塞方式,应该这样接受
      int ret = 0;
      while(1)
      {
       ret = recv(...);
       if(ret<=0)
       {
         close(...);
         break;
       }
      }
      当ret=0时, 表示对方close(..) ,当ret<0时表示socket错误留下mail, 我发一个例程给你.
      

  2.   

    说的不一定对,在以太网里面,IP的数据包的大小是有限制的,不可能特别的大。如果太大,就要被分片,也就是IP分片。而且,如果数据经过路由器,IP数据包可能还会被分片。所以,我认为,你发送一些比较小的数据也可能会被分片,如果是较大的数据,那就是肯定的了。
      

  3.   

    tcp本来就是流式的, 哪来分片这个概念.至于ip包, 是会重新拆包与打包的.但这与上层无关.所以只要你在应用层定义包的格式, 接受与发送时协调一致即可.check your in-box of email
      

  4.   

    sorry,email is [email protected]