网络地址结构
typedef struct sockaddr_in { #if(_WIN32_WINNT < 0x0600) short sin_family; //地址族 #else //(_WIN32_WINNT < 0x0600) ADDRESS_FAMILY sin_family; #endif //(_WIN32_WINNT < 0x0600) USHORT sin_port; //端口 IN_ADDR sin_addr; //地址信息(同样是结构体) CHAR sin_zero[8]; //是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。 } SOCKADDR_IN, *PSOCKADDR_IN;
typedef struct in_addr { union { struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { USHORT s_w1,s_w2; } S_un_w; ULONG S_addr; //IP地址 } S_un; #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 } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
填值的时候使用sockaddr_in结构,而作为函数(如socket, listen, bind等)的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。
inet_addr()是将一个点分制的IP地址字符串(如192.168.0.1)转换为上述结构中需要的32位IP地址
inet_addr( )和inet_ntoa ( )
unsigned long PASCAL FAR inet_addr (const char FAR * cp); char FAR * PASCAL FAR inet_ntoa (struct in_addr in);
inet_addr函数需要一个字符串作为其参数,该字符串指定了以点分十进制格式表示的IP地址(例如:192.168.0.16)。而且inet_addr函数会返回一个适合分配给S_addr的u_long类型的数值。
Inet_ntoa函数会完成相反的转换,它接受一个in_addr结构体类型的参数并返回一个以点分十进制格式表示的IP地址字符串
关于字节序可以参考我另一篇博文:http://www.cnblogs.com/Aion/p/3423832.html
struct hostent { char FAR * h_name; /* official name of host 主机名指针*/ char FAR * FAR * h_aliases; /* alias list 别名指针*/ short h_addrtype; /* host address type 地址类型*/ short h_length; /* length of address 地址长度*/ char FAR * FAR * h_addr_list; /* list of addresses 地址列表*/ #define h_addr h_addr_list[0] /* address, for backward compat 列表中第一个地址*/ };