关于TCP报文格式的问题?

jxqn_liu 2012-07-26 10:22:36
1.TCP的报文的包头格式必须是这样的吗?

typedef struct _TCP_HEADER {
USHORT nSourPort ; // 源端口号16bit
USHORT nDestPort ; // 目的端口号16bit
UINT nSequNum ; // 序列号32bit
UINT nAcknowledgeNum ; // 确认号32bit
USHORT nHLenAndFlag ; // 前4位:TCP头长度;中6位:保留;后6位:标志位16bit
USHORT nWindowSize ; // 窗口大小16bit
USHORT nCheckSum ; // 检验和16bit
USHORT nrgentPointer ; // 紧急数据偏移量16bit
} TCP_HEADER, *PTCP_HEADER ;



2.可以不可以自己定义包头格式,如果可以 那像一下的格式应该怎么定义

报文格式:数据包头 + 数据包体(数据包头的内容是不包含包头的整个数据包长度)。
|------------------|----------------|
|数据包头(56字节)| 数据包体 |
|------------------|----------------|
| Data Header | Data Body |
|------------------|----------------|

所有非数字字段左对齐,右补空格;金额右对齐,左补空格,精确到分。
报文体长度=56+数据包体长度。
报文编号:ABCDEF001;报文头格式:
|------|-----------|--------|--------|--------|------------|-------------------|
|序号 | 名称 | 类型 | 长度 | 对齐 | 填充字符 | 说明 |
|------|-----------|--------|--------|--------|------------|-------------------|
| 1 |报文体长度 | 数值 | 6 | Left | 空格 | 报文体长度 |
|------|-----------|--------|--------|--------|------------|-------------------|
| 2 |交易码 | 字符 | 6 | Left | 空格 | 交易码 |
|------|-----------|--------|--------|--------|------------|-------------------|
| 3 |返回码 | 字符 | 4 | Left | 空格 | 返回码 |
|------|-----------|--------|--------|--------|------------|-------------------|
| 4 |返回信息 | 字符 | 40 | Left | 空格 | 返回信息 |
|------|-----------|--------|--------|--------|------------|-------------------|

交易返回码定义:
   0000 交易成功
   1001 无用户号码
   9000 系统暂停服务
   9999 其它原因



3.报文的包体的格式可以不可以使用自己定义的Record、数组等结构体。还是以字符串的形式组合,再到接收端上解析该字符串。

字符串的组合格式

   以不定长字符流方式设计。报文结构大致可理解为报文头+报文体,最小单位以“NAME:VALUE”对的型式, NAME、VALUE都以各自的长度为前缀;一条典型的发送报文如下所示:
   009MessageID:00574606:013TransactionID:005BOKFS:
003///:0011:003ROW:0011:003COL:0014:010Packeduser:003LHY:010packedtime:0192006-06-06 10:29:37:004flag:001Y:009accessory:0011:
003///:0012:003ROW:0011:003COL:0017:009IMPRESTNO:0130606163005721:008inittime:0192006-06-16 15:30:04:009CompanyID:003ITC:
011Companytype:001A:009payamount:0041936:012actualamount:0041936:008category:006进帐单:003$$$
解析说明:
名称长度 名称 Req 值长度 值 说明
009 MessageID Y 005 74606 报文头,报文ID
013 TransactionID Y 005 BOKFS 报文头,交易ID
006 Err_ID 返回报文 Y 003 000 出错ID,000为成功,
008 Err_DESC 返回报文Y 004 成功 异常中文描述
008 Err_DESE 返回报文Y 007 Success 异常英文描述
003 /// 如有内容Y 001 1 报文体,组号符
003 ROW 如有内容Y 001 1 报文体,行数
003 COL 如有内容Y 001 4 报文体,列数
010 Packeduser N 003 LHY 报文体,内容值
010 packedtime N 019 2006-06-06 10:29:37 报文体,内容值
004 flag N 001 Y 报文体,内容值
009 accessory N 001 1 报文体,内容值
......

003 $$$ Y 报文结束符

报体的规则是否应该跟上面的定义一样?

4.报体是否可以使用XML进行数据记录?

分不是很多 还望各位大侠能帮我解释一番!

在此谢过!!!!!
...全文
271 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxqn_liu 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

>>报文协议号在发送报文是不是起作用,还是只是做一个区分。

发送报文是底层的事情,对于TCP协议来说,你自己的头也好体也好都是数据,和TCP的发送无关,只和你自己的程序怎么处理这些数据有关。

>>长度我只关心报体的总体长度这个可行不

如果Record结构的长度是不定长的,你的数据长度也必定是不定长的,你自己说需要不需要关心呢?
[/Quote]

多谢兄台!
jxqn_liu 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

高层协议的整个数据包(数据头+数据体),只是低层协议里的数据体
应用开发者不用关心低层协议的数据包的数据头
[/Quote]

谢谢兄台的指点!
haitao 2012-07-26
  • 打赏
  • 举报
回复
应用的数据包协议,可以非常灵活,好坏都是应用自己承受
二进制、文本(xml、json、ini)都可以
但是最好前面有本包长度信息,最后有没有结束标志或检验信息则看应用的需要了
haitao 2012-07-26
  • 打赏
  • 举报
回复
tcp/ip报文是驱动层的事情,不用你关心的
你的报文是应用层的,才需要你实现
haitao 2012-07-26
  • 打赏
  • 举报
回复
高层协议的整个数据包(数据头+数据体),只是低层协议里的数据体
应用开发者不用关心低层协议的数据包的数据头
thx1180 2012-07-26
  • 打赏
  • 举报
回复
>>报文协议号在发送报文是不是起作用,还是只是做一个区分。

发送报文是底层的事情,对于TCP协议来说,你自己的头也好体也好都是数据,和TCP的发送无关,只和你自己的程序怎么处理这些数据有关。

>>长度我只关心报体的总体长度这个可行不

如果Record结构的长度是不定长的,你的数据长度也必定是不定长的,你自己说需要不需要关心呢?
jxqn_liu 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

应用的数据包协议,可以非常灵活,好坏都是应用自己承受
二进制、文本(xml、json、ini)都可以
但是最好前面有本包长度信息,最后有没有结束标志或检验信息则看应用的需要了
[/Quote]

谢谢兄台,我想请问报文协议号在发送报文是不是起作用,还是只是做一个区分。

如果我用的是Record等结构发送数据,不是用字符串发送的,需要不需要关心每个字段的对齐方式和长度

长度我只关心报体的总体长度这个可行不。

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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