1. 套接字操作相关
1.1 socket
int socket(int domain, int type, int protocol);
参数 | 说明 |
---|---|
int domain | 协议族,常用 AF_INET (IPv4)、AF_INET6 (IPv6) |
int type | 套接字类型,SOCK_DGRAM (UDP)、SOCK_STREAM (TCP)、SOCK_RAW (原始套接字) |
int protocol | 协议,常用 IPPROTO_IP ,也可以指定具体协议 IPPROTO_UDP |
返回值:
成功:返回套接字文件描述符(fd)
失败:返回 -1,同时设置
errno
说明:创建一个套接字,用于后续数据发送或接收。
1.2 bind
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数 | 说明 |
---|---|
int sockfd | socket 文件描述符 |
const struct sockaddr *addr | 指向地址结构体的指针,存储 IP + 端口 |
socklen_t addrlen | 结构体长度,一般使用 sizeof(struct sockaddr_in) |
返回值:
成功:返回 0
失败:返回 -1,同时设置
errno
说明:将本地 IP 和端口绑定到 socket 上,UDP 接收端必须 bind。
1.3 sendto
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
参数 | 说明 |
---|---|
int sockfd | UDP 套接字文件描述符 |
const void *buf | 数据缓冲区地址 |
size_t len | 数据长度(字节数) |
int flags | 一般为 0 |
const struct sockaddr *dest_addr | 目标接收端地址结构体 |
socklen_t addrlen | 目标地址结构体长度 |
返回值:
成功:返回实际发送字节数
失败:返回 -1,同时设置
errno
说明:向指定目标发送 UDP 数据包。
1.4 recvfrom
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
参数 | 说明 |
---|---|
int sockfd | UDP 套接字文件描述符 |
void *buf | 数据接收缓冲区 |
size_t len | 缓冲区大小(最大接收字节数) |
int flags | 一般为 0 |
struct sockaddr *src_addr | 存储发送端 IP + 端口的结构体指针,可为 NULL |
socklen_t *addrlen | 指向 socklen_t 变量,存储结构体长度,可为 NULL |
返回值:
成功:返回接收到的字节数
失败:返回 -1,同时设置
errno
说明:接收 UDP 数据,并可获取发送端 IP 和端口。
2. IP / 端口转换相关
2.1 htonl / htons
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
参数 | 说明 |
---|---|
hostlong / hostshort | 主机字节序的 IP 或端口号 |
返回值:大端字节序(网络字节序)的值
说明:主机(小端)转换为网络(大端)字节序。
2.2 ntohl / ntohs
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
参数 | 说明 |
---|---|
netlong / netshort | 网络字节序的 IP 或端口号 |
返回值:主机字节序的值
说明:网络(大端)转换为主机(小端)字节序。
2.3 inet_pton
int inet_pton(int af, const char *src, void *dst);
参数 | 说明 |
---|---|
int af | 地址族 AF_INET / AF_INET6 |
const char *src | 点分十进制 IP 字符串 |
void *dst | 存储网络字节序的 IP 地址(4 字节 for IPv4) |
返回值:
1:转换成功
0:字符串不合法
-1:地址族非法
说明:本地 IP 字符串 → 网络字节序数值。
2.4 inet_ntop
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
参数 | 说明 |
---|---|
int af | 地址族 AF_INET / AF_INET6 |
const void *src | 网络字节序的 IP 地址 |
char *dst | 存储转换后的 IP 字符串 |
socklen_t size | dst 缓冲区大小 |
返回值:
成功:返回 dst
失败:返回 NULL,同时设置
errno
说明:网络字节序 → 本地字符串 IP。
3. 地址结构体
3.1 struct sockaddr_in
struct sockaddr_in {sa_family_t sin_family; // AF_INETin_port_t sin_port; // 端口号,网络字节序struct in_addr sin_addr; // IPv4 地址char sin_zero[8]; // 填充,保持与 struct sockaddr 大小一致
};
3.2 struct in_addr
struct in_addr {uint32_t s_addr; // IPv4 地址,网络字节序
};
说明:
sockaddr_in
用于 IPv4 地址和端口sin_port
必须使用网络字节序sin_addr.s_addr
也必须是网络字节序