俺初步定的是:
{   type MsgRecord=packed record  {加packed的作用是什么,有数据压缩功能吗?}        
         Messagetyp:intger;  数据类型:如1--聊天消息 ;2--其它.....
         UGUID:string;       唯一标识ID
         MsgSize:integer ;   消息的长度,检测是不是与MsgContent的大小一致.(可略)
         MsgContent:????   这里用什么类型好?? 要解决:大聊天内容的问题及网络传输的问题().
    end;
   如何用IdUDPServer接收并转换成这个数据记录格式,因为是UDP方式的,如何考虑丢包等问题呢?怎样是此记录的数据大小在网络传输中最小而发送的内容最大化??请各大虾指点迷津...
   哪位哥哥有这方面的源码?贴来鉴赏鉴赏...

解决方案 »

  1.   


    type _RecvBuf = packed record
          S: byte;
          L0: byte;
          L1: byte;
          L2: byte;
     end;
    有人喜欢用byte,实际传输的大小是不是要精简一些?如何使用及与string int类型的转换???跪求大虾们指点啊.....
      

  2.   

    MsgContent 就用string吧
    控制聊天室提交的字符数吧,很多聊天的都有限制丢包,就不知道了,
      

  3.   

    多谢党员大虾.
    但是string类型好像是明文的呀.发的是字符的话,什么都可见.不知word 这些可不可以拿来用??困惑.
      

  4.   

    packed 就是该几个字节就几个字节,不对齐。
    最好不要用string,用定长的字符数组array[0..99] of char
      

  5.   

    感谢大家~~~~~~~~~~~~~
    to nyf1220(我是党员--不过听说最近风声紧,打算换名字) 大虾:
       主要是用包捕获软件来看,全部可见,俺观察了一下QQ和其它聊天软件,内容是不可阅读的,因此奇怪它们用的是什么数据格式.
    to bobshen369(迷糊) 
     您的意思是加了packed,每次发的Record的长度都可能不是一样?? 用定长数组的话,假设输入的内容长度超出上限怎么办?还是应该在发之前禁止?
     再次感谢~~~~~~~
      

  6.   

    如果你要通过网络发送结构的话,里面的字段不能用string类型,因为string的内存是另外分配的,发送的时候不会一起被发送
    可以用string[n]类型,只是长度有限制,不能超过255
    至于MsgContent,由于可能传递比较大的内容,而且内容的数据类型可能不同
    我常用的方法是:type 
      MsgRecord=packed record    
             Messagetyp:intger;  //数据类型:如1--聊天消息 ;2--其它.....
             UGUID:string[40];   //存放GUID应该够了
             MsgSize:integer ;   //消息的长度,包括MsgContent
             MsgContent:integer; //只是用来指示MsgContent的起始地址
      end;var
      Pkg: ^MsgRecord;
      Cnt: ^TContent; // 可以是任意类型的消息内容
    begin
      GetMem(Pkg, sizeof(MsgRecord)+sizeof(TContent));  //设置消息头
      . . .
      Pkg.MsgSize := sizeof(MsgRecord)+sizeof(TContent);
      Cnt := @Pkg.MsgContent;
      
      //给MsgContent赋值
      Cnt.xxx := xxxxx;
      Cnt.yyy := yyyy;  //发送
      Socket.Send(Pkg^, Pkg.MsgSize);  //记得释放
      FreeMem(Pkg);
    end;  
      

  7.   

    to bomdy() 
    嗯,这个方法可以用来传输不同类型的数据,比如传[上下线信号,传文件等],好好好,厉害~~~~~~~~~~~~~
    非常感谢,令小生茅塞顿开,拔云见日,不过那个TContent能不能给点定义范例?现在是怎末样使输入的文本比较愉快地发出去..
      

  8.   

    现在发现一个问题:
     如何接收不同类型的Record呢?定义的结构如下:
      {数据头}
      type DataHead=packed record
            MsgType:integer;  //判断消息的类型
            DataBodySize:byte;  //数据段的长度
       end;
       {聊天内容}
    type  TChatMsg=packed record
             Account:string;  //发送者ID
             TGUID:string;    //标识ID
             MsgContent:array [0..MAXLEN-1] of char;  //消息内容
    end;
      {登录结构}
      type LogonData=packed record
            UserID:string;
            PWD:string;
            Reserve:string;
      end;Procedure UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
    var Header:DataHead;
        RBuff:array of byte;
        thisLogonData:LogonData;
    Begin
       adata.ReadBuffer(_UDPHead,sizeof(_UDPHead) )     
        MsgType:=_UDPHead.MsgType ;
       if Msgtype=0 then exit;
       case  MsgType of
            LogonSign:    //登录
           begin
               Adata.ReadBuffer(_thisLogonData,sizeof(_thisLogonData));
              showmessage( thisLogonData.Account) //这里要出错,好像没法正确读取LogonData结构来,请大虾们帮忙解决;
           end;
          
       end;
    end;
      

  9.   

    Adata.ReadBuffer(thisLogonData^,sizeof(LogonData));
    showmessage( thisLogonData.Account)
      

  10.   

    不要用string来定义字段,用string[n],0<n<256
      

  11.   


    请问大虾们:String[20] 和 array[0..20] of char 有什么大的区别特点,如在网络传输中,俺用的是结构体(Record),怎么看到的都是明文啊,有什么格式能让字符内容不可读吗?多谢...