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
也必須是網絡字節序