Delphi Socket api 发送结构问题

hljandasunyu 2008-08-29 12:14:25
我做的Socket api程序,客户端发送一个结构体,结构为:
TSockMsg=record //网络发送消息结构
Head:array [0..3] of char;
CH:integer; //通道
ComType:integer; //命令类型
Command:integer; //命令
Content:array [0..255] of char; //命令内容 string[255]string
end;
PTSockMsg = ^TSockMsg;
客户端发送
Head := #5#2#1#31;
CH := 1;
ComType := 2;
Command := 3;
Content := 'Hello';

发送到服务器端后,服务器使用一个260字节的缓冲区接收,接收内容为:
(#5, #2, #1, #31, #1, #0, #0, #0, #2, #0, #0, #0, #3, #0, #0, #0, 'H', 'e', 'l', 'l', 'o', #0, #0, #0, ...共260字节)

我想在服务器端转换为下面这个结构
TSockMsg=record //网络发送消息结构
CH:integer; //通道
ComType:integer; //命令类型
Command:integer; //命令
Content:string; //命令内容
end;
PTSockMsg = ^TSockMsg;

我用的方法是:(recvBuf为缓冲区接收的内容)
var TempStr : string;
RecvCmd : TSockMsg;
TempStr := copy(recvBuf,5,4); //取出前5..8个字符赋给CH
RecvCmd.CH := PInteger(PChar(TempStr))^; //获得CH
TempStr := copy(recvBuf,9,4); //取出前9..13个字符赋给ComType
RecvCmd.ComType := PInteger(PChar(TempStr))^; //获得命令类型
TempStr := copy(recvBuf,13,4); //取出前14..17个字符赋给Command
RecvCmd.Command := PInteger(PChar(TempStr))^; //获得命令
RecvCmd.Content := copy(recvBuf,18,length(recvBuf)-17);//剩余的内容赋给Content

现在的问题是 上面这个过程总有错误,请大家帮我找找哪里不对。谢谢

...全文
403 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuihan20e 2008-08-29
  • 打赏
  • 举报
回复
指针不对?
王集鹄 2008-08-29
  • 打赏
  • 举报
回复
先留个标记。
Bear_hx 2008-08-29
  • 打赏
  • 举报
回复
楼主你这样肯定有问题的:RecvCmd := TSockMsg(recvBuf),这样就可以了,直接转换内存多好。
hljandasunyu 2008-08-29
  • 打赏
  • 举报
回复
谢谢大家支持!
老之 2008-08-29
  • 打赏
  • 举报
回复
var
pc: PChar;

GetMem(pc, 256);
Move(p^, pc^, 256);
RecvCmd.Content := pc;

注意发送的时候最好定义成TSockMsg=packed record, 不然计算长度有可能出错,上面的结构,接收的缓冲区至少需要272个字节
hljandasunyu 2008-08-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liangqingzhi 的回复:]
对于这种变长的结构体(这里含有string),需要计算每个长度。我通常这么做:

var
p: PByte;
RecvCmd : TSockMsg;

p := @recvBuf[4];

Move(p^, RecvCmd.CH, SizeOf(Integer));
Inc(p, SizeOf(Integer));
Move(p^, RecvCmd.ComType, SizeOf(Integer));
Inc(p, SizeOf(Integer));
...
[/Quote]

这种方式可以,但最后的字符串 RecvCmd.Content 应该怎样赋值?
老之 2008-08-29
  • 打赏
  • 举报
回复
对于这种变长的结构体(这里含有string),需要计算每个长度。我通常这么做:

var
p: PByte;
RecvCmd : TSockMsg;

p := @recvBuf[4];

Move(p^, RecvCmd.CH, SizeOf(Integer));
Inc(p, SizeOf(Integer));
Move(p^, RecvCmd.ComType, SizeOf(Integer));
Inc(p, SizeOf(Integer));
...
hljandasunyu 2008-08-29
  • 打赏
  • 举报
回复
发送的结构和接收的结构不一样,发送时多一个Head:array [0..3] of char; 4 Byte的头标志,所以不能使用RecvCmd := TSockMsg(recvBuf)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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