在 Linux 中,sockaddr 是一個通用結構體,用于表示網絡地址
#include <sys/socket.h>
struct sockaddr {
sa_family_t sa_family; // 地址族,如 AF_INET(IPv4)或 AF_INET6(IPv6)
char sa_data[14]; // 地址數據,長度可變
};
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
對于 IPv4 地址,可以使用以下結構體:
struct sockaddr_in {
sa_family_t sin_family; // 地址族,如 AF_INET
in_port_t sin_port; // 端口號
struct in_addr sin_addr; // IP 地址
};
填充 sockaddr_in 結構體:
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 端口號,使用 htons 函數轉換為網絡字節序
inet_pton(AF_INET, "127.0.0.1", &(server_addr.sin_addr)); // 將 IP 地址字符串轉換為 in_addr 結構體
對于 IPv6 地址,可以使用以下結構體:
struct sockaddr_in6 {
sa_family_t sin6_family; // 地址族,如 AF_INET6
in_port_t sin6_port; // 端口號
struct in6_addr sin6_addr; // IP 地址
};
填充 sockaddr_in6 結構體:
struct sockaddr_in6 server_addr6;
server_addr6.sin6_family = AF_INET6;
server_addr6.sin6_port = htons(8080); // 端口號,使用 htons 函數轉換為網絡字節序
inet_pton(AF_INET6, "2001:db8::1", &(server_addr6.sin6_addr)); // 將 IP 地址字符串轉換為 in6_addr 結構體
bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
注意:將 sockaddr 結構體強制轉換為所需的類型(如 struct sockaddr_in 或 struct sockaddr_in6)。
listen(sockfd, 10);
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int connfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len);
可以使用 read()、write() 等函數與客戶端進行數據交換。
close(connfd);
close(sockfd);
這就是在 Linux 編程中使用 sockaddr 的基本方法。根據實際需求,你可能需要對這些步驟進行調整。