在网络编程中,sockaddr_in
结构体是用于表示 IPv4 地址的套接字地址结构。它定义在 <netinet/in.h>
头文件中,是 sockaddr
结构体的一个特化版本,专门用于处理 IPv4 地址。
下面是 sockaddr_in
结构体的典型定义:
struct sockaddr_in {
sa_family_t sin_family; // 地址族,对于 IPv4 应为 AF_INET
in_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; // 地址族为 IPv4
local.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
表示套接字可以接收来自任何本地地址的连接请求。