在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