套接字函数

套接字函数

目录

知识地图

套接字函数 图1

套接字函数 图2

1.字节序转换函数

1.1 头文件

#include <arpa/inet.h>

1.2 16位转换函数

uint16_t htons(uint16_t hostshort); 参数: hostshort 16位无符号整型(主机字节序) 返回值: 16位无符号整型数(网络字节序) 作用: 16位无符号整型(主机字节序)转16位无符号整型(网络字节序)

伪代码htons(x) {  if (主机字节序 == 大端) {
        return x;
    } else {
        return ((uint16_t) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)));
    }}

uint16_t ntohs(uint16_t netshort); 参数: netshort 16位无符号整型(网络字节序) 返回值: 16位无符号整型数(主机字节序) 作用: 16位无符号整型(网络字节序)转16位无符号整型(主机字节序)

伪代码htons(x) {  if (主机字节序 == 大端) {
        return x;
    } else {
        return ((uint16_t) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)));
    }}

1.3 32位转换函数

uint32_t htonl(uint32_t hostlong); 参数: hostlong 32位无符号整型(主机字节序) 返回值: 32位无符号整型数(网络字节序) 作用: 32位无符号整型(主机字节序)转32位无符号整型(网络字节序)

伪代码htonl(x) {  if (主机字节序 == 大端) {
        return x;
    } else {
        return ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) \          | (((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24));
    }}

uint32_t ntohl(uint32_t netlong); 参数: netlong 32位无符号整型(网络字节序) 返回值: 32位无符号整型数(主机字节序) 作用: 32位无符号整型(网络字节序)转32位无符号整型(主机字节序)

伪代码htonl(x) {  if (主机字节序 == 大端) {
        return x;
    } else {
        return ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) \          | (((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24));
    }}

1.4 64位转换宏定义

#define htobe64(x) __bswap_64 (x) 参数: x 64位无符号整型(主机字节序) 返回值: 64位无符号整型数(网络字节序) 作用: 64位无符号整型(主机字节序)转64位无符号整型(网络字节序)

伪代码htobe(x) {  if (主机字节序 == 大端) {
        return x;
    } else {
        return ((((x) & 0xff00000000000000ull) >> 56)    \          | (((x) & 0x00ff000000000000ull) >> 40)  \          | (((x) & 0x0000ff0000000000ull) >> 24)  \          | (((x) & 0x000000ff00000000ull) >> 8)   \          | (((x) & 0x00000000ff000000ull) << 8)   \          | (((x) & 0x0000000000ff0000ull) << 24)  \          | (((x) & 0x000000000000ff00ull) << 40)  \          | (((x) & 0x00000000000000ffull) << 56));
    }}

#define be64toh(x) __bswap_64 (x) 参数: x 64位无符号整型(网络字节序) 返回值: 64位无符号整型数(主机字节序) 作用: 64位无符号整型(网络字节序)转64位无符号整型(主机字节序)

伪代码htobe(x) {  if (主机字节序 == 大端) {
        return x;
    } else {
        return ((((x) & 0xff00000000000000ull) >> 56)    \          | (((x) & 0x00ff000000000000ull) >> 40)  \          | (((x) & 0x0000ff0000000000ull) >> 24)  \          | (((x) & 0x000000ff00000000ull) >> 8)   \          | (((x) & 0x00000000ff000000ull) << 8)   \          | (((x) & 0x0000000000ff0000ull) << 24)  \          | (((x) & 0x000000000000ff00ull) << 40)  \          | (((x) & 0x00000000000000ffull) << 56));
    }}

套接字函数 图3

2.IP地址转换函数

2.1 头文件

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

2.2 点分十进制IP和整型IP

int inet_aton(const char *cp, struct in_addr *inp); 参数: cp:点分十进制IP地址inp:输出整型IP地址(网络字节序),struct in_addr类型代表是网络字节序 返回值: 成功:返回1失败:返回0 作用: 点分十进制IP地址转整型IP地址(网络字节序)

char *ip = "192.168.1.1";
struct in_addr addr = {0};
int ret = inet_aton(ip, &addr);
printf("ret:%d, ip:%s->addr.s_addr:%08x\n", ret, ip, addr.s_addr);
输出:ret:1, ip:192.168.1.1->addr.s_addr:0101a8c0

char *inet_ntoa(struct in_addr in); 参数: in 整型IP地址(网络字节序) 返回值: 点分十进制IP地址 作用: 整型IP地址(网络字节序)转点分十进制IP地址

char *ip = NULL;
struct in_addr addr;
addr.s_addr = 0x0101a8c0;
ip = inet_ntoa(addr);
printf("addr.s_addr:%08x->ip:%s\n", addr.s_addr, ip);
输出:addr.s_addr:0101a8c0->ip:192.168.1.1

套接字函数 图4

图1

in_addr_t inet_addr(const char *cp); 参数: cp 字符串IP地址 返回值: 整型IP地址(网络字节序) 作用: 字符串IP地址转整型IP地址(网络字节序)

in_addr_t inet_network(const char *cp); 参数: cp 字符串IP地址 返回值: 整型IP地址(主机字节序) 作用: 字符串IP地址转整型IP地址(主机字节序)

in_addr_t net_addr;
in_addr_t host_addr;
char *ip = "192.168.1.1";
net_addr = inet_addr(ip);
host_addr = inet_network(ip);
printf("ip:%s->net addr:%08x, host addr:%08x\n", ip, net_addr, host_addr);
输出:ip:192.168.1.1->net addr:0101a8c0, host addr:c0a80101

套接字函数 图5

图2

### 2.3 整型IP和网络ID,主机ID in_addr_t inet_lnaof(struct in_addr in); 参数: in 整型IP地址(网络字节序) 返回值: 网络ID(主机字节序) 作用: 通过整型IP地址(网络字节序)获取网络ID(主机字节序),根据IP地址类型规则进行转换 in_addr_t inet_netof(struct in_addr in); 参数: in 整型IP地址(网络字节序) 返回值: 主机ID(主机字节序) 作用: 通过整型IP地址(网络字节序)获取主机ID(主机字节序),根据IP地址类型规则进行转换
in_addr_t network_id;
in_addr_t host_id;
struct in_addr addr;
addr.s_addr = 0x0101a8c0;
network_id = inet_netof(addr);
host_id = inet_lnaof(addr);
printf("addr.s_addr:%08x->network id:%08x, host id:%08x\n", addr.s_addr, network_id, host_id);
输出:addr.s_addr:0101a8c0->network id:00c0a801, host id:00000001

struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host); 参数: net 网络ID(主机字节序) host 主机ID(主机字节序) 返回值: 整型IP地址(网络字节序) 作用: 通过主机ID(主机字节序)和网络ID(主机字节序)生成整型IP地址(网络字节序)

in_addr_t network_id = 0x00c0a801;
in_addr_t host_id = 0x00000001;
struct in_addr addr;
addr = inet_makeaddr(network_id, host_id);
printf("nework id:%08x, host id:%08x->addr:%08x, ip:%s\n", network_id, host_id, addr.s_addr, inet_ntoa(addr));
输出:nework id:00c0a801, host id:00000001->addr:0101a8c0, ip:192.168.1.1

套接字函数 图6

图3

← 返回文章列表