首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

socket如何接收记录型数据

2013-06-25 
socket怎么接收记录型数据type TUser recordName: string[16]sex:string[2]age:integerendvaruser:T

socket怎么接收记录型数据
type TUser = record
     Name: string[16];
     sex:string[2];
     age:integer;
  end;

var
  user:TUser;
ClientSocket向ServerSocket发送socket.sendbuf(user,sizeof(user));

ServerSocket怎么接收这个记录型数据呢??

socket
[解决办法]
type TUser =Packed record
      Name: string[16];
      sex:string[2];
      age:integer;
   end;
Packed不能少,不然Record内存不是连续的
socket.sendbuf(buf,sizeof(user));
不管接还是发送 都是用一个buf:array of byte;
你要做的是将user写入buf 和从buf读出user
[解决办法]
 Name: string[16];
     sex:string[2];
     age:integer;

改为
  name:array[1..16]of char;
  sex :array[1..2]of char;
  age:integer;

这样内存就连续了,和传字符串没什么区别,就是前16为name,然后2位为sex,最后4位为整数。
[解决办法]
1,用Packed的目的是让分配内存以1字节为单位,不会的话Delphi将按一次4个字节的方式申请内存,不足4字节变量也会占4字节,就会造成不连续
2,string[]这个是可以用的,长度固定,与:array[]of char个我一样的效果。但string类型存入Record只是一个占4字节指针,因此不能用
3,用sendbuf和receivebuf  我来讲一下怎和把Record变成buf及buf变成record,代码如下


procedure TForm1.Button1Click(Sender: TObject);
type
  Rec=packed record
    a:Integer;
    b:string[5];
  end;
var
  a:Rec;//要传入的Record
  b:Rec;//接收的Record
  buf:array [0..9] of Byte;
begin
  a.a:=3;
  a.b:='你好吧';
  //将a写入buf
  Move(a,buf,10);

  //将buf读入b
  Move(buf,b,10);
  ShowMessage(IntToStr(b.a)+b.b);
end;


[解决办法]
buf:array [0..9] of Byte; 
就是字节流啊,不是什么第三方容器
Tclientsocket和Tserversocket通讯都是转成流来发送呢

我上面的代码有一点省略,意思是指
把记录a转成bufA,然后Tclientsocket发送,再通过Tserversocket接收到bufB,再把bufB转成记录b
这样你才能知道传输的内容啊  

热点排行