sockaddr_in
在网络编程中,sockaddr_in 结构体是用于表示 IPv4 地址的套接字地址结构。它定义在 <netinet/in.h> 头文件中,是 sockaddr 结构体的一个特化版本,专门用于处理 IPv4 地址。
下面是 sockaddr_in 结构体的典型定义:
struct sockaddr_in {sa_family_t sin_family; // 地址族,对于 IPv4 应为 AF_INETin_port_t sin_port; // 端口号struct in_addr sin_addr; // IPv4 地址char sin_zero[8]; // 填充至 sizeof(struct sockaddr)
};
-
sin_family:指定地址族,对于 IPv4 地址,这个字段通常设置为AF_INET。 -
sin_port:指定端口号,用于标识特定的服务或应用程序。端口号可以是网络字节序(big-endian)或主机字节序,通常使用htons()函数从主机字节序转换为网络字节序。 -
sin_addr:是一个in_addr结构体,包含实际的 IPv4 地址。in_addr结构体通常包含一个s_addr字段,这是一个 32 位的无符号整数,用于存储 IPv4 地址。 -
sin_zero:一个 8 字节的数组,用于将sockaddr_in结构体填充至sockaddr结构体的大小,以确保兼容性。
示例:初始化 sockaddr_in 结构体
以下是一个初始化 sockaddr_in 结构体并将其用于绑定套接字的示例:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main() {int sockfd;struct sockaddr_in local;// 创建套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket creation failed");return 1;}// 初始化 sockaddr_in 结构体local.sin_family = AF_INET; // 地址族为 IPv4local.sin_port = htons(8080); // 端口号为 8080,使用 htons 转换为网络字节序local.sin_addr.s_addr = INADDR_ANY; // 任意本地地址// 绑定套接字到本地地址if (bind(sockfd, (struct sockaddr *)&local, sizeof(local)) < 0) {perror("bind failed");close(sockfd);return 1;}// 监听连接请求if (listen(sockfd, 5) < 0) {perror("listen failed");close(sockfd);return 1;}// 接受连接等后续操作...// 关闭套接字close(sockfd);return 0;
}
在这个示例中,我们创建了一个 TCP 套接字,并使用 sockaddr_in 结构体指定了本地地址和端口。然后,我们使用 bind() 函数将套接字绑定到本地地址和端口。INADDR_ANY 表示套接字可以接收来自任何本地地址的连接请求。
