在Server端和Client端定义了相同的Record结构,需要实现在Server端对Record变量进行更新,串行为Byte流,发送到Client端,再使用相同的Record结构进行还原。如何实现?示例如下:
type
TMsg =Record
id : Integer;
msg: String;
end;
SendMsg, ReceiveMsg :TMsg;//Server:procedure TForm1.Button1Click(Sender: TObject);
begin
SendMsg.id :=1;
SendMsg.msg :='怎样通过Socket传送Record?';
//怎样把SendMsg发送到Client?
//sckServer
//不能使用 sckServer.SendBuf(SendMsg,SizeOf(SendMsg));end;//Client:
procedure TfrmClient.sckClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
re :PChar;
sbuf :string;
relong :Integer;begin
re :=nil;
while socket.ReceiveLength >0 do
begin
//申请内存
re :=AllocMem(socket.ReceiveLength);
Try
relong :=socket.ReceiveLength;
Socket.ReceiveBuf(re^,Socket.ReceiveLength);
sbuf :=StrPas(re);
SetLength(sbuf,relong);
//怎样把sbuf还原为ReceiveMsg?
//
Finally
FreeMem(re);
end;
end;
end;还有,如何把一个Record的结构及其数据装入另一个Record的变量内?急等用!多谢。
type
TMsg =Record
id : Integer;
msg: String;
end;
SendMsg, ReceiveMsg :TMsg;//Server:procedure TForm1.Button1Click(Sender: TObject);
begin
SendMsg.id :=1;
SendMsg.msg :='怎样通过Socket传送Record?';
//怎样把SendMsg发送到Client?
//sckServer
//不能使用 sckServer.SendBuf(SendMsg,SizeOf(SendMsg));end;//Client:
procedure TfrmClient.sckClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
re :PChar;
sbuf :string;
relong :Integer;begin
re :=nil;
while socket.ReceiveLength >0 do
begin
//申请内存
re :=AllocMem(socket.ReceiveLength);
Try
relong :=socket.ReceiveLength;
Socket.ReceiveBuf(re^,Socket.ReceiveLength);
sbuf :=StrPas(re);
SetLength(sbuf,relong);
//怎样把sbuf还原为ReceiveMsg?
//
Finally
FreeMem(re);
end;
end;
end;还有,如何把一个Record的结构及其数据装入另一个Record的变量内?急等用!多谢。
解决方案 »
- 程序一启动就显示在托盘中,如何实现
- 我是用繁體win200S+D7做的報表,字體是用新細明體12號字。
- 怎么在listview中的单元格中画图?
- 怎样获取系统正在启动的服务信息?急!
- TADOconnection需不需要TSession建立多线程?
- 哪有好的DELPHI的书
- 请问form上控件的焦点转移事件是什么,如何获取?
- 同时添加数据到两个表中或、删除两个表中的数据!
- 在DELPHI如何用ADO连接MSSQL?
- 请问nfo是什么文件的后缀名????????
- [急,高分求教]服务器用WinSocket的Send函数,为什么客户端有时会收不到?
- 请教一个有关于在delphi 中写 sql 语句的问题 ????
var
P: PChar;
GetMem(P, 4 + Length(SendMsg.msg));
Move(SendMsg.id, P^, 4);
Move(SendMsg.msg[1], P[4], Length(SendMsg.msg));
sckServer.SendBuf(P^, 4 + Length(SendMsg.msg));
FreeMem(P);接收:
var
P: PChar;
RLen: Integer;
RLen := socket.ReceiveLength;
GetMem(P, RLen+1);
Socket.ReceiveBuf(P^, RLen);
P[RLen] := #0;
ReceiveMsg.id := PInteger(P)^;
ReceiveMsg.msg := PChar(P[4]);
FreeMem(P);
或者也可能需要将此record对象拷贝到缓冲区 再发送。。
接收端 相应的用类型强行转换就OK
的作法
大龙驹说的也是这么回事
SendMsg.ID:=htonl(1); 数值型需要转换成网络顺序字
SendMsg.MSG:='test';
UDPCLIENT.SENDBUFF(IP,PORT,SENDMSG,SIZEOF(SENDMSG));
}
Server Read:{
UDPServer.ReadBuff(RecvMsg,sizeof(RecvMsg));
TagID:=ntohl(RecvMsg.id)//将网络字节序转换成主机字节序
if TagID=1 then
ShowMessage(RecvMsg.Msg);
}
MyStream: TMemoryStream;
-------
MyStream := TMemoryStream.Create;
MyStream.WriteBuffer(SendMsg,SizeOf(SendFont));
try
try
sckServer.SendStream(MyStream);
finally
MyStream.Free;
end;
except
end;---------
var
MyStream: TMemoryStream;
begin
if NumberBytes=-1 then exit;
MyStream := TMemoryStream.Create;
try
Socket.ReadStream(MyStream);
MyStream.ReadBuffer(ReceiveMsg ,SizeOf(ReceiveFont));
finally
MyStream.Free;
end;