c++中socket编程需要的类型转换函数

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);

你可能感兴趣的:(编程,C++,socket,struct,网络,null)