连接调用了两次Send第一次内容为:123
第二次内容为:456Server端却只收到一个消息,内容为:123456,两次内容被连在一起了我想把们分成两次收(我现在的做法就是加了分隔符),很久以前的程序了,想改一下,你们都是如何解决的?

解决方案 »

  1.   

    没明白lz是如何接收的,按理说每次的socket是不同的,怎么会收到连在一起的。
    另外,发送的内容的长度是要实现知道的,这样你就可以知道接收发送多长的内容了
      

  2.   

    TCP呗
    要用自定义协议实现,你要自己知道这次需要接收的数据是多少协议协议协议.........
      

  3.   

    在TCP层最好定下自己的数据通信协议,根据发包的先后顺序来分别接收数据我感觉是很不可靠的 
    比如 
    struct OwnData{ 
    char Magic[3]; 
    char Data[32]; 
    }
    每次固定接收sizeof(OwnData)长度的数据,把自己的数据分离出来
    或者
    struct OwnData{
    char Magic[3];
    INT datalen;
    }
    在结构体后面跟上数据,每次固定接收sizeof(OwnData)长度的数据,再根据里面的datalen,接收后面所需要的数据
      

  4.   

    TCP流协议的特性,
    无法避免,
    自定义协议来解析流吧。
      

  5.   

    send了一次之后就Sleep一下再发下一条就不会一起收到了。
      

  6.   

    自己定义一个协议,分数据包头,尾。列如:
    0     1     2     3      4
    FF    10    10    10     FF
    FF就为你的数据包头和数据包尾。其次,你要知道你的数据长度,这样才能更好的接收,已免接收的数据有乱码出现。然后对接收的数据进行判断分析,就可以了
      

  7.   

          1、固定尺寸的消息      这是最简单但也是最昂贵的解决TCP消息问题的方案。就是要设计一种协议,永远以固定的长度传递消息,通过将所有的消息都设置为固定的尺寸,在从远程设备中接收到完整的消息时,TCP接收程序就能够了解发送的情况了。用这各地意味着必须将短消息加长,造成网络带宽资源的浪费。      2、使用消息尺寸信息
          
          这个方案允许使用可变长度的消息,惟一的不足就是接收端的远程设置必须了解每一个变长消息的确切长度。具体的方法是,在发送消息的时候,一起发送该消息的长度。那么在客户端接收的时候就能知道该消息的长度是多少,再来读取消息。      3、使用消息标记      该方案使用预先确定的一个字符(或多个字符)来指定消息的结束,通过这种方式来分隔不同的消息。但用这种方法必须对所接收到的每一个字符进行检查以便确定为结束标记,这对于大型消息来说,可能导致系统性能的下降