TCP通信时,发送缓冲区用结构体示意,结构体中定义的变量能否不固定大小
TCP通信时,发送缓冲区用结构体表示,结构体中定义的变量能否不固定大小.
如题目的意思
如果没清楚意思,看下面代码
定义了一个公共模块,客户端和服务端程序都引用他
然后在客户端对这个结构进行赋值并发送
服务端接受缓冲区的内容
这样做的话ReadBuffer的时候 写入CommBlock的时候就出错 这我能理解 到服务端的时候CommBlock中的username password等没有赋值 计算出来的大小不知道delphi怎么算的 CommBlock大小可能不够大放不下发过来的东西
然后我就想到一个办法
在客户端发送的时候
服务端接受的时候
仔细想想也是不行 CommBlock依然是大小不对的吧
要怎么写才能申明一个结构大小都正确CommBlock直接传入到处理函数去呢?
传入指针我最终还是要转成结构的啊..
------解决方案--------------------
你自己已经想到了呀!
TCommBlock = packed record
Command,
MyUserName,
Msg,
ReceiverName: string[100];
cid:integer;
loginflag:Boolean;
usernameLen:int; //UserName对应的字符串的长度
passwordLen:int; //Password对应的字符串的长度
如题目的意思
如果没清楚意思,看下面代码
定义了一个公共模块,客户端和服务端程序都引用他
unit GlobalUnit;
interface
type
PCommBlock = ^TCommBlock; //自定义了一个结构体指针TCommBlock
TCommBlock = packed record // the Communication Block used in both parts (Server+Client)
Command,
MyUserName, // the sender of the message (by DNS name)
Msg, // the message itself
ReceiverName: string[100]; // name of receiver //信息不能超过100字符大小是硬伤 这样传输效率明显不高
cid:integer; //用来确定反馈信息在哪输出的
loginflag:Boolean;
username:string; //不规定大小的情况缓冲区的大小会变化 sizeof没有结果 不知道delphi内存怎么分配结构体内存的
password:string; //发送的时候给了值 可以得到大小 接受的时候没有合适的大小去匹配
end;
implementation
end.
然后在客户端对这个结构进行赋值并发送
//向服务端发送登录请求返回通信命令协议加密串,使得软件和以和服务端交互
CommBlock.Command := 'Login'; // assign the data
CommBlock.MyUserName := Client.LocalName;
CommBlock.Msg := 'login test';//可以自定义协议串 或者用二进制数据传输一个结构体 需要定义一个完善的命令协议
CommBlock.ReceiverName := '';
CommBlock.username :='admin';
CommBlock.password :='xxx';
Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
服务端接受缓冲区的内容
AThread.Connection.ReadBuffer (CommBlock, SizeOf (CommBlock));//执行到这里就出错
command_do(CommBlock,Protocol,Clients);//这是自定义的函数用来处理命令的
这样做的话ReadBuffer的时候 写入CommBlock的时候就出错 这我能理解 到服务端的时候CommBlock中的username password等没有赋值 计算出来的大小不知道delphi怎么算的 CommBlock大小可能不够大放不下发过来的东西
然后我就想到一个办法
在客户端发送的时候
//在这里先发送CommBlock的大小
length:=SizeOf (CommBlock);
Client.WriteBuffer (length, 4, true);
Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
服务端接受的时候
var
m_PCommBlock:PCommBlock;
begin
//略.......
//先读出CommBlock的大小 再给CommBlock的指针m_PCommBlock分配内存
AThread.Connection.ReadBuffer (buffersize, 4);
GetMem(m_PCommBlock,buffersize); //分配内存
CommBlock :=m_PCommBlock^;//在这里加入赋值来测试结果 发现在这里就出错了
//仔细想想也是不行 CommBlock依然是大小不对的吧
AThread.Connection.ReadBuffer (m_PCommBlock^, buffersize);
//然后读入到m_PCommBlock这也不行?
end;
仔细想想也是不行 CommBlock依然是大小不对的吧
要怎么写才能申明一个结构大小都正确CommBlock直接传入到处理函数去呢?
传入指针我最终还是要转成结构的啊..
------解决方案--------------------
你自己已经想到了呀!
TCommBlock = packed record
Command,
MyUserName,
Msg,
ReceiverName: string[100];
cid:integer;
loginflag:Boolean;
usernameLen:int; //UserName对应的字符串的长度
passwordLen:int; //Password对应的字符串的长度