在C语言中,可以使用以下方法打印出sockaddr
结构体中的端口号和地址参数:
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
void print_sockaddr(struct sockaddr* sa) {
if (sa->sa_family == AF_INET) { // IPv4
struct sockaddr_in* sa_in = (struct sockaddr_in*)sa;
char addr_buf[INET_ADDRSTRLEN];
const char* addr_str = inet_ntop(AF_INET, &(sa_in->sin_addr), addr_buf, INET_ADDRSTRLEN);
if (addr_str != NULL) {
printf("IPv4 Address: %s\n", addr_str);
}
printf("Port: %d\n", ntohs(sa_in->sin_port));
} else if (sa->sa_family == AF_INET6) { // IPv6
struct sockaddr_in6* sa_in6 = (struct sockaddr_in6*)sa;
char addr_buf[INET6_ADDRSTRLEN];
const char* addr_str = inet_ntop(AF_INET6, &(sa_in6->sin6_addr), addr_buf, INET6_ADDRSTRLEN);
if (addr_str != NULL) {
printf("IPv6 Address: %s\n", addr_str);
}
printf("Port: %d\n", ntohs(sa_in6->sin6_port));
} else {
printf("Unknown address family\n");
}
}
int main() {
struct sockaddr_in server_addr; // 假设使用的是IPv4地址结构
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 设置端口号为8080
inet_pton(AF_INET, "127.0.0.1", &(server_addr.sin_addr)); // 设置IPv4地址为127.0.0.1
print_sockaddr((struct sockaddr*)&server_addr);
return 0;
}
上述代码中,print_sockaddr
函数用于打印sockaddr
结构体中的端口号和地址参数。首先,根据sa_family
字段判断是IPv4还是IPv6地址结构。然后,使用inet_ntop
函数将二进制地址转换为可读字符串形式,并使用ntohs
函数将网络字节序的端口号转换为主机字节序。最后,在主函数中创建一个示例的sockaddr_in
结构体并调用print_sockaddr
函数进行打印测试。
内容由零声教学AI助手提供,问题来源于学员提问