UDP协议通讯不能保证数据一定到达和数据到达顺序,请问如何解决此问题,实现无错数据传输。
我听说过给数据加头编号,但头如何定义,发生错误后如何控制重传数据?

解决方案 »

  1.   

    可以检测发送是否成功来解决:这个采用一个winsock来发送UDP数据.给点提示
    var re,fd:integer
    fd:=socket(af_inet,sock_dgram,0);
    re:=sendto(fd,pcontent^,length(content),0,addr,sizeof(addr));
    if re=socket_error then
    begin
     errcode:=wsagetlasterror();
     freemem(pcontent);
     exit;
    end;
      

  2.   

    用UDP发送成功一定能接收到吗?
    而且还有接收数据重组的问题,因为数据到达的顺序和发送顺序可能不同
      

  3.   

    用UDP发送成功一定能接收到吗?
    而且还有接收数据重组的问题,因为数据到达的顺序和发送顺序可能不同
      

  4.   

    挺麻烦,要自己定义数据格式和数据包格式,分包发送,接收方重组包,发现丢包还要重发。我记得icq好像公开了它的数据包格式吧,记得在哪里见过的。你查查吧
      

  5.   

    在我写的一个网络程序中实现了UDP的可靠传输,确实比较麻烦,
    自定义报头,运用多线程,报头中含有顺序参数等!
      

  6.   

    《tcp/ip高级编程》一书中有专门的论述,我主要参照了上面的方法!
      

  7.   

    再数据包中加桢号,接收处判断

    用TCP/IP
      

  8.   

    To:xb_luotuo,
    《tcp/ip高级编程》有电子书吗,什么地方下载
    实现UDP的可靠传输你有参考的例程吗?To: kuangning
    我想用UDP,它的效率应该高些
      

  9.   

    将发送的数据将它checksum,我也是从书上看来,没试过。
    大概是这样:
    发送时,将数据的进行相加,作为数据包的一个CheckSumtype
      TyourData = record
        i_seq: Integer;
        i_cksum: LongInt;
        Data: Pointer;   //you data buffer;
      end;
    i_cksum := i_cksum + PWord(Data)^;
    Inc(Data, SizeOf(Word));接收时,检测Data是否等于它就行了。
    这是C的;
    USHORT checksum(USHORT *data; int size);
    {
       u_long cksum = 0;
       while size > 1{
         cksum += (USHORT *)data++;
         size -= sizeof(USHORT);
      }
      if (size)
        cksum += (UCHAR*)data;
      cksum := cksum >> 16 + cksum & 0xffff;
      cksum += cksum >> 16;
      return (USHORT)(~cksum);
    }
      

  10.   

    试一下工翻译:
    function ckecksum(Data: Pointer; nSize: Integer): WORD;
    var
      cksum: LongInt;
    begin
      cksum := 0;
      while nSize > 1 do
      begin
        Inc(cksum, PWORD(Data)^);
        Inc(Integer(Data), SizeOf(WORD));
        Dec(nSize, SizeOf(WORD));
      end;
      if nSize > 0 then
        Inc(cksum, PBYTE(Data)^);
      cksum := cksum shr 16 + cksum and $FFFF;
      Inc(cksum, cksum shr 16);
      Result := WORD(not cksum);
    end;
      

  11.   

    大哥,怎么麻烦为什么不用tcp(说句不好听的话是变态)?
    还有<tcp/tp高级编程这本书>这是一级棒,才35,去买一本吧
      

  12.   

    to xb_luotuo(luotuo)能给你的网络程式,研究一番么?
    [email protected]
    期待回音!