关于使用Indy10 的TIdTCPClient传送结构的问题。

lfpsoft 2007-07-04 02:09:32
使用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;
...全文
929 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lfpsoft 2007-07-07
  • 打赏
  • 举报
回复
问题解决,散分
kumico 2007-07-05
  • 打赏
  • 举报
回复
用刚才的CopyMemory试了一下,发现参数写反了,应该是
CopyMemory(@C[0], @P, SizeOf(C));
kumico 2007-07-05
  • 打赏
  • 举报
回复
错在这句: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;
laowang2 2007-07-05
  • 打赏
  • 举报
回复
look
brightyang 2007-07-04
  • 打赏
  • 举报
回复
idtcpclient.writebuffer( PSMSConnect^,sizeof(TSMSConnect),true);
9是这样写,10没用过
lfpsoft 2007-07-04
  • 打赏
  • 举报
回复
改成这样还是出错。到底是什么问题呢?
var
C,D:TSMSConnect;
P:TBytes;

begin


C.Head.SequenceID := htonl(CreateID);
C.Head.CommandID := htonl(CMD_CONNECT);
C.Head.TotalLength := htonl(SizeOf(TSMSConnect));
strpcopy(C.UID,PChar('lfpsoft'));
strpcopy(C.PWD,PChar('lfpsoft'));
C.Version := htonl(SMS_VERSION_10);
CopyMemory(@P,@C,SizeOf(C));


DM.IdTCPClient.IOHandler.Write(P);
lfpsoft 2007-07-04
  • 打赏
  • 举报
回复
Project IndyClient.exe raised exception class EAccessViolation with 'Access violation at address 00405D50 in module 'IndyClient.exe'. Write of address 00FFFFF8'.
hongqi162 2007-07-04
  • 打赏
  • 举报
回复
什么错误?
lfpsoft 2007-07-04
  • 打赏
  • 举报
回复
??
lfpsoft 2007-07-04
  • 打赏
  • 举报
回复
这样调用第一次不出错,但再按一次就会出错了。不知道是什么原因。
lfpsoft 2007-07-04
  • 打赏
  • 举报
回复
var
C:TSMSConnect;
P:PIdBytes;

....
C.Head.SequenceID := htonl(CreateID);
C.Head.CommandID := htonl(CMD_CONNECT);
C.Head.TotalLength := htonl(SizeOf(TSMSConnect));
strpcopy(C.UID,PChar('lfpsoft'));
strpcopy(C.PWD,PChar('lfpsoft'));
C.Version := SMS_VERSION_10;

P:=@C;

// DM.IdTCPClient.Socket.Write(buf^);
DM.IdTCPClient.IOHandler.Write(P^)
hongqi162 2007-07-04
  • 打赏
  • 举报
回复
好像是这样调用了,没有用过indy 10
IdTCPClient1.IOHandler.Write(PSMSConnect^);
lfpsoft 2007-07-04
  • 打赏
  • 举报
回复
好像Indy10的IdTCPClient找不到writebuffer了?????
hongqi162 2007-07-04
  • 打赏
  • 举报
回复
idtcpclient.writebuffer( PSMSConnect^,sizeof( TSMSConnect ) );//应该是这样吧

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧