Socket开发中的封包问题

someeyes 2007-01-18 06:17:21
现有包头结构和包体结构如下,如何封包后进行发送,Vb.net或C#的代码都可以。

包头和包体的定义和反序列化和序列化都已经实现,现在就差封包的步骤了!

不知道怎么实现,各位大哥帮帮忙。

封包=包头+包体

包头结构
MessageLength 4 char[4]
CommandID 10 char[10]
SequenceNumber 20 char[20]

包体结构
UserValidate 6 char[6]
UserNumber 21 char[21]
ValidateType 1 Integer
ValidatePassowd 16 char[16]
Reserve 8 char[8]

程序中的包头定义和包体定义及序列和反序列的程序

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)> _
Private Structure Header
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=5)> Public MessageLength As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=11)> Public CommandID As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=21)> Public SequenceNumber As String
End Structure

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)> _
Private Structure UserValidate
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=7)> Public UserValidate As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=22)> Public UserNumber As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=2)> Public ValidateType As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=17)> Public ValidatePassowd As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=9)> Public Reserve As String
End Structure

#Region "序列化,反序列化"

Private Function RawSerialize(ByVal _Structure As Object) As Byte()
Dim rawsize As Integer = Marshal.SizeOf(_Structure)
Dim buffer As IntPtr = Marshal.AllocHGlobal(rawsize)
Marshal.StructureToPtr(_Structure, buffer, False)
Dim rawdatas As Byte() = New Byte(rawsize) {}
Marshal.Copy(buffer, rawdatas, 0, rawsize)
Marshal.FreeHGlobal(buffer)
Return rawdatas
End Function

Private Function RawDeserialize(ByVal rawdatas As Byte(), ByVal anytype As Type) As Object
Dim rawsize As Integer = Marshal.SizeOf(anytype)
If (rawsize > rawdatas.Length) Then Return Nothing
Dim buffer As IntPtr = Marshal.AllocHGlobal(rawsize)
Marshal.Copy(rawdatas, 0, buffer, rawsize)
Dim retobj As Object = Marshal.PtrToStructure(buffer, anytype)
Marshal.FreeHGlobal(buffer)
Return retobj
End Function

#End Region

...全文
326 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
greennetboy 2007-01-21
  • 打赏
  • 举报
回复
只要你能保证数据传过去能被解析就可以了,你搞的好复杂,我也看不懂vb代码。不过接受数据的时候,你要把数据放到一个队列里面,然后根据flag,解析消息集合就可以了
greennetboy 2007-01-21
  • 打赏
  • 举报
回复
搞不明白,你为什么还要封包
直接设计成一个结构不就可以了么。
比如
flag length data
阿牛138588 2007-01-20
  • 打赏
  • 举报
回复
不懂,感觉问题比较偏....
someeyes 2007-01-20
  • 打赏
  • 举报
回复
就是拆包和组包的问题了!
someeyes 2007-01-19
  • 打赏
  • 举报
回复
没人做过么?为什么我提出的问题都没有人能够解决呢?
jxzhang615 2007-01-18
  • 打赏
  • 举报
回复
帮顶

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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