在Linux中,sockaddr
是一个通用结构体,用于表示网络地址
sa_family
:地址族,表示地址的类型。常见的地址族有AF_INET(IPv4)和AF_INET6(IPv6)。sa_port
:端口号,表示服务器监听的端口。它是一个16位的无符号整数。sa_addr
:实际的网络地址。它的类型取决于sa_family
的值。对于IPv4,它是一个in_addr
结构体,包含一个32位的IPv4地址;对于IPv6,它是一个in6_addr
结构体,包含一个128位的IPv6地址。
以下是一个简单的示例,展示了如何使用sockaddr
结构体:
#include#include #include #include #include int main() { int sockfd; struct sockaddr_in server_addr, client_addr; socklen_t addr_len = sizeof(client_addr); // 创建一个TCP套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket"); exit(EXIT_FAILURE); } // 配置服务器地址 server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(8080); // 绑定套接字到地址 if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("bind"); exit(EXIT_FAILURE); } // 监听连接 if (listen(sockfd, 10) < 0) { perror("listen"); exit(EXIT_FAILURE); } // 接受客户端连接 if (accept(sockfd, (struct sockaddr *)&client_addr, &addr_len) < 0) { perror("accept"); exit(EXIT_FAILURE); } // 处理客户端请求(例如,发送响应) // 关闭套接字 close(sockfd); return 0; }
在这个示例中,我们创建了一个TCP套接字,绑定到所有可用的IPv4地址(0.0.0.0)的8080端口,然后监听客户端连接。当客户端连接时,我们接受连接并获取客户端的地址信息(client_addr
)。