IP地址结构(注意红色的语句,经常用到) struct in_addr { union {struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un;//注意,这里是一个联合,通常在用的时候用S_addr,就是下面这个红色的 #define s_addr S_un.S_addr /* can be used for most tcp & ip code */ #define s_host S_un.S_un_b.s_b2 /* host on imp */ #define s_net S_un.S_un_b.s_b1 /* network */ #define s_imp S_un.S_un_w.s_w2 /* imp */ #define s_impno S_un.S_un_b.s_b4 /* imp # */ #define s_lh S_un.S_un_b.s_b3 /* logical host */ }; 一起来看下一个IP地址的内存中的样子(192.168.21.234):192=0xc0 168=0xa8
Socket地址结构 struct sockaddr_in { struct sockaddr { u_short sa_family; /* address family */ (此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。 但一般编程中并不直接针对此数据结构操作,而是使用与sockaddr等价的数据结构sockaddr_in,在使用的时候用socketaddr_in开辟变量并定义,然后在使用的时候作类型转换) pcap_addr地址结构struct pcap_addr { IP地址转换 unsingned long inet_addr(const char FAR *p)接受一个常量IP字符串的指针,并返回一个无符号整型值。发生错误时返回-1,和广播地址255.255.255.255相同,故在赋值之前得先检查返回值。 例如:sockaddr_in socketaddress; unsigned long ip = inet_addr("192.168.21.234"); if (ip == -1) { printf("error ocurred!"); ... } else { socketaddress.sin_addr.s_addr=ip; ... } char FAR * inet_ntoa(struct in_addr in) 将IP地址结构转换成字符串型IP地址。
socket 函数 SOCKET socket( int af, int type, int protocol ); 应用程序调用socket函数来创建一个能够进行网络通信的套接字。 第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET; 第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据报以及协议首部); 第三个参数指定应用程序所使用的通信协议。 该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。 |
|