luchenqun
12/7/2017 - 3:18 PM

inet.cpp

/*
不同的CPU有不同的字节序类型,这些字节序是指 整数 在内存中保存的顺序,这个叫做 主机序。最常见的有两种:
Little endian:将低序字节存储在起始地址
Big endian:将高序字节存储在起始地址
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

int inet_aton(const char *cp, struct in_addr *inp);
将一个字符串IP地址转换为一个32位的网络序列IP地址。如果这个函数成功,函数的返回值非零,如果输入地址不正确则会返回零。认为255.255.255.255是有效的。

in_addr_t inet_addr(const char *cp);
将一个点分十进制的IP转换成一个32位的网络序列IP地址

in_addr_t inet_network(const char *cp);
将一个点分十进制的IP转换成一个32位的主机字节序IP地址

htons:把unsigned short类型从主机序转换到网络序
htonl:把unsigned long类型从主机序转换到网络序
ntohs:把unsigned short类型从网络序转换到主机序
ntohl:把unsigned long类型从网络序转换到主机序
*/

#include <memory>
#include <iostream>
#include <string>
#include <arpa/inet.h>

using namespace std;

int main()
{
    int ret = 0;
    const char *strptr = "210.25.132.181";
    struct in_addr addr;
    ret = inet_aton(strptr, &addr);
    cout << "ret = " << ret << ", addr.s_addr = " << ntohl(addr.s_addr) << endl;
    
    in_addr_t addr_t;
    addr_t = inet_addr(strptr);
    cout << "inet_addr addr.s_addr = " << ntohl(addr_t) << endl;

    addr_t = inet_network(strptr);
    cout << "inet_network addr.s_addr = " << addr_t << endl;

    return 0;
}
// ‭11010010 00011001 10000100 10110101‬
// 210      25       132      181
// ret = 1, addr.s_addr = 3524887733
// inet_addr addr.s_addr = 3524887733
// inet_addr addr.s_addr = 3524887733