#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int inet_aton(const char *cp, struct in_addr *inp); in_addr_t inet_addr(const char *cp); in_addr_t inet_network(const char *cp); char *inet_ntoa(struct in_addr in); struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host); in_addr_t inet_lnaof(struct in_addr in); in_addr_t inet_netof(struct in_addr in);
typedef uint32_t in_addr_t;
inet_aton()将Internet主机地址cp(包括cp="255.255.255.255")从IPv4的数字和点表示法(numbers-and-dots notation)转换为二进制形式(binary form)(网络字节序),并将其存储在inp指向的结构中。
如果地址有效,则inet_aton()返回非零,否则返回零。
点地址的组成部分可以十进制,八进制(前导0)或十六进制(前导0X)指定。 这些格式中的任何一种的地址统称为IPV4点号表示法。
恰好使用四个十进制数字的形式称为IPv4点分十进制表示法(dotted-decimal notation)(有时也称为IPv4点分四进制表示法(dotted-quad notation))。
#include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> using namespace std; int main(){ const char * cp_string = "202.199.13.64"; struct in_addr inp; int value = inet_aton(cp_string,&inp); uint32_t cp_binary_host_byte_order = (uint32_t)((uint32_t)202*256*256*256+199*256*256+13*256+64); uint32_t cp_binary_network_byte_order = htonl(cp_binary_host_byte_order); cout << "value :" << value << endl; cout << "inp.s_addr :" << inp.s_addr << endl; cout << "cp_binary_host_byte_order :" << cp_binary_host_byte_order << endl; cout << "cp_binary_network_byte_order:" << cp_binary_network_byte_order << endl; return 0; }
inet_addr()函数将Internet主机地址cp从IPv4的数字和点符号转换为网络字节顺序的二进制数据。
如果输入无效,返回INADDR(通常是-1)。
这个函数存在的问题:若输入是cp="255.255.255.255",则返回-1,但是"255.255.255.255"是一个有效的IP地址。
#include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> using namespace std; int main(){ const char * cp_string = "202.199.13.64";int value = inet_addr(cp_string,&inp); uint32_t cp_binary_host_byte_order = (uint32_t)((uint32_t)202*256*256*256+199*256*256+13*256+64); uint32_t cp_binary_network_byte_order = htonl(cp_binary_host_byte_order); cout << "value :" << value << endl; cout << "cp_binary_host_byte_order :" << cp_binary_host_byte_order << endl; cout << "cp_binary_network_byte_order:" << cp_binary_network_byte_order << endl; return 0; }
inet_network()函数将cp(IPv4数字和点符号的字符串)转换为主机字节顺序的数字。 成功后,将返回转换后的地址。 如果输入无效,则返回-1。
#include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> using namespace std; int main(){ const char * cp_string = "202.199.13.64"; int value = inet_network(cp_string,&inp); uint32_t cp_binary_host_byte_order = (uint32_t)((uint32_t)202*256*256*256+199*256*256+13*256+64); uint32_t cp_binary_network_byte_order = htonl(cp_binary_host_byte_order); cout << "value :" << value << endl; cout << "cp_binary_host_byte_order :" << cp_binary_host_byte_order << endl; cout << "cp_binary_network_byte_order:" << cp_binary_network_byte_order << endl; return 0; }
inet_ntoa()函数将Internet主机地址(以网络字节顺序指定)转换为IPv4点分十进制表示形式的字符串。
#include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> using namespace std; int main(){
struct in_addr inp = {1074644938};
cout <<"cp_string:"<< inet_ntoa(inp) << endl;
return 0;
}
inet_lnaof()函数返回Internet地址中的主机号部分。返回值按主机字节顺序。
inet_netof()函数返回Internet地址中的网络号部分。返回值按主机字节顺序。
ps:默认子网掩码是:255.255.255.0???还是本机的子网掩码???
#include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> using namespace std; int main(){ const char * cp_string = "202.199.13.64"; struct in_addr inp = {1074644938}; uint32_t inp_network = 202*256*256 + 199* 256 + 13; cout <<"cp_string_local :" << inet_lnaof(inp) << endl; cout <<"cp_string_network :" << inet_netof(inp) << endl; cout <<"inp_network :" <<inp_network << endl; }
inet_makeaddr()函数与inet_netof()和inet_lnaof()相反。 它以网络字节顺序返回Internet主机地址,该地址是通过将网络号net与本地地址主机组合而成的,两者均以主机字节顺序进行。
#include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> using namespace std; int main(){
const char * cp_string = "202.199.13.64";
struct in_addr inp = {1074644938};
struct in_addr new_inp = inet_makeaddr(inet_netof(inp),inet_lnaof(inp));
cout << "new_inp.s_addr:" << new_inp.s_addr <<endl;
}