gpt4 book ai didi

将 sockaddr_storage 转换为 inet_ntop 的 sockaddr_in

转载 作者:太空狗 更新时间:2023-10-29 15:50:41 26 4
gpt4 key购买 nike

我正在尝试将 sockaddr_storage 转换为 sockadd_in,这样我就可以打印出数据报包的源 IP 地址,我似乎无法获得正确的类型转换,

struct sockaddr_storage  peer_addr;


getnameinfo((struct sockaddr *) &peer_add
peer_addrlen,
hostbuff, sizeof(hostbuff),
NULL, 0, NI_NAMEREQD);


inet_ntop(AF_INET, (((struct sockaddr_in *)peer_addr).sin_addr), ipbuff, INET_ADDRSTRLEN);

当我尝试将结构转换为 sockaddr_in 时,我得到“无法转换为指针”,或者当我删除取消引用时,我得到“请求转换为非缩放器类型”。

我尝试了很多组合,只是不明白我哪里出错了。

最佳答案

inet_ntop(peer_addr->ss_family, &(((struct sockaddr_in *)peer_addr)->sin_addr), ipbuff, INET_ADDRSTRLEN);

应该可以。但考虑改用 getnameinfo() ,这是更现代的界面:

char host[NI_MAXHOST];
getnameinfo((struct sockaddr *)peer_addr, peer_addr->ss_len, host, sizeof(host), NULL, 0, NI_NUMERICHOST);

适用于 IPv4 和 IPv6 地址。


根据问题中变化的类型更新:这是一个完整的例子应该在没有警告的情况下编译:

int socket = ...;

struct sockaddr_storage peer_addr;
socklen_t peer_addrlen;
char host[NI_MAXHOST];

ssize_t amount;
char buffer[1000];
amount = recvfrom(socket, buffer, sizeof(buffer), 0, (struct sockaddr *)&peer_addr, &peer_addrlen);
getnameinfo((struct sockaddr *)&peer_addr, peer_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);

或者,使用 inet_ntop():

char ipbuff[INET_ADDRSTRLEN];
inet_ntop(peer_addr.ss_family, &(((struct sockaddr_in *)&peer_addr)->sin_addr), ipbuff, INET_ADDRSTRLEN);

关于将 sockaddr_storage 转换为 inet_ntop 的 sockaddr_in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20130415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com