从 sockaddr_storage 检索 ip 和端口

发布于 2024-12-03 15:40:12 字数 189 浏览 1 评论 0原文

我有一个 sockaddr_storage ,其中包含远程主机的 ipv4 地址和端口。不过,我之前没有见过这些 struct ,而且我不确定如何将其转换为可以直接检索 IP 地址和端口号的 struct 。我尝试用谷歌搜索struct,但没有找到任何东西。关于如何执行此操作有什么建议吗?

谢谢

I've got a sockaddr_storage containing the ipv4 address and port of a remote host. I haven't seen these structs before though and I'm not sure how to cast it into a struct where I can directly retrieve IP address and port number. I've tried googling the struct but haven't found anything. Any suggestions on how to do this?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

丑丑阿 2024-12-10 15:40:12

您可以将指针强制转换为 struct sockaddr_in * 或 struct sockaddr_in6 * 并直接访问成员,但这会引发大量有关别名冲突和错误编译问题的蠕虫病毒。

更好的方法是将指针传递给带有 NI_NUMERICHOSTNI_NUMERICSERV 标志的 getnameinfo,以获取地址和端口的字符串表示形式。这样做的优点是它无需额外代码即可支持 IPv4 和 IPv6,并且理论上也支持所有未来的地址类型。您可能必须将指针强制转换为 void *(或显式地 struct sockaddr *,如果您使用的是 C++),以将其传递给 getnameinfo ,但这不会引起问题。

You can cast the pointer to struct sockaddr_in * or struct sockaddr_in6 * and access the members directly, but that's going to open a can of worms about aliasing violations and miscompilation issues.

A better approach would be to pass the pointer to getnameinfo with the NI_NUMERICHOST and NI_NUMERICSERV flags to get a string representation of the address and port. This has the advantage that it supports both IPv4 and IPv6 with no additional code, and in theory supports all future address types too. You might have to cast the pointer to void * (or struct sockaddr * explicitly, if you're using C++) to pass it to getnameinfo, but this should not cause problems.

遗心遗梦遗幸福 2024-12-10 15:40:12

要扩展上面的答案并提供使用 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 地址code> 和 portstr 分别包含一个端口。

To extend an answer above and provide a code that uses getnameinfo function, check this snippet:

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);

The result is that a hoststr contains an IP address from struct sockaddr_storage and a portstr contains a port respectively.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文