Linux下MyIpAdd库的使用
一、MyIpAdd库简介MyIpAdd库是一个纯C库可以用它获取我们的公网IP地址。其github地址为https://github.com/felmur/MyIpAdd二、下载编译MyIpAdd源码从 https://github.com/felmur/MyIpAdd 下载MyIpAdd源码解压进入源码目录可以看到其目录结构如下编译cmake . -DCMAKE_INSTALL_PREFIX$(pwd)/install make make install然后源码目录下会生成MyIpAdd的库文件libMyIpAdd.so三、MyIpAdd的使用例子以C为例编写一个使用示例。main.cpp内容如下#include iostream #include myipadd.h using namespace std; int main() { MyIpAdd * m new MyIpAdd(); cout My public ip address is: m-ip endl; return 0; }编译g main.cpp -o main -g -IXXX/MyIpAdd-master -LXXX/MyIpAdd-master -lMyIpAdd运行效果如下。可以看到本机的公网ip被成功打印出来了该ip和通过百度查询到的公网ip一致四、MyIpAdd源码里的bugMyIpAdd源码里myipadd.cpp的构造函数 MyIpAdd::MyIpAdd()的代码为MyIpAdd::MyIpAdd() { buf static_castchar *(malloc(1024)); sk socket(AF_INET, SOCK_STREAM, 0); if (sk0) { if (DEBUG) cout Socket error endl; exit(-1); } if (DEBUG) cout Socket creation OK endl; host gethostbyname(addr.c_str()); if (host nullptr ) { if (DEBUG) cout Bad host addr endl; exit(-3); } addrin.sin_family AF_INET; addrin.sin_port htons(80); addrin.sin_addr.s_addr *(reinterpret_castunsigned int*(host-h_addr)); if (connect(sk, reinterpret_caststruct sockaddr *(addrin), sizeof(addrin))0){ if (DEBUG) cout Connection Failed endl; exit(-2); } if (DEBUG) cout Connection OK endl; string msg GET / HTTP/1.1\r\nHost: addr \r\nConnection: close\r\n\r\n; send(sk, msg.c_str(), msg.length(), 0); ssize_t ret 0; string html; while((ret read( sk , buf, sizeof(buf)))0) { *(bufret) 0; html buf; } liststring cont; split(html,cont,\n); size_t r 0; for(auto line : cont) { if (line.length()20) { if ((r line.find(Current IP Address:))!string::npos) { string a line.substr(r20); a a.substr(0,a.find()); if (DEBUG) cout a endl; ip a; } } } close(sk); }可以看到里面调用了exit函数host gethostbyname(addr.c_str()); if (host nullptr ) { if (DEBUG) cout Bad host addr endl; exit(-3); }也就是说当解析默认域名checkip.dyndns.com 失败时MyIpAdd 构造函数会直接 exit(-3)从而把整个调用MyIpAdd函数的进程退出。MyIpAdd 构造函数会把DNS/socket/connect失败当成致命错误直接退出整个进程。五、修复MyIpAdd源码里的退出bug修改 MyIpAdd 源码把MyIpAdd::MyIpAdd() 里的 exit(...) 改成“失败但不退出进程”的形式然后重新编译 libMyIpAdd.so就能解决调用MyIpAdd的进程退出问题。比如修改为if (host nullptr) { ip ; return; }或者更完整一点if (host nullptr) { if (buf) free(buf); if (sk 0) close(sk); ip ; return; }修复后整个MyIpAdd::MyIpAdd()函数改为MyIpAdd::MyIpAdd() { sk socket(AF_INET, SOCK_STREAM, 0); if (sk 0) { if (DEBUG) cout Socket error endl; return; } if (DEBUG) cout Socket creation OK endl; host gethostbyname(addr.c_str()); if (host nullptr || host-h_addr nullptr) { if (DEBUG) cout Bad host addr endl; close(sk); sk -1; return; } addrin.sin_family AF_INET; addrin.sin_port htons(80); addrin.sin_addr.s_addr *(reinterpret_castunsigned int*(host-h_addr)); if (connect(sk, reinterpret_caststruct sockaddr *(addrin), sizeof(addrin))0){ if (DEBUG) cout Connection Failed endl; close(sk); sk -1; return; } if (DEBUG) cout Connection OK endl; string msg GET / HTTP/1.1\r\nHost: addr \r\nConnection: close\r\n\r\n; if (send(sk, msg.c_str(), msg.length(), 0) 0) { if (DEBUG) cout Send Failed endl; close(sk); sk -1; return; } ssize_t ret 0; string html; char read_buf[1024]; while((ret read(sk, read_buf, sizeof(read_buf))) 0) { html.append(read_buf, ret); } close(sk); sk -1; liststring cont; split(html,cont,\n); size_t r 0; for(auto line : cont) { if (line.length()20) { if ((r line.find(Current IP Address:))!string::npos) { string a line.substr(r20); a a.substr(0,a.find()); if (DEBUG) cout a endl; ip a; } } } }六、反思我在某个项目中为了获取公网ip使用了MyIpAdd::MyIpAdd库。但是它的源码内部有异常退出的bug导致我的程序一直偶发挂掉。所以这给我的启发是1.尽量用多人用的开源库小众的开源库没什么人用往往有很多bug2.一定要有能阅读开源库代码的能力这样万一开源库出现问题的时候你才能修改这些bug。

相关新闻

AI 模型水印与溯源技术深度解析:从 Kirchenbauer 绿名单到 SynthID 的内容可信认证与知识产权保护体系

AI 模型水印与溯源技术深度解析:从 Kirchenbauer 绿名单到 SynthID 的内容可信认证与知识产权保护体系

AI 模型水印与溯源技术深度解析:从 Kirchenbauer 绿名单到 SynthID 的内容可信认证与知识产权保护体系 核心痛点:随着 ChatGPT、Claude、Gemini 等大模型深度融入内容生产与软件工程链路,AI 生成文本/图像/视频的真实性鉴别、模型本身的知识产权归属、训练数据的合法溯源成为…

2026/10/4 17:00:47 阅读更多 →
智能体蜂群实验:新框架性能提升,不同模型组合成本差异巨大!

智能体蜂群实验:新框架性能提升,不同模型组合成本差异巨大!

Cursor产品导航Cursor提供多种功能与服务,包括产品(智能体、云端、移动端、自动化、CLI、应用市场、代码审查)、企业、定价、资源(更新日志、Blog、文档、社区、帮助、工作坊、论坛、招聘)等板块,还有登录、…

2026/10/6 9:40:17 阅读更多 →
“阅后即焚”的PrivateBin与乌龙事件

“阅后即焚”的PrivateBin与乌龙事件

网管小贾 / sysadm.cc最近新上任的薛总,虽是一介女流,却是雷厉风行,言谈举止一丝不苟,颇有高端职场女性的风范。 听有人说,她可是董事长亲自指派来这当总经理的,嗯,怎么说我也应该巴结好啊&…

2026/10/14 2:49:21 阅读更多 →

最新新闻

Hart主模式协议栈实现:从帧结构到主站轮询的完整落地路径

Hart主模式协议栈实现:从帧结构到主站轮询的完整落地路径

简介:这份资源是面向工业自动化通信开发者的HART主模式协议栈实现代码包,适合已具备嵌入式C基础、需要为智能仪表或控制系统集成HART通信能力的工程师参考。HART协议在4-20mA模拟信号上叠加FSK数字信号,实现模拟与数字共线传输,主…

2026/10/15 17:36:55 阅读更多 →
零基预算怎么落地才不翻车?6步方法论理清口径与流程

零基预算怎么落地才不翻车?6步方法论理清口径与流程

零基预算怎么落地才不翻车?6步方法论理清口径与流程零基预算(ZBB)的口号是"每年从零开始",但真从零开始的企业几乎没有,也很少有企业能撑过次年。翻车的原因通常不是理念不对,而是把它当成了一次…

2026/10/15 17:36:55 阅读更多 →
文件命令实战指南:从批量重命名到高效清理的完整方案

文件命令实战指南:从批量重命名到高效清理的完整方案

文件的应用命令:从日常整理到批量处理,一套思路搞定九成文件场景无论你是开发者、运维,还是日常需要和电脑较劲的办公族,总有一天会被文件逼到墙角:下载了一整年的混乱文档找不到版本、一个目录下面上万张图片要转格式…

2026/10/15 17:36:55 阅读更多 →
MFC调用C# DLL的跨平台桥接实战:C++/CLI封装指南

MFC调用C# DLL的跨平台桥接实战:C++/CLI封装指南

简介:本资源是一份面向C/MFC开发者与.NET跨语言集成学习者的实战型技术包,聚焦解决Windows平台下MFC应用程序调用C#编写的托管DLL这一典型互操作难题。资源包含完整可运行的工程实例,覆盖C# DLL封装、P/Invoke接口定义、MFC项目配置、类型映射…

2026/10/15 17:36:55 阅读更多 →
FastAPI 中 JWT 的基本使用与实践

FastAPI 中 JWT 的基本使用与实践

1. 引言 JWT(JSON Web Token)是目前最流行的无状态认证方案之一。在 FastAPI 中,结合 python-jose 与 passlib 可以快速实现基于 JWT 的用户认证与授权。本文将从零开始,带你掌握 FastAPI 中 JWT 的基本使用与实践。 2. 环境准备 …

2026/10/15 17:36:55 阅读更多 →
从半加器到超前进位:加法器设计原理与Verilog实现

从半加器到超前进位:加法器设计原理与Verilog实现

1. 从半加器到全加器:为什么需要两级结构 很多人学数字电路,学到加法器这一节就开始犯迷糊。教材上先讲半加器,再讲全加器,然后告诉你全加器可以由两个半加器加一个或门拼出来。但为什么要这么拼?直接用一个电路把三个…

2026/10/15 17:35:54 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →