从sockaddr_storage中检索ip和端口

时间:2011-09-07 14:37:05

标签: c sockets winsock

我有一个sockaddr_storage包含远程主机的ipv4地址和端口。我之前没有见过这些struct,我不知道如何将它转换为struct,我可以直接检索IP地址和端口号。我试过谷歌搜索struct,但没有找到任何东西。有关如何做到这一点的任何建议吗?

由于

2 个答案:

答案 0 :(得分:5)

您可以将指针转换为struct sockaddr_in *struct sockaddr_in6 *并直接访问成员,但这会打开一堆关于别名违规和错误编译问题的蠕虫。

更好的方法是将指针传递给带有getnameinfoNI_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包含一个端口。