用TCP/IP协议进行通讯时,A向B发送一组长度为100字节的完整数据,为保证能全部发送出去,采用循环发送的方法BOOL   MySend(...) 

int   nMax   =100 
char Buff[nMax];
char *ptr=Buff;
...
...
while(nMax   >   0)     

   int  nLen = send(sock,ptr,nMax,0); 
   if(nLen   <   0)   
      return  false; 
   nMax -=nLen; 
   ptr += nLen ;

return   ture; 
} 加入第一次调用send返回值nLen=80;说明向系统缓冲区拷贝了80个字节的数据,当第二次调用send时如果返回SOCKET_ERROR,说明发送失败了,可能网络中断或是其他原因引起的。则100个字节中剩余的20个字节没有被发送出去。因为这100个字节的数据才是一组完整的有效数据,那剩余的20个字节的数据岂不是发不出去了。
像这样的问题该怎么解决呢?

解决方案 »

  1.   

    每回第二次都返回SOCKET_ERROR吗?
      

  2.   

    一般的解决方案就是用crc校验来尽量保证数据的正确性。
      

  3.   

     tcp协议自己就保证了数据完整性的!
     你发送出去提示 Send_ERROR 证明是你的程序问题吧!
      

  4.   

    像我这个例子,如果数据协议规定如下:数据长度字节     54H     数据1     数据n       效验和 具体解释如下: 数据长度字节:为数据长度字节后面的所有数据长度。 
    54H:为指令 
    数据n: 
          ... 
    校验和: 
          ... 接收方接收到“数据长度字节”后,就知道这组数据的总长度了,比如说99,然后他开始接收99个字节,可是我在发送时因为出现了我上面提到的问题,所以实际上我只发送了80个字节的数据,而对方还按照100个字节接收,这就错误了。所以我想,要想保证数据接收方能接收到正确的数据,首先我发送时就得保证每次发送的数据都是完整的。如果出现上面的情况,因为已经有80个字节发送出去了,所以当连接恢复后,我必须得想办法把包中剩余的20个字节给发送出去,以便接收方能接收到完整的100个字节的数据。只是我不知道该怎么做才能实现。以上是我的理解,不知对不对,请高手给参谋一下,多谢。
      

  5.   

    tcp协议自己就保证了数据完整性的! 
      你发送出去提示   Send_ERROR   证明是你的程序问题吧!
    ////我有点明白了。对于函数int send(SOCKET s,const char FAR *buf,int len,int flags);如果我指定了len大小为100,虽然我分多次调用,但还是只有100个字节大小的数据全部拷贝成功,TCP才会认为这是一次成功的拷贝。如果只拷贝80个字节就出错了,则TCP会将那80个字节的无效数据丢弃,以维护数据的完整性。我这样解释对吗?
      

  6.   

    send len 100 个字节
    tcp 会保证这100个字节,发送成功 它才会返回成功!
      

  7.   

    包头   ¦   包长   ¦   数据   ¦   效益 对方做一个大缓冲,来包就先收下 
    先取包头做判断   再取包长   再根据包长   取数据 如果   检查缓冲里面的数据   不够包长,就等待继续收包! 
    超时   就   抛弃缓冲   请求再发///对方在收到“包长”字节前,并不知道数据长度到底多长,那开始设置的大缓冲的长度设置多大为宜?
    比如说我设置缓冲为1024个字节,可实际数据包长为300个字节,那我拆包时是不是先拆前300个,然后再判断第301个是不是包头,以此类推进行操作?
    还有就是“超时   就   抛弃缓冲   请求再发”这个怎么操作,是不是只要我设置了接收超时而每收到数据包后,TCP会自动请求再发,还是我自己需要做些编码工作?
      

  8.   

    send 函数 下层 做了重发机制的! 
    如果你发 100字节 第一次只收 80 字节  很正常 再重复收包就行了!具体参考 tcp协议! 
      

  9.   

    比如说我设置缓冲为1024个字节,可实际数据包长为300个字节,那我拆包时是不是先拆前300个,然后再判断第301个是不是包头,以此类推进行操作? 
    ------------
    就是这个意思!还有就是“超时       就       抛弃缓冲       请求再发”这个怎么操作,是不是只要我设置了接收超时而每收到数据包后,TCP会自动请求再发,还是我自己需要做些编码工作?
    -----------------------------------
    要你自己做了! tcp是不会掉包的! 如果出现包不全了 一般是数据处理出现的问题了! 跟tcp协议本身没关系
      

  10.   

    还有就是“超时       就       抛弃缓冲       请求再发”这个怎么操作,是不是只要我设置了接收超时而每收到数据包后,TCP会自动请求再发,还是我自己需要做些编码工作?tcp会帮你做,你只需要关心send()  返回的字节数是不是你要发的文件大小就够了.
      

  11.   

    send   len   100   个字节 
    tcp   会保证这100个字节,发送成功   它才会返回成功! 
    ////那就是说我也可以按照下面这样理解了?如果我指定了len大小为100,虽然我分多次调用,但还是只有100个字节大小的数据全部拷贝成功,TCP才会认为这是一次成功的拷贝。如果只拷贝80个字节就出错了,则TCP会将那80个字节的无效数据丢弃,以维护数据的完整性。 
      

  12.   

    int nSend = send(socket,buffer,发送的大小,0);
    是个阻塞的函数,直到发送完 
    如果nSend == 发送的大小 ,  send 完成,  
    如果nSend < 发送的大小  socket异常, 
      

  13.   

    nSend <=0  socket异常 ,还有注意检查tcp链路,比如网线拔掉,tcp会仍然发送成功,但对方接收不到
      

  14.   

    如果nSend   <   发送的大小     socket异常,   
    ///
    我现在想知道的就是这种情况下,已经发送出去的nSend长度的数据是不是会一直保存在系统缓冲区中?   
      

  15.   

    这个你不用管,tcp链路会帮你解决的,你也不必要去考虑.