最近也在做TCP的封包,虽然是老贴,也回一下,贴上我的解决思路,以便后人查阅.
首先,要实现数据包的区分,要得先实现内部序列化,就是相当于自己封装一个协议.例如要发文本消息及传输文件的话就得定义两个指令ID,类似当下的QQ协议.
先说明一下,这里指令ID并不是单独发送,而是序列化后发送.关于序列化,大家可以GOOGLE相关的说明文档.
我所使用的方式是传输一个Struct结构,简单举个例子:$tStruct = DllStructCreate('int iCmdId;int iLength; char szContent[4096]')
在这个结构体中,成员iCmdId表示当前的指令,如设置为1表示当前的数据是一条文本消息,设置为2表示当前的数据为文件数据流;成员iLength表示当前数据包的大小;成员szContent表示数据包的内容,当然,这个成员的大小是不确定的,上面的4096只是举例,类型也是可变的,关键在于你自己转换.这样一来,就可以将结构体前两个元素看作是数据包头,因为大小是固定的,总共为8个字节,想到了吧,只要在接收方接收时先接收前8个字节就可以知道这个数据包的大小及指令类型,前面说过,成员iLength是整个数据包的大小,现在我要接收完整个数据包的话还要接收iLength-8个字节.如此接收方不仅知道这一条数据包的处理方式,还可以保证数据包的完整性,同样避免了多次交互.
说得很乱,希望有人能理解,仅当抛砖引玉
另外,提醒一下,结构体是不能直接传送的,必须要先转换成字节流;结构体的成员也不能引用指针,因为地址只对于你自己有效. |