- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试将 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/
因此,我试图读取二进制文件,其中字节以网络字节顺序排列。在文件中,它们包含为套接字编程创建结构sockaddr_in所需的信息。这些文件的排列方式是,前4个字节代表IPv4地址,后2个字节代表端口号(
我想做一个小型的ECHO服务器,但是这段代码在通过sendto时一直返回-1,我不知道为什么。 它总是传递到 perror 并打印地址族不支持谁能解释一下为什么? 这是我的代码: sock = soc
我现在正在用 C 语言创建一个服务器/客户端系统,我在客户端部分遇到了一些麻烦。据我所知,我需要使用 sockaddr_in 才能连接到服务器。但是,我每次都遇到段错误。我相信 sockaddr_in
我正在解决一些静态分析缺陷,而导致我出现问题的就是这个缺陷。 SOCKADDR_IN m_stLclAddr; SOCKADDR_IN is a member of the WinSock API 缺
我有一段代码,很久以前在某个环境下工作过。我很确定它是一台 FreeBSD 机器,所以我得到了 FreeBSD 8.3,我正在尝试制作这个文件,但它不工作。 当我尝试编译它时,它会提示: f.c: I
我正在遵循 beej 的网络指南,它进展得非常好,因为我对所有内容都非常了解,而且他解释得很好。但是,当我想测试他向我展示的一些很酷的东西时,它不会起作用! :( 我不确定 sockaddr_in 到
这是 netinet/in.h 中定义的 internet(IPv4) 套接字地址结构 struct sockaddr_in { uint8_t sin_len; s
作为接收struct ifreq *ifr参数的函数的一部分,如果我声明struct sockaddr_in name;,程序会编译,但如果我命名变量struct sockaddr_in ifr_ad
我正在创建一个小型的发送方和接收方应用程序,它将其名称广播到多播组中的所有其他应用程序,同时还接收其他应用程序的名称。 我想我现在已经完成了发送部分,如下所示: if (sendto(sock, me
目前我正在构建一个点对点网络架构,并且正处于创建一个接收函数的阶段,该函数将接受来自网络上多个客户端的消息。本质上,当 recvfrom 函数被调用时——最近向主客户端发送消息的客户端的地址被加载到一
对于我的一门类(class),我必须对服务器和客户端进行编程,并且我们获得了一些示例代码以供使用。这是我感到困惑的片段: main() { int sock, sock_current, c
我在 C 编程方面相对较新,尤其是在套接字编程方面,但我花了很多时间试图帮助自己解决这个问题,但没有找到任何东西,我希望有人能够提供帮助。所以这就是问题所在(我只写了我有问题的那一行) #includ
在作为connect() 的函数中,最后一个参数是sockaddr_in 结构的大小。 很好,但是 sin_zero 未使用(系统不会像我在 stackoverflow.com/questions/2
如果我需要获取 IP 的主机名,我应该使用哪个端口? getnameinfo() 从哪里获取主机名? struct sockaddr_in sa; sa.sin_family = AF_INET
无论我在哪里看,我都会看到以下代码: struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INE
我尝试使用 struct sockaddr_in sin; 但如果我使用它,我会得到 Variable has incomplete type 'struct sockaddr_in' 和 Forw
我在谷歌上搜索了一下,有人说“为了与 struct sockaddr 保持相同的大小”。但是内核不会直接使用 sockaddr(对吧?)。使用时。内核会将其转换回原来的样子。那么为什么需要零填充? s
var sa_tab:[sockaddr?] = [sockaddr](repeating: sockaddr(), count: Int(RTAX_MAX)) let addr:sockaddr =
我是 C 和套接字编程的新手,仍然在 sockaddr_in 中苦苦挣扎结构体: struct sockaddr_in { short sin_family; /*
当我初始化变量时,我会这样做。 int i = 0; char *myText = NULL; 那么,如何初始化struct sockaddr_in类型变量? struct sockaddr_in a
我是一名优秀的程序员,十分优秀!