在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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
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
)。