本帖最后由 oyljerry 于 2014-11-20 12:25:34 编辑

解决方案 »

  1.   

    重复接受的时候,每接受完一次,清除接受buffer,然后再接受下一次。否则出现很多莫名其妙的错误
      

  2.   

    用string作为协议发送,这要多大啊...string是变长,为何不使用定长的数组呢?
      

  3.   

    用一个char数组,用另一个变量int length来指定数组长度
      

  4.   

    是粘包了?一般消息中都要携带数据长度的,TCP协议栈会根据当前的网络拥塞情况,将socket缓存中内容切成若干个包发过来的,接收端要循环接收的
      

  5.   

    可能粘包了。另外结构体不要用string。
      

  6.   

    呵呵,楼主真敢干啊。之所以能“偶然”发过去,是因为string内容的的长度 <=N 了,N在string结构内部。
      

  7.   

    有道理,但是为什么string内容的长度超过N了发过去就出错了呢?(测试了下,string长度超过15就会出错)?
      

  8.   

    呵呵,因为string是这么实现的,伪代码:class string 
    {
    ........
    private:
          size_t  length;
          char    buff[16];
          char   *ptr;
    };你看,这个string,他把内容存在buff或者ptr里,当内容不大于16(即 15 + 1 ,1是尾符0)时,他用buff存储,大于16时,就从堆里分配一块内存来存储。你发送了string对象,那么,如果内容长度不大于16,就可以将所有内容发过去,而大于16,你就只能发送一个“堆指针”过去了。堆指针只在你现在这个进程上有效,你把指针发送另外的进程,当然是wild pointer。
      

  9.   

    http://www.cnblogs.com/EdmundDwyane/p/3218838.htmlhttp://www.cnblogs.com/EdmundDwyane/p/3278641.htmlhttp://www.cnblogs.com/EdmundDwyane/p/3248297.html
    看明白这三篇文章,套接字你就都懂了,含demo 
      

  10.   

    字符串倒是发送了,但是字符串的长度呢?这些信息都没有,不要使用string来发送信息。可以在设一个字符的长度信息。