前言

从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 shortchar              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 interfacetype AF in buffer starting at CP to presentation form and placeresult 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结构获取IP和端口相关推荐

  1. php获取ip与端口,PHP获取IP与连接数,并获取IP所在地址

    php-cli下执行 windows下的运维工具,改成linux也很方便 用PHP获取IP与连接数,并获取IP所在地址,主要针对80端口,其他端口也能看到 开启反解ip可判断是否是蜘蛛. //获取连接 ...

  2. shodan API 获取IP开放端口

    # -*- coding: utf-8 -*-""" @author:随时静听 @file: shodanForIp.py @time: 2019/01/28 @emai ...

  3. Java获取IP和端口(Linux)

    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder .getRequestAttributes( ...

  4. 【Qt Quick】QNetworkDatagram获取Ip及端口

    系统:win10 通信:UDP 简介 在写聊天软件练习时,作为服务器端需要优先知道客户端的Ip及地址,客户端发送数据过来时用QNetworkDatagram接收 代码 void UDPServer:: ...

  5. Java获取客户端ip和端口

    "青枫江上秋帆远,白帝城边古木疏" 如果你的方法参数里面直接有request,像下面这样: @RequestMapping("/test.json")@Resp ...

  6. WCF获取客户端IP和端口

    //提供方法执行的上下文环境OperationContext context = OperationContext.Current;//获取传进的消息属性MessageProperties prope ...

  7. 通过ribbon 根据服务名获取所有服务实例的IP和端口列表

    代码使用SpringCloud版本E3 业务场景: 今天遇到一个业务场景,要求根据服务名获取当前微服务集群中所有的对应服务实例的IP和端口,通过分析源码推算出了写法. 原理简述: 如果代码中引入了sp ...

  8. 获取本地IP和端口号的指令

    ipconfig就可以获取ip 获取端口号的指令: 开始--运行--cmd--输入netstat an(中间有一空格) 转载于:https://www.cnblogs.com/BoYu045535/p ...

  9. 根据域名获取ip地址、端口、服务器类型和标题

    这个是我在一家网络安全公司面试时的操作题,回来后经过多次修改后才得到一个比较完整的程序. 整个模块可以分成两个大部分.一个是数据库的操作,一个是信息的获取(类似爬虫?) 信息的获取分为四个小操作,ip ...

最新文章

  1. 招聘 | ​浙江农林大学孙学鹏团队招聘事业编制科研人员
  2. android如何设置软件的版本,假的设置软件-假的设置(型号模拟)下载v2.5 安卓版-西西软件下载...
  3. Redis缓存高可用集群哨兵模式详解
  4. JMM如何解决顺序一致性问题-重排序问题
  5. ROS + OpenCV
  6. extjs 实现 NumberField 即时计算
  7. require,include,require_once和include_once之间的区别?
  8. jupyter notebook + 服务器中docker 使用配置
  9. 黑苹果 OC引导 big sur 主题分享
  10. 算法探究:线性时间选择问题
  11. 超星尔雅学习通情商与智慧人生 答案 满分版
  12. 互联网上的UFO教派
  13. 提高INSERT速度
  14. 第1章 数学基础和机器学习问题(范数+矩阵迹+矩阵求导+机器学习框架)
  15. 智慧灯杆系统设计架构简介
  16. ios 模拟器沙盒_ios 模拟器沙盒的位置 | 学步园
  17. TestCenter测试管理工具功能详解八(M)
  18. 基于主流Arm服务器的低成本云游戏、云手机产品方案【Rockchip、MediaTek等】
  19. 爱普生连续供墨系统故障排除方法
  20. 有关于3GPP SUL的一些学习

热门文章

  1. Idea方法注释模板(参数注释出类型和名称)
  2. 基于VS2017的工程用途按钮控件,开关按钮控件,图形按钮控件
  3. 理解JavaScript中的堆和栈
  4. Android端离线推送语音播报原理实现
  5. Django基础(28): 如何设计充满陷阱的优美URL
  6. LPC11C14 启动代码分析
  7. 大模型商业的搅局者?除了谷歌和微软,你可能忘记了它!
  8. 工作中mysql常用的sql语句
  9. C语言实现大数相乘(思路+代码+运行结果)
  10. c#和python哪个更好_C#、C++、Java、Python 选择哪个好?