下面是从这次编程过程中总结的小收获,总结如下,可能不难,但借此机会整理如下,供以后查看作为参考:
1)首先是各个类型的定义,这是以前自己没有注意过的,现在总结如下:
u_int与int,u_char与char,这两组类型变量在内存里分别所占的长度是一样的
u_int/int占4个字节,u_char/char占1个字节。
这些类型的使用场合:
u_int(unsigned int)表示无符号整形,意味着该变量的值不会出现负数;
int表示有符号整形,意味着该变量可以是正、负数;
u_char数组(或者指针),表示该变量是(或者指向)二进制数据,即里面可能有不可见字符;
而char数组则一般是可见字符串了。
uint8_t,uint16_t,uint32_其实这些都不是新的数据类型,它们只是使用typedef给类型起的别名,这样其实是为了程序的规范,或者是为了以后修改代码比较方便。
查看定义可以发现如下:
typedef unsigned char u_int8_t;(u_char)
typedef signed char int8_t;
typedef unsigned int u_int16_t;(u_int)
typedef signed int int16_t;
2)winpcap网络编程中有其很多特殊性,因此说一下其中的某些函数。
首先这个程序中最重要的ntohs()
解释:将一个无符号短整形数从网络字节顺序转换为主机字节顺序。
#include <winsock.h>
u_short PASCAL FAR ntohs( u_short netshort);
netshort:一个以网络字节顺序表达的16位数。
其实也就是将一个16位数由网络字节顺序转换为主机字节顺序。
好,那么问题来了,什么是网络字节顺序与主机字节顺序呢,这是自己在编程过程中一直存在的问题,后来终于看懂了:
首先介绍两种字节序类型
1. Little endian:将低序字节存储在起始地址
2. Big endian:将高序字节存储在起始地址
前者就是我们平时用的x86系列机子的顺序,及我们上学期在计算机组成原理中学的,地址低位存储值的低位 ;地址高位存储值的高位。
后者是比较直观的方式,只需要把内存地址从左到右按照由低到高的顺序写出。这就是网络字节顺序。网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。
为了更直观的了解,下面我从程序中截了一个屏
我把程序中nthos()这个注释掉的结果是如上所数据示的,为了方便看,我加了一个display()函数,这样对比看的比较清晰。
3)由于winpcap网络编程中IP和