在 Linux 中,sockaddr 是一个通用结构体,用于表示网络地址
#include <sys/socket.h>
struct sockaddr {
sa_family_t sa_family; // 地址族,如 AF_INET(IPv4)或 AF_INET6(IPv6)
char sa_data[14]; // 地址数据,长度可变
};
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
对于 IPv4 地址,可以使用以下结构体:
struct sockaddr_in {
sa_family_t sin_family; // 地址族,如 AF_INET
in_port_t sin_port; // 端口号
struct in_addr sin_addr; // IP 地址
};
填充 sockaddr_in 结构体:
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 端口号,使用 htons 函数转换为网络字节序
inet_pton(AF_INET, "127.0.0.1", &(server_addr.sin_addr)); // 将 IP 地址字符串转换为 in_addr 结构体
对于 IPv6 地址,可以使用以下结构体:
struct sockaddr_in6 {
sa_family_t sin6_family; // 地址族,如 AF_INET6
in_port_t sin6_port; // 端口号
struct in6_addr sin6_addr; // IP 地址
};
填充 sockaddr_in6 结构体:
struct sockaddr_in6 server_addr6;
server_addr6.sin6_family = AF_INET6;
server_addr6.sin6_port = htons(8080); // 端口号,使用 htons 函数转换为网络字节序
inet_pton(AF_INET6, "2001:db8::1", &(server_addr6.sin6_addr)); // 将 IP 地址字符串转换为 in6_addr 结构体
bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
注意:将 sockaddr 结构体强制转换为所需的类型(如 struct sockaddr_in 或 struct sockaddr_in6)。
listen(sockfd, 10);
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int connfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len);
可以使用 read()、write() 等函数与客户端进行数据交换。
close(connfd);
close(sockfd);
这就是在 Linux 编程中使用 sockaddr 的基本方法。根据实际需求,你可能需要对这些步骤进行调整。