inet_addr解析
在WinSock编程中,经常会用到inet_addr这个函数,下面就来详细解剖一下这个函数
在MSDN中对于该函数的描述是:
The inet_addr function converts a string containing an IPv4 dotted-decimal address into a proper address for the IN_ADDR structure.
翻译过来就是将一个字符串(IPv4格式的字符串),如:“192.168.0.1”转换诚IN_ADDR结构,那么IN_ADDR结构又是一种什么样的结构呢,。
继续MSDN。。。
typedef 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; } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
整理一下,将格式整理的更清晰一些:
typedef struct in_addr { union { struct { u_char s_b1; u_char s_b2; u_char s_b3; u_char s_b4; }S_un_b; struct { u_short s_w1; u_short s_w2; }S_un_w; u_long S_addr; } }IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
可以看到,该结构体是一个还算比较复杂的结构体,结构体里面嵌套了联合体(union),联合体(union)内部又嵌套了结构体,
于是,可以清晰地看到inet_addr函数主要是将一个包含IPv4格式的字符串(如:“192.168.0.1”)转换成一个IN_ADDR结构对象。
PS:扯远一点,在看下结构体SOCKADDR_IN:
在MSDN内的说明是:
struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; };
在ws2def.h头文件中的定义是:
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_IN, *PSOCKADDR_IN;
这里,ADDRESS_FAMILY其本质就是USHORT
在ws2def.h头文件中有定义:
typedef USHORT ADDRESS_FAMILY