0%

网络编程之转换函数

地址转换函数

在 socket 编程中,对于地址转换函数,BSD包含 inet_addr(), inet_aton()inet_ntoa() 三个函数用于二进制地址格式与点分十进制之间的相互转换,但是仅仅适用于 IPv4;inet_ntop()inet_pton() 具有相似的功能,并且同时支持 IPv4 和 IPv6;字母p代表presentation,字母n代表numeric。

inet_addr

  1. 头文件:#include <arpa/inet.h>

  2. 功能:该函数用于将 点分十进制 IP 地址转换成 网络字节序 IP 地址。

  3. 原型:

    1
    in_addr_t inet_addr(const char *cp);
  4. 返回值:如果正确执行,将返回一个无符号长整数型数;如果传入的字符串不是一个合法的IP地址,将返回 INADDR_NONE

inet_aton

  1. 头文件:#include <arpa/inet.h>

  2. 功能:该函数用于将 点分十进制 IP 地址转换成 网络字节序 IP 地址。

  3. 原型:

    1
    int inet_aton(const char *string, struct in_addr *addr);
  4. 返回值:如果正确执行,函数的返回值非零,如果输入地址不正确则会返回零。

inet_ntoa

  1. 头文件:#include <arpa/inet.h>

  2. 功能:该函数用于 网络字节序 IP 转化 点分十进制 IP 地址。

  3. 原型:

    1
    char *inet_ntoa (struct in_addr);
  4. 返回值:如果正确执行,将返回一个字符指针;否则,返回 NULL

inet_pton

  1. 头文件:#include <arpa/inet.h>

  2. 功能:该函数用于将 点分十进制 IP 地址转换成 网络字节序 IP 地址。

  3. 原型:

    1
    int inet_pton(int domain, const char *restrict str, void *restrict addr);
  4. 返回值:如果正确执行,返回1;如果参数格式无效,返回0;如果出错,返回-1。

inet_ntop

  1. 头文件:#include <arpa/inet.h>

  2. 功能:该函数用于 网络字节序 IP 转化 点分十进制 IP 地址。

  3. 原型:

    1
    const char *inet_ntop(int domain, const void *restrict addr, char *restrict str, socklen_t size);
  4. 返回值:如果正确执行,返回地址字符串指针;否则,返回NULL。

例子

例子1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>


#define DEMO_IP "127.0.0.1"


int main()
{
struct in_addr inAddr;
inAddr.s_addr = inet_addr(DEMO_IP);
printf("网络字节序 IP : 0x%x\n", inAddr.s_addr);

char *strAddr = inet_ntoa(inAddr);
printf("点分十进制 IP : %s\n", strAddr);

int ret = inet_aton(strAddr, &inAddr);
if (0 != ret)
{
printf("网络字节序 IP : 0x%x\n", inAddr.s_addr);
}
else
{
printf("inet_aton 出错 !\n");
}

return 0;
}

输出结果

1
2
3
网络字节序 IP : 0x100007f
点分十进制 IP : 127.0.0.1
网络字节序 IP : 0x100007f

例子2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>


#define DEMO_IP "127.0.0.1"


int main()
{
struct in_addr addr;
int ret = inet_pton(AF_INET, DEMO_IP, &addr.s_addr);
if(1 == ret)
{
printf("网络字节序 IP : 0x%x\n", addr.s_addr);
}
else if (0 == ret)
{
printf("inet_pton 格式不对 !");
}
else
{
printf("inet_pton 出错 !");
}


char ipStr[20];
if(inet_ntop(AF_INET, &addr.s_addr, ipStr, sizeof(ipStr)))
{
printf("点分十进制 IP : %s\n", ipStr);
}
else
{
printf("inet_ntop 出错 !");
}

return 0;
}

输入结果

1
2
网络字节序 IP : 0x100007f
点分十进制 IP : 127.0.0.1

端口转换函数

htons

  1. 头文件:#include <netinet/in.h>

  2. 功能:将主机字节顺序转换为网络字节顺序;host to network long

  3. 原型:

    1
    uint32_t htonl(uint32_t hostlong);
  4. 返回值:转换后的值。

htons

  1. 头文件:#include <netinet/in.h>

  2. 功能:将主机字节顺序转换为网络字节顺序;host to network short

  3. 原型:返回转化后的值。

    1
    uint16_t htons(uint16_t hostshort);
  4. 返回值:转换后的值。

ntohl

  1. 头文件:#include <netinet/in.h>

  2. 功能:将网络字节顺序转换为主机字节顺序;network to host long

  3. 原型:

    1
    uint32_t ntohl(uint32_t netlong);
  4. 返回值:转换后的值。

ntohs

  1. 头文件:#include <netinet/in.h>

  2. 功能:将网络字节顺序转换为主机字节顺序;network to host short

  3. 原型:

    1
    uint16_t ntohs(uint16_t netshort);
  4. 返回值:转换后的值。

Socket 相关函数