互联网地址处理例程

 #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;
 }





    
原文地址:https://www.cnblogs.com/iuyy/p/13381803.html