linux struct sockaddr 打印
在 Linux 编程中,`struct sockaddr` 通常用于表示网络地址信息。为了打印 `struct sockaddr` 中的信息,你可能需要转换其成员为更具体的类型,如 `struct sockaddr_in` 或 `struct sockaddr_in6`,然后进行打印。
下面是一个简单的示例,展示如何打印 `struct sockaddr_in` 中的 IP 地址和端口号:
```c
#include <stdio.h>
#include <arpa/inet.h>
void printSockAddr(const struct sockaddr *addr) {
    if (addr->sa_family == AF_INET) {
        struct sockaddr_in *addr_in = (struct sockaddr_in *)addr;
        char ip[INET_ADDRSTRLEN];
        inet_ntop(AF_INET, &(addr_in->sin_addr), ip, INET_ADDRSTRLEN);
        printf("IP Address: %s\n", ip);
        printf("Port: %d\n", ntohs(addr_in->sin_port));
    } else if (addr->sa_family == AF_INET6) {
        struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)addr;
        char ip[INET6_ADDRSTRLEN];
        inet_ntop(AF_INET6, &(addr_in6->sin6_addr), ip, INET6_ADDRSTRLEN);
        printf("IP Address: %s\n", ip);
        printf("Port: %d\n", ntohs(addr_in6->sin6_port));
    } else {
        printf("Unsupported address family\n");
    }
}
int main() {
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8080);
    inet_pton(AF_INET, "127.0.0.1", &(addr.sin_addr));
    printSockAddr((struct sockaddr *)&addr);
    return 0;
}
```
在这个例子中,`printSockAddr` 函数接收一个指向 `struct sockaddr` 的指针,并根据地址家族(address family)判断是 IPv4 还是 IPv6 地址,然后使用 `inet_ntop` 函数将二进制地址转换为可读的字符串形式,并打印 IP 地址和端口号。
请注意,这只是一个基本的例子,实际中你可能需要更全面地处理错误、不同的地址家族等情况。printf输出格式linux