主要步骤
主线程:A
     1、数据处理
     2、通知发线程从队列中发送数据
发线程:(Client)B
     1、向上级发连接请求
     2、接收server发来的数据
     3、收到server发来的标记后,开始向server发数据
     4、向client发送标记,并结束这次通讯
收线程:(Server)C
     1、listen
     2、向client发送数据
     3、向client发送标记
简要流程
A1-A2-B1-C1-C2-B2-C3-B3-B4现在的问题发生在,一端向另一端发送数据后,另一端没有把数据全部接收回来。
为什么??
恳请各路大虾前来帮助!!!

解决方案 »

  1.   

    take the transfer failure into consideration in your program, ask for retransfer in case of failure.
      

  2.   

    TCP或UDP会把不太长的包粘起来或把太长的包截断
    有时是因为过快的发送方把缓慢的接受方淹没
    建议多建立几个socket连接,交替传输,然后粘起来.
    希望对你有所帮助.
      

  3.   

    1、发送的数据量大吗?很大就要小心了,用setsockopt适当加大缓冲区
    2、建议改成 
       发送标志->发送数据 
       否则有可能不知道到底是数据还是标志,特别是数据不确定,先发标志,可以在标志中包含数据大小等信息(通常理解为包头)
               
      

  4.   

    别说得那么可怕,TCP还是很稳定的。
      

  5.   

    说的不一定对:有时候即使你使用tcp协议,也可能收不到完整的数据。看看你的缓冲区,如果你发送的数据量很大,缓冲区会很快被填满的。
      

  6.   

    我們做這個程序的時候也發生了這樣的問題.一般說來發送的數據(用socket)不會太大.而且和網羅延時\阻塞等很有關係.我們後來採用的方法是在沒發送一個數據包就採用sleep(100)得延時處理.效果不錯..而且OK了.我估計你的就是應為數據過多..傳輸阻塞造成的..
    對於笑關鍵字用socket不錯,但對大得..我們現在打算用ftp..這樣快得多.
      

  7.   

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

  8.   

    一般用TCP来收数据都要加个结束符或在最开始指定传送的长度,否则收方怎么知道数据传完没有。
    有了定界符,你就可以用一个while循环来判断收完没有。
    例如在知道长度时:
    int nLeft = xxx;
    while(nLeft > = 0)
    {
    ret = recv(-, -, nLeft,-);
    if(ret == 0)
      break;
    nLeft -= ret;
    }这个长度可以在在发送数据之前先发送,所以接收方收到的头4个字节就是表示长度的整型
      

  9.   

    先前我用CSocket做程序,遇到同样的问题。有可能你的程序由两种情况导致出错。1、接收方在一次数据接收过程中调用两次recv(并带MSG_PEEK)。2、如果接收方按照一个结构体(自定义的包)来接收数据,可能你想等整个包到了才去接收,这需要保证接收缓冲区的大小大过你的包的大小。是否是在上述两点上出问题?查查!
      

  10.   

    最好发送时传个含有数据长度头,然后再用batizhou的办法
      

  11.   

    我跟你遇到了同样的问题,现在也正在研究
    http://www.csdn.net/expert/topic/829/829303.xml?temp=7.686794E-03
      

  12.   

    finalhunter(湛蓝) (  )的
    “有时是因为过快的发送方把缓慢的接受方淹没”这句话怎么理解
      

  13.   

    网络质量是主要原因,网卡设置有点牵强,另外,强烈建议使用Winsock,别用MFC封装的类。