我现在想用一对socket传送两种数据包,一种为小数据包,一种为大的文件数据包。
小数据包比较频繁,要求实时强,大文件数据包有分包再组合成文件。有可能两种包同时交叉传送。现在问题是在服务器端怎样识别两种不同的包,大数据又怎样组合。不知大家有没有好的方法与见意。

解决方案 »

  1.   

    定义报文类型。   cmdSmallPacket=10001;
       cmdLargePacket=10002;
    报文发送的时候:
       类型,报文长度,报文内容 的结构。这样服务器就能够解析了。
      

  2.   

    我两个包都定义成结构类型的。如:
    SamllPack=record
    ....
    end;
    LargePack=record
    ....
    end;
    SmallPack我就直接发送,每次都是一个或多个完整的包,但LargePack要多个才组合成一个文件。
    我是想问在客户端怎样识别不同的包从而接收呢,跟居包的大小吗?但如果是两种包的最小公倍数呢?
    在服务器端接收时是用socket.ReceiveBuf(SamllPackbuf,sizeof(SmallPack))还是Socket.ReceiveBuff(LargePackbuf,Sizeof(LargePack))呢怎样正确判断。
      

  3.   

    TO;gzmhero(hihihi) 
    我是要先知道来的是什么报文,才能正确接收啊。现在就是要在接收包前就要判断是什么报文,然后用正确的包去接收。
    ------------------在线等待------------------------
      

  4.   

    客户端发送的时候,先发送类型,长度,再发送结构体。服务端接收的时候先Recieve 8个字节,就是报文类型和长度,按照类型和长度再接收后面的结构体。
      

  5.   

    smallPack不会分包合包,但LargePack是把一个文件分成几个包发送的,到了接收端组合,两种包都同时在传送,有可能在发送一个文件的第二个largePack时,这时又来了一个SmallPack,此时一个文件还没传送完。
      

  6.   

    在largePack包里再定义一个序号就行了。LargePack=record
        iNo:integer;///////标记是第几包
    ....
    end;
      

  7.   

    TO;gzmhero(hihihi) 
    我不知你所说的在服务器接收端是不是这样:
    while Socket.ReceiveLenth>0 do
    begin
      Socket.ReceiveBuf(flag,8);
      if flag=小包 then  
      begin
        Socket.ReceiveBuf(SmallPack,sizeof(SmallPack))
        .......  
      end 
      else begin
        Socket.ReceiveBuf(LargePack,Sizeof(LargePack));
        合包 .........
      end;
    end;
    我以前是只发送小包的,直接发送,没有发送前面的类型和长度的flag。如果是这样的话,那以前的也要多加一个类型和长度的flag
      

  8.   

    To: gzmhero(hihihi) 
    先发flag包有时会把flag包与后的数据包分开,操成后面的包无法判断,而丢包。我在internet上传文件,一大部分文件无法收到。在句域网上就好一点。
    --------------------加紧测试中..........................
      

  9.   


    type MsgHead=record
        MsgType:byte;//1,2分别对应两种不同的报结构类型
    end
    ...............UdpRead:
     Adata.ReadBuffer(MsgHead,SizeOf(MsgHead));
    if _MsgHead.MsgType=1 then
       Adata.ReadBuffer(_struct1Data,SizeOf(Struct1Data);
    else if _MsgHead.MsgType=2'  then
      Adata.ReadBuffer(_struct2Data,SizeOf(Struct2Data);
      

  10.   

    To hansland(甜甜果) :
      你用的是D7底下UDP的东西吧,是不是D5底下也有这样类似的东西啊。