读书人

关于使用Indy10 的TIdTCPClient传送结

发布时间: 2012-02-02 23:57:14 作者: rapoo

关于使用Indy10 的TIdTCPClient传送结构的问题。
使用TIdTCPClient向TIdTCPServer传送结构数据,请教如何才能把一个TSMSConnect结构的数据传到服务器端。本人不熟悉使用Indy10,求高手帮忙!!
TSMSHead = packed record
SequenceID : Integer;
CommandID : Integer;
TotalLength : Integer;
end;
PSMSHead = ^TSMSHead;

TSMSConnect = packed record
Head : TSMSHead;
UID : array[0..19] of char;
PWD : array[0..19] of char;
Version : Byte;
end;
PSMSConnect = ^TSMSConnect;

[解决办法]
idtcpclient.writebuffer( PSMSConnect^,sizeof( TSMSConnect ) );//应该是这样吧
[解决办法]
错在这句:CopyMemory(@P,@C,SizeOf(C));
应该是 CopyMemory(@P, @C[0], SizeOf(C));

以下是我的完整代码:

procedure TForm1.btn1Click(Sender: TObject);
var
pkt: TSMSConnect;
buf: TBytes;
begin
// 填写pkt
pkt.Head.SequenceID := 1000;
pkt.Head.CommandID := 119;
StrLCopy(pkt.UID, 'I love you ', SizeOf(pkt.UID));
// ...

// 准备缓冲区数据
SetLength(buf, SizeOf(TSMSConnect));
Move(pkt, buf[0], SizeOf(TSMSConnect));

tcpClient.Connect;
tcpClient.Socket.Write(buf);
tcpClient.Disconnect;
end;

procedure TForm1.tcpServerExecute(AContext: TIdContext);
var
pkt: PSMSConnect;
buf: TBytes;
begin
SetLength(buf, SizeOf(TSMSConnect));
AContext.Connection.Socket.ReadBytes(buf, SizeOf(TSMSConnect), False);

pkt := PSMSConnect(@buf[0]);
Assert(pkt.Head.SequenceID = 1000);

mmo1.Lines.Add(pkt.UID);
end;

读书人网 >.NET

热点推荐