unix网络编程
AI出来以后,软件不可能找到工作的,就算找到了也在走下坡路。再过几年,机器人发展起来,连流水线都找不到。人为什么整体不值钱,每个部位却很值钱。你说我初中辍学就去开直播结局会不会比现在好。
更新ing
1. 常用结构体/函数/常量
1. ip地址与端口号
常见常量
//地址族af
AF_INET(IPv4)
AF_INET6(IPv6)
表示 IPv4 地址和端口号的结构体
#include <stdio.h>
#include <arpa/inet.h>
struct sockaddr_in {
sa_family_t sin_family; // 地址族,通常是 AF_INET(IPv4)
in_port_t sin_port; // 端口号(16 位,网络字节序)
struct in_addr sin_addr; // IPv4 地址(32 位,网络字节序)
char sin_zero[8]; // 填充字段,通常设置为 0
};
struct in_addr {//用于表示ipv4
in_addr_t s_addr; // 32 位 IPv4 地址(网络字节序)
//in_addr_t 通常是 uint32_t(32 位无符号整型)。
};
表示 IPv6 地址和端口号的结构体
#include <netinet/in.h>
struct sockaddr_in6 {
sa_family_t sin6_family; // 地址族,IPv6 是 AF_INET6
in_port_t sin6_port; // 端口号
uint32_t sin6_flowinfo; // IPv6 流信息,用于标识数据流的优先级和 QoS(服务质量)
struct in6_addr sin6_addr; // IPv6 地址
uint32_t sin6_scope_id; // 接口范围 ID,用于标识链路本地地址的接口,通常为0
};
struct in6_addr {
union {
uint8_t __u6_addr8[16]; // 16 个 8 位无符号整数
uint16_t __u6_addr16[8]; // 8 个 16 位无符号整数
uint32_t __u6_addr32[4]; // 4 个 32 位无符号整数
} __in6_u; // 联合体,用于以不同方式访问 IPv6 地址
};
ip地址字符串格式与二进制格式互转(均支持ipv4)
函数 | 功能 | 错误返回值 | 支持 IPv6 | 线程安全 |
---|---|---|---|---|
in_addr_t inet_addr(const char *cp); | 字符串 → 二进制 | -1 | ❌ | ✔️ |
int inet_pton(int af, const char *src, void *dst); | 字符串 → 二进制 | 0或-1 | ✔️ | ✔️ |
int inet_aton(const char *cp, struct in_addr *inp); | 字符串 → 二进制 | 0 | ❌ | ✔️ |
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); | 二进制 → 字符串 | null | ✔️ | ✔️ |
char *inet_ntoa(struct in_addr in); | 二进制 → 字符串 | 指向静态缓冲区的指针 | ❌ | ❌ |
端口号网络字节序(大端序)与主机字节序互相转换
#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort); //将主机字节序的端口号转换为网络字节序。
uint16_t ntohs(uint16_t netshort); //将网络字节序的端口号转换为主机字节序。