????????在網絡編程中,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
表示套接字可以接收來自任何本地地址的連接請求。