IP首部结构如下:
typedef struct _IPHeader // 20字节的IP头
{
UCHAR iphVerLen; // 版本号和头长度(各占4位)
UCHAR ipTOS; // 服务类型
USHORT ipLength; // 封包总长度,即整个IP报的长度
USHORT ipID; // 封包标识,惟一标识发送的每一个数据报
USHORT ipFlags; // 标志
UCHAR ipTTL; // 生存时间,就是TTL
UCHAR ipProtocol; // 协议,可能是TCP、UDP、ICMP等
USHORT ipChecksum; // 校验和
union {
unsigned int ipSource;
ip_address ipSourceByte;
};
union {
unsigned int ipDestination;
ip_address ipDestinationByte;
};
} IPHeader, *PIPHeader;
首部长度为:
u_int ip_len = (pipheader->iphVerLen & 0xf) * 4;
TCP首部结构如下:
typedef struct _TCPHeader // 20字节的TCP头
{
USHORT sourcePort; // 16位源端口号
USHORT destinationPort; // 16位目的端口号
ULONG sequenceNumber; // 32位序列号
ULONG acknowledgeNumber; // 32位确认号
UCHAR dataoffset; // 高4位表示数据偏移
UCHAR flags; // 6位标志位
//FIN - 0x01
//SYN - 0x02
//RST - 0x04
//PUSH- 0x08
//ACK- 0x10
//URG- 0x20
//ACE- 0x40
//CWR- 0x80 USHORT windows; // 16位窗口大小
USHORT checksum; // 16位校验和
USHORT urgentPointer; // 16位紧急数据偏移量
} TCPHeader, *PTCPHeader;那么TCP首部长度该怎么计算呢?
typedef struct _IPHeader // 20字节的IP头
{
UCHAR iphVerLen; // 版本号和头长度(各占4位)
UCHAR ipTOS; // 服务类型
USHORT ipLength; // 封包总长度,即整个IP报的长度
USHORT ipID; // 封包标识,惟一标识发送的每一个数据报
USHORT ipFlags; // 标志
UCHAR ipTTL; // 生存时间,就是TTL
UCHAR ipProtocol; // 协议,可能是TCP、UDP、ICMP等
USHORT ipChecksum; // 校验和
union {
unsigned int ipSource;
ip_address ipSourceByte;
};
union {
unsigned int ipDestination;
ip_address ipDestinationByte;
};
} IPHeader, *PIPHeader;
首部长度为:
u_int ip_len = (pipheader->iphVerLen & 0xf) * 4;
TCP首部结构如下:
typedef struct _TCPHeader // 20字节的TCP头
{
USHORT sourcePort; // 16位源端口号
USHORT destinationPort; // 16位目的端口号
ULONG sequenceNumber; // 32位序列号
ULONG acknowledgeNumber; // 32位确认号
UCHAR dataoffset; // 高4位表示数据偏移
UCHAR flags; // 6位标志位
//FIN - 0x01
//SYN - 0x02
//RST - 0x04
//PUSH- 0x08
//ACK- 0x10
//URG- 0x20
//ACE- 0x40
//CWR- 0x80 USHORT windows; // 16位窗口大小
USHORT checksum; // 16位校验和
USHORT urgentPointer; // 16位紧急数据偏移量
} TCPHeader, *PTCPHeader;那么TCP首部长度该怎么计算呢?
解决方案 »
- 怎样重命名目录啊
- 用非模式对话框实现图像二值化的问题
- 请问CCPRs 类在VS.net 2005上是怎么生成的?
- 如何让CListCtrl和CComboBox具有编辑框的功能!
- 谁知道HWND GetDlgItem(HWND hDlg,int nIDDlgItem ),nIDDlgItem的取值范围
- 关于单文档滚动条一问
- 怎样改变CListCtrl为ICON风格时,各个ITEM子项的外观!!!!!
- 如何在对话框上加Email信箱和网址?
- 如何对两幅二值化的印刷电路板进行图像配准,这两两幅图像一样,就是待配准图像有位置偏移,角度偏差。
- 不用Wizard怎样怎样对ODBC数据库进insert?
- STL 中关于set 执行中 排序准则的疑惑
- 使用skin#皮肤 报错:无法定位程序输入点 “工程名” 于动态链接库 SkinH.dll 上
{
WORD SPort; //16位源端口号
WORD DPort; //16位目的端口号
DWORD SeqNum; //32位序号
DWORD AckNum; //32位确认序号
BYTE Reserved1 : 4; //保留4位
BYTE HLen : 4; //4位首部长度 BYTE CB_FIN : 1; //发端完成发送任务
BYTE CB_SYN : 1; //同步序号用来发起一个连接
BYTE CB_RST : 1; //重建连接
BYTE CB_PSH : 1; //接收方应该尽快将这个报文段交给应用层
BYTE CB_ACK : 1; //确认序号有效
BYTE CB_URG : 1; //紧急指针有效 BYTE Reserved2 : 2; //保留2位
WORD Window; //16位窗口大小
WORD Checksum; //16位检验和
WORD UrgPtr; //16位紧急指针
} TCPHEADER;
BYTE不是八个二进制位吗?
这个定义也有问题阿~