2024年3月22日发(作者:)

linux struct sockaddr 打印

在 Linux 编程中,`struct sockaddr` 通常用于表示网络地址信息。为了打印 `struct sockaddr`

中的信息,你可能需要转换其成员为更具体的类型,如 `struct sockaddr_in` 或 `struct

sockaddr_in6`,然后进行打印。

下面是一个简单的示例,展示如何打印 `struct sockaddr_in` 中的 IP 地址和端口号:

```c

#include

#include

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: %sn", ip);

printf("Port: %dn", 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: %sn", ip);

printf("Port: %dn", ntohs(addr_in6->sin6_port));

} else {

printf("Unsupported address familyn");

}

}

int main() {

struct sockaddr_in addr;

_family = AF_INET;

_port = htons(8080);

inet_pton(AF_INET, "127.0.0.1", &(_addr));

printSockAddr((struct sockaddr *)&addr);

return 0;

}

```

在这个例子中,`printSockAddr` 函数接收一个指向 `struct sockaddr` 的指针,并根据地址家

族(address family)判断是 IPv4 还是 IPv6 地址,然后使用 `inet_ntop` 函数将二进制地址

转换为可读的字符串形式,并打印 IP 地址和端口号。

请注意,这只是一个基本的例子,实际中你可能需要更全面地处理错误、不同的地址家族等

情况。