IP 地址与域名之间的转换

Posted by KalosAner on January 15, 2025

1、通过域名获取 IP 地址

一般客户端程序不能要求用户输入 IP 地址和 port,但是服务端程序的 IP 地址有可能变化。但是一般情况域名一旦注册可能永久不变,因此可以利用域名编写程序会更好。每次运行程序时根据域名获取 IP 地址,再接入服务器,这样程序就不会依赖于服务器 IP 地址了。

利用域名获取 IP 地址可以使用以下函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Linux
#include <netdb.h>

// 失败返回 NULL
struct hostent * gethostbyname(const char * hostname);

struct hostent {
	char * h_name;			// official name
	char ** h_aliases;		// alias list
	int h_addrtype;			// host address type
	int h_length;			// address length
	char ** h_addr_list;	// address list
}

// Windows
#include <winsock2.h>

struct hostent * gethostbyname(const char * name);

h_addr_list 最终指向 in_addr 结构体。

gethostbyname.c

gethostbyname_win.c

2、通过 IP 地址获取域名

1
2
3
4
5
6
7
8
9
// Linux
#include <netdb.h>

struct hostent * gethostbyaddr(const char * addr, socklen_t len, int family);

// Windows
#include <winsock2.h>

struct hostent * gethostbyaddr(const char * addr, int len, int type);

addr 传入 in_addr 结构体指针。len 在 IPv4 时为 4,IPv6 时为 16。family 传入地址族信息。

gethostbyaddr.c

gethostbyaddr_win.c