| 发表于:2008-01-15 12:03:5327楼 得分:0 |
楼主的态度有问题,请将注意力放在解决问题上面,大家都是冲着帮你解决问题的态度来的, --------------------------- 首先基础概念就有问题, 象这样的定义,不明白你怎么能传递的对??? - delphi(pascal) code
type
txtdata=record
cmd:string;
s:string;
end;
xt:txtdata;
idudpserver1.sendbuffer(serverip,1001,xt,sizeof(xt));
string根本上来说只是一个指针,一个指针是4 个字节长度,所以你的 sizeof(xt)在32位的计算机上永远都是8 sendbuffer 只是传递一个连接的内存块,不管你里面保存的是什么,当然要给定的是起始的位置和传递的字节数. string 是delphi 自己定义的数据类型,而socket通信都是接字节来传递的,所以要用socket最好用字符串数组 如果你的接受端不是delphi开发的,最好在定义结构的时候加上pack record 用结构体来保存要传递的数据只是方便你赋值操作罢了,对于一些变长的传递会不好操作.最好的办法是用一个对象封装, - delphi(pascal) code
txtdata=record
private
fid:string;
ftitle:string;
public
function getdata(var ap:pointer):integer;
published
property id:string read fid write fid;
property title:string read ftitle write ftitle;
end;
//得到值的指针和长度,注意,用完后要释放ap
function txtdata.getdata(var ap: pointer): integer;
var
acmd:string;
astr:string;
pint:pinteger;
len:integer;
xd:txtdata;
begin
len:=length(fid)+length(ftitle)+sizeof(integer)*3;
ap:=getmemory(len);
pint:=ap;
pint^:=len; //保存总长度
pint:=pointer(integer(pint)+sizeof(integer));
pint^:=length(fid); //保存第一个字符串长度
pint:=pointer(integer(pint)+sizeof(integer));
copymemory(pint,@fid[1],length(fid));//保存第一个字符串内容
pint:=pointer(integer(pint)+length(fid));
pint^:=length(ftitle); //保存第二个字符串长度
pint:=pointer(integer(pint)+sizeof(integer));
copymemory(pint,@ftitle[1],length(ftitle));//保存第二个字符串内容
// freememory(ap);
result:=len;
end;
//从收到的值中恢复
procedure txtdata.setdata(const ap: pointer; len: integer);
var
pint:pinteger;
i:integer;
xd:txtdata;
begin
pint:=ap;
// len:=integer(pint);
copymemory(@xd,ap,len);
i:=pinteger(pint)^;//得到总长度
pint:=pointer(integer(pint)+sizeof(integer));
i:=pinteger(pint)^;//得到第一个字符串长度
setlength(fid,i);
pint:=pointer(integer(pint)+sizeof(integer));
copymemory(@fid[1],pint,length(fid));//得到第一个字符串内容
pint:=pointer(integer(pint)+length(fid));
i:=pinteger(pint)^;
setlength(ftitle,i);//得到第二个字符串长度
pint:=pointer(integer(pint)+sizeof(integer));
copymemory(@ftitle[1],pint,length(ftitle));//得到第二个字符串内容
end;
| | |
|