我有一个sockaddr_storage
包含远程主机的ipv4地址和端口。我之前没有见过这些struct
,我不知道如何将它转换为struct
,我可以直接检索IP地址和端口号。我试过谷歌搜索struct
,但没有找到任何东西。有关如何做到这一点的任何建议吗?
由于
答案 0 :(得分:5)
您可以将指针转换为struct sockaddr_in *
或struct sockaddr_in6 *
并直接访问成员,但这会打开一堆关于别名违规和错误编译问题的蠕虫。
更好的方法是将指针传递给带有getnameinfo
和NI_NUMERICHOST
标志的NI_NUMERICSERV
,以获取地址和端口的字符串表示形式。这样做的优点是它既支持IPv4又支持IPv6,无需额外代码,理论上也支持所有未来的地址类型。您可能必须将指针强制转换为void *
(或struct sockaddr *
,如果您使用的是C ++)将其传递给getnameinfo
,但这不会导致问题。
答案 1 :(得分:2)
要扩展上面的答案并提供使用getnameinfo
功能的代码,请查看以下代码段:
struct sockaddr_storage client_addr;
socklen_t client_len = sizeof(struct sockaddr_storage);
// Accept client request
int client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_len);
char hoststr[NI_MAXHOST];
char portstr[NI_MAXSERV];
int rc = getnameinfo((struct sockaddr *)&client_addr, client_len, hoststr, sizeof(hoststr), portstr, sizeof(portstr), NI_NUMERICHOST | NI_NUMERICSERV);
if (rc == 0) printf("New connection from %s %s", hoststr, portstr);
结果是hoststr
包含来自struct sockaddr_storage
的IP地址,portstr
包含一个端口。