TNMUDP.SendBuffer() 如何发送一个记录类型的变量?(50)

J

jrmd

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序是一个 C/S 架构的小程序,服务器端要定期通过 UDP 向客户端发送 10K 左右的数据,因为 Delphi 的 TNMUDP.SendBuffer() 每次只能发2K,多了发送操作就失败,所以我的算法是:将一次要发送的数据报分成多个帧,客户端接收到所有帧后再组合:// 帧是这样定义的:type PDataGramFrame = ^TDataGramFrame; TDataGramFrame = Record TotalLength: integer; // 数据报总长度 LengthOfCurFrame: integer; // 当前帧长度 IsLastFrame: Boolean; // 最后一帧? Data: array[0..SIZEOFPERFRAME-1] of char; // 数据区 end;//// 服务器端的发送算法://procedure TServerForm.Response(LocalUDP: TNMUDP; RemoteHostIP: string; RemotePort: integer);var DataGramFrame: TDataGramFrame; SendBytes: integer; LeftBytes: integer;begin//// 生成待发送数据//.................. LeftBytes := BmpStream.Size; // 待发送数据放在 BmpStream 中,这是个TMemoryStream BmpStream.Position := 0; while LeftBytes > 0 do begin if LeftBytes >= SIZEOFPERFRAME then // SIZEOFPERFRAME 是每一帧的数据区最大长度 begin SendBytes := SIZEOFPERFRAME; DataGramFrame.IsLastFrame := False; // 还有后继帧 end else begin SendBytes := LeftBytes; DataGramFrame.IsLastFrame := True; // 这是最后一帧,客户端收到这帧后就应组合 end; // 填充帧字段 DataGramFrame.TotalLength := BmpStream.Size; DataGramFrame.LengthOfCurFrame := SendBytes; try BmpStream.ReadBuffer( DataGramFrame.Data, SendBytes ); except on EReadError do exit; // 如果读不到 SendBytes 个字节就不再发送 end; LocalUDP.SendBuffer( DataGramFrame, sizeof( DataGramFrame ) ); LeftBytes := LeftBytes - SendBytes; end; // end while.........问题:TNMUDP.SendBuffer() 的第一个参数只接受一个 array of char,可我想传递的是一个结构变量,在 C 中,我可以直接取这个结构变量的地址,然后再发送出去。但 Delphi 中应该怎么做?刚刚从其它语言转到 Delphi,是个新手,请多多指教!
 
Z

zhengrong117

Unregistered / Unconfirmed
GUEST, unregistred user!
创建一个 array of char 数组用copymemory或者move 把要发送的结构复制到 array of char里面然后发送 array of char ,接收的地方在把接收到的信息在转换成结构
 
J

jrmd

Unregistered / Unconfirmed
GUEST, unregistred user!
zhengrong117:你好!能不能给一段示例代码呢?我刚接触 Delphi,不知道应该怎么做。
 
H

hhjjhhjj

Unregistered / Unconfirmed
GUEST, unregistred user!
加密-发送-解密
 

康凌

Unregistered / Unconfirmed
GUEST, unregistred user!
Buffer: array[1..2048] of char;Buffer[1] := skCloseRoom;CopyMemory(@Buffer[2], @CBRoom, SizeOf(CBRoom));SendBuffer(Buffer, SizeOf(CBRoom) + 1);
 
J

jrmd

Unregistered / Unconfirmed
GUEST, unregistred user!
多人接受答案了。
 

Similar threads

S
回复
0
查看
767
SUNSTONE的Delphi笔记
S
S
回复
0
查看
765
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
934
SUNSTONE的Delphi笔记
S
顶部