inet_addr
unsigned long inet_addr( constchar FAR *cp; );
转换一个IP地址(例如10.1.1.1)到IN_ADDR结构体适用的地址。
假设你已经有了一个sockaddr_in结构体ina,并且有一个IP地 址"132.241.5.10"要储存在其中,就要用到函数inet_addr(),将IP地址从 点数格式转换成无符号长整型。使用方法如下:
ina.sin_addr.s_addr= inet_addr("132.241.5.10");
inet_ntoa和inet_addr作用相反
inet_ntoa
char FAR* inet_ntoa( struct in_addr in );
转换一个因特网的网络地址(Ipv4)到网络标准点数格式的字符串(其实函数返回的是字符指针)。
其参数是一个in_addr的结构体
函数演示片段:
SOCKET acceptSocket = INVALID_SOCKET; SOCKADDR_IN sockAccept; int len = sizeof(sockAccept); while (TRUE) { acceptSocket =accept(sock,(sockaddr *)&sockAccept,&len); char sendBuf[100]; sprintf(sendBuf, "欢迎ip为:%s的用户连接!\n",inet_ntoa(sockAccept.sin_addr)); …… }
返回值:如果没有错误发生,inet_ntoa返回一个字符指针,这个字符指针指向一个包括标准的点格式的文本地址静态的缓冲区;否则,返回NULL。
说明:inet_ntoa带一个参数为in的地址结构体,返回一个带点格式如“a.b.c.d”的ASCII字符串。
从in_addr结构体定义
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; };
可知道,这个结构体里是一个union类型的共用体,根据共用体的定义:共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。
所以,每次调用inet_ntoa(),它就将覆盖上次调用所得的IP地址。
如下例:
char *a1, *a2; a1 = inet_ntoa(ina1.sin_addr); /* 这是198.92.129.1 */ a2 = inet_ntoa(ina2.sin_addr); /* 这是132.241.5.10 */ printf("address 1: %s/n",a1); printf("address 2: %s/n",a2);
输出如下:
address 1: 132.241.5.10
address 2: 132.241.5.10
htons(“host to net ”)s=short
u_short htons( u_shorthostshort );
转换一个主机字节序列的u_short到TCP/IP网络字节序列。
htonl(“host to net”) l=long
u_long htonl( u_long hostlong );
转换一个主机字节序列的u_long到TCP/IP网络字节序列。
举例如下:
SOCKADDR_INsockStruct; sockStruct.sin_family= AF_INET; sockStruct.sin_addr.S_un.S_addr= htonl(INADDR_ANY);//inet_addr("127.0.0.1"); sockStruct.sin_port= htons(9000);