自定义类型如何计算其大小?(100分)

  • 主题发起人 主题发起人 taibu
  • 开始时间 开始时间
T

taibu

Unregistered / Unconfirmed
GUEST, unregistred user!
有一自定义类型如下:<br>MyMsgType=(Mouse_Left,Mouse_ShiftLeft,Mouse_Right,Mouse_Middle)<br>type<br>&nbsp; NetData = record<br>&nbsp; &nbsp; Protocol: set of MyMsgType;<br>&nbsp; &nbsp; MsgBuff :TMemoryStream;<br>&nbsp; end;<br>当把一个文件保存到MsgBuff时,如何计算NetData的大小?
 
SizeOf(NetData) = 8<br>无论保存多少文件到msgbuff,NetData的大小是不会改变的,因为NetData就是保存了msgbuff的指针<br>msgbuff指向的内存流的大小可以用MsgBuff.size来获取。<br>就好比我有个加油卡,里面存多少汽油是不会改变我卡的大小的。
 
可是,当我用TServerSocket控件来接收由TClientSocket发送过来的NetData时,发现MsgBuff.Size=0,这是为什么?
 
没数据从TClientSocket传过来。
 
你这样做是不行的, 用socket传递NetData,传递过来的smgbuff就是个地址值,对于接受方来说,没有任何意义。<br>正确的做法是<br>NetData = record<br>&nbsp; &nbsp; Protocol: set of MyMsgType;<br>&nbsp; &nbsp; MsgBuffSize: int64; //流的长度<br>&nbsp; end;<br>然后再将MsgBuffSize制定长度的流给传递过来。
 
那能否做到NetData与MemoryStream一次性传递过去呢?
 
可以。<br>结构体的长度是固定的<br>其实刚才我已经给你答案了<br>发送格式:<br>NetData + MemoryStream<br>MemoryStream的长度是可变的,长度信息写在MsgBuffSize中<br>因为NetData是定长的,所以先接收到NetData数据,解析出MemoryStream的长度,接收即可<br><br>发送时候一次行发送,接受的时候分两步,先接收NetData,再接收MemoryStream
 
后退
顶部