铸造sockaddr_storage作为有sockaddr_in为inet_ntop [英] casting sockaddr_storage as sockaddr_in for inet_ntop

查看:1501
本文介绍了铸造sockaddr_storage作为有sockaddr_in为inet_ntop的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想投sockaddr_storage到sockadd_in,这样我可以打印出数据报文的源IP地址,
我似乎不能够得到剧组正确的,

 结构sockaddr_storage peer_addr;
则getnameinfo((结构sockaddr *)及peer_add
                peer_addrlen,
                hostbuff,sizeof的(hostbuff)
                NULL,0 NI_NAMEREQD);
inet_ntop(AF_INET,(((结构SOCKADDR_IN *)peer_addr).sin_addr),ipbuff,INET_ADDRSTRLEN);

当我试图结构转换为SOCKADDR_IN,我要么得到无法转换为指针,或当我删除dereferance我得到的转换,以申请非定标器的类型。

我已经试过很多的组合,只是不明白的地方我错了。


解决方案

  inet_ntop(peer_addr->有ss_family,及(((结构SOCKADDR_IN *)peer_addr) -  GT; sin_addr) ,ipbuff,INET_ADDRSTRLEN);

应该工作。但考虑到使用则getnameinfo()来代替,这是更现代
接口:

 字符主机[NI_MAXHOST]
则getnameinfo((结构sockaddr *)peer_addr,peer_addr-> ss_len,主机的sizeof(主机),NULL,0,NI_NUMERICHOST);

适用于IPv4和IPv6地址。


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

  INT插座= ...;结构sockaddr_storage peer_addr;
socklen_t的peer_addrlen;
焦炭主机[NI_MAXHOST]ssiz​​e_t供量;
炭缓冲液[1000];
量= recvfrom的(插座,缓冲器,的sizeof(缓冲液),0,(结构sockaddr *)及peer_addr,&放大器; peer_addrlen);
则getnameinfo((结构sockaddr *)及peer_addr,peer_addrlen,主机的sizeof(主机),NULL,0,NI_NUMERICHOST);

或者使用 inet_ntop()

 烧焦ipbuff [INET_ADDRSTRLEN]
inet_ntop(peer_addr.ss_family,及(((结构SOCKADDR_IN *)及peer_addr) - > sin_addr),ipbuff,INET_ADDRSTRLEN);

I am trying to cast a sockaddr_storage to a sockadd_in, so that i can print out the source ip address of a datagram packet, i do not seem to be able to get the cast correct,

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

when i try to cast the structure to a sockaddr_in, i either get 'cannot convert to pointer', or when i remove the dereferance i get 'conversion to non scaler type requested'.

I have tried alot of combinations and simply don't understand where i am going wrong.

解决方案

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

should work. But consider to use getnameinfo() instead, which is the more modern interface:

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

works for both IPv4 and IPv6 addresses.


Update according to the changed types in the question: This is a complete example that should compile without warnings:

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

Or, using inet_ntop():

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

这篇关于铸造sockaddr_storage作为有sockaddr_in为inet_ntop的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆