文档介绍:基于 网络编程介绍与分析基于 网络编程介绍与分析当前,基于 socket 的网络编程已成为当今不可替代的编程方法,它将网络通讯当作文件描述符进行处理,把对这个“网络文件”(即 socket 套接字)的操作抽象成一种类似于文件操作的方式进行。从实现细节上,这种工作方式根据 TCP/IP 的网络通讯模型,封装了一系列的实现,使得我们只需要使用一个指定的参数,就可以实现在基于所需协议的数据的发送和接收。但是,如果我们对那些系统自动给我们做的工作感兴趣,希望与发送的数据作“面对面”的接触, 则会是一个不错的选择。 是 UNIX 系统同台上网络安全工具开发的重要的库,它和 libpcap 、 libnids 一起, 给网络安全工具的开发人员提供了一组丰富而且完全的武器,使之得以很方便地编写出结构化强、健壮性好、可移植性高等特点的程序。 提供一系列的接口函数,实现和封装了数据包的构造和发送过程。利用它可以亲自构造从应用层到链路层的各层协议的数据包头,并将这些包头与有效数据有序地组合在一起发送出去。当然,它也是基于 tcp/ip 协议族模型的。 当前的版本是 ,相对于 .* 版本有比较大的变化。全部源代码包括 18,000 行代码, 109 个导出函数,其中包括 67个建包函数。这使得它支持现有的 TCP/IP 族的所有协议。此外,它支持多平台, Windows,OS X,BSD,Linux, Solaris,HPUX 都能使用。下图是它支持的协议: 库可以被划分为 4个功能部分:内存管理、地址解析、包处理、以及其他一些支持函数。★内存管理函数单数据包内存初始化及环境建立: _t *_init(int injection_type, char *device, char *err_buf); 资源释放: void _destroy(_t *l); ★地址解析函数地址解析: char *_addr2name4(u_int32_t in, u_int8_t use_name); _name2addr4(_t *l, char *host_name, u_int8_t use_name); struct _in6_addr _name2addr6(_t *l, char *host_name, u_int8_t use_name); void _addr2name6_r(struct _in6_addr addr, u_int8_t use_name, char *host_name, int host_name_len); 获取接口设备 IP地址: u_int32_t _get_ipaddr4(_t *l); struct _in6_addr _get_ipaddr6(_t *l); 获取接口设备硬件地址: struct _ether_addr *_get_hwaddr(_t *l); ★数据包构造函数(这一部分函数较多,都以_build_*() 的形式出现,在此略过) ★数据包发送函数 int _write(_t *l); ★相关的支持函数随机数种子生成器: int _seed_prand(_t *l); 获取随机数: u_int32_t _get_prand(int mod); 端口列表链初始化: int _plist_chain_new(_t *l, _plist_t **plist, char *token_list); 获取端口列表链的下一项(端口范围): int _plist_chain_next_pair(_plist_t *plist, u_int16_t *bport, u_int16_t *eport); 端口列表链输出显示: int _plist_chain_dump(_plist_t *plist); 获取端口列表链: char *_plist_chain_dump_string(_plist_t *plist); 端口列表链内存释放: int _plist_chain_free(_plist_t *plist); 对它的使用也非常简单,只要你了解自己要做什么事情、应该把哪些参数放在什么位置。利用 函数库开发应用程序的基本步骤非常简单: 1、数据包内存初始化; 2、构造数据包; 3、发送数据; 4、释放资源; 例: 的发行包里提供了很多示例程序,其中//sample/ 如果省略掉一些参数的设置和错误处理,则程序简化为: #if (H***E_CONFIG_H) # include "../include/" #endif # include "" #ifdef __WIN32__ # include "../include/win32/"