标签:__ sockaddr addr IP 端口 bytes inet struct
前言
从sockaddr结构中提取IP, 先将结构sockaddr转为sockaddr_in结构,然后用在利用相关API将其中的IP地址从网络格式转化我们熟悉点分十进制的字符串。
一、sockaddr和sockaddr_in结构
程序员不应操作sockaddr结构,sockaddr是给操作系统用的
程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。
struct sockaddr {
unsigned short sa_family; // 2 bytes address family, AF_xxx unsiged short
char sa_data[14]; // 14 bytes of protocol address
};
struct sockaddr_in {
short sin_family; // 2 bytes e.g. AF_INET, AF_INET6
unsigned short sin_port; // 2 bytes e.g. htons(3490)
struct in_addr sin_addr; // 4 bytes see struct in_addr, below
char sin_zero[8]; // 8 bytes zero this if you want to
};
struct in_addr {
unsigned long s_addr; // 4 bytes load with inet_pton()
}
它们结构之间表示如下图。
二、从结构sockaddr获取IP和端口。
使用结构inet_ntop获取IP地址,而不是用inet_ntoa。可能是因为64位机子引起的问题。
详细的原因参考:https://blog.csdn.net/zmxiangde_88/article/details/8157256
struct sockaddr from;
/*
...
working
...
*/
struct sockaddr_in *sock = ( struct sockaddr_in*)&from;
int port = ntohs(sock->sin_port);
#ifdef __MINGW32__ //windows上打印方式
printf("ip:port %s : %d",inet_ntoa(sock->sin_addr),port);
#else //linux上打印方式
struct in_addr in = sock->sin_addr;
char str[INET_ADDRSTRLEN]; //INET_ADDRSTRLEN这个宏系统默认定义 16
//成功的话此时IP地址保存在str字符串中。
inet_ntop(AF_INET,&in, str, sizeof(str));
printf("ip:port %s : %d",str,port);
#endif
inet_ntop接口文档
/* Convert a Internet address in binary network format for interface
type AF in buffer starting at CP to presentation form and place
result in buffer of length LEN astarting at BUF. */
extern const char *inet_ntop (int __af, const void *__restrict __cp,
char *__restrict __buf, socklen_t __len)
将其转化的结果放置到buf中。即最终转化的IP值存放在buf中。
三、参考
sockaddr和sockaddr_in的区别: https://blog.csdn.net/tao546377318/article/details/72780685
inet_ntoa在64位机器上出错: https://blog.csdn.net/zmxiangde_88/article/details/8157256
标签:__,sockaddr,addr,IP,端口,bytes,inet,struct 来源: https://blog.csdn.net/weixin_42730667/article/details/104180870
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。