在网络编程中,经常需要进行点分十进制字符串表示的IP地址和in_addr
结构体表示的IP地址之间的转换。以下是一些常用的地址转换函数,以及它们的使用方法。
1. 字符串转 in_addr
结构体
inet_addr
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
该函数将点分十进制的字符串表示的IPv4地址转换为网络字节序的32位整数。返回的是in_addr_t
类型,通常用于填充sin_addr.s_addr
字段。
示例:
const char *ipString = "192.168.1.1";
in_addr_t ipAddress = inet_addr(ipString);
inet_pton
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
这个函数是更通用的函数,支持IPv4和IPv6地址的转换。第一个参数 af
表示地址族,常用的是 AF_INET
(IPv4)和 AF_INET6
(IPv6)。第二个参数 src
是输入的字符串表示的IP地址,第三个参数 dst
是输出的二进制表示的IP地址。
示例:
#include <arpa/inet.h>
struct in_addr ipv4Address;
const char *ipString = "192.168.1.1";
inet_pton(AF_INET, ipString, &(ipv4Address.s_addr));
2. in_addr
结构体转字符串
inet_ntoa
#include <arpa/inet.h>
char *inet_ntoa(struct in_addr in);
该函数将in_addr
结构体中的IPv4地址转换为点分十进制的字符串表示。需要注意的是,返回的是指向静态缓冲区的指针,因此不宜多次调用。
示例:
#include <arpa/inet.h>
struct in_addr ipv4Address;
ipv4Address.s_addr = inet_addr("192.168.1.1");
char *ipString = inet_ntoa(ipv4Address);
inet_ntop
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
这是一个更通用的函数,支持IPv4和IPv6地址的转换。第一个参数 af
表示地址族,常用的是 AF_INET
(IPv4)和 AF_INET6
(IPv6)。第二个参数 src
是输入的二进制表示的IP地址。第三个参数 dst
是输出的字符串表示的IP地址的缓冲区。第四个参数 size
是缓冲区的大小。
示例:
#include <arpa/inet.h>
struct in_addr ipv4Address;
ipv4Address.s_addr = inet_addr("192.168.1.1");
char ipString[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(ipv4Address.s_addr), ipString, INET_ADDRSTRLEN);
这些地址转换函数是在网络编程中非常实用的工具,它们使得在不同表示之间进行转换变得简单而高效。通过合理使用这些函数,你可以轻松地在字符串表示和二进制表示之间转换IP地址,从而更方便地进行网络编程。