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 



原文地址:https://www.cnblogs.com/Jasonscor/p/3315130.html