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/7/22 23:22:11 阅读更多 →
智能体蜂群实验:新框架性能提升,不同模型组合成本差异巨大!

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

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

2026/7/22 23:22:11 阅读更多 →
“阅后即焚”的PrivateBin与乌龙事件

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

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

2026/7/22 23:22:11 阅读更多 →

最新新闻

本地私密 AI 工具 OpenClaw 安装教程 数据本地运行更安全(含安装包)

本地私密 AI 工具 OpenClaw 安装教程 数据本地运行更安全(含安装包)

🦞OpenClaw 2.7.9 最新部署教程|零基础搭建桌面 AI 自动化数字员工 适配平台:Windows10/11 64 位、macOS12 及以上 稳定版本:v2.7.9 特点✨:全可视化操作、零代码部署、全自动环境配置,适合新手入门 &…

2026/7/23 0:05:27 阅读更多 →
Redis何时会成为“拖油瓶“?深度解析Redis拖垮应用程序的十大致命场景

Redis何时会成为“拖油瓶“?深度解析Redis拖垮应用程序的十大致命场景

引言:Redis的双刃剑特性 在现代应用架构中,Redis几乎已经成为标配。它以其卓越的性能、丰富的数据结构和简单易用的API,成为了缓存、会话存储、消息队列等场景的首选。然而,正是这种"好用"的特性,让很多开发…

2026/7/23 0:05:26 阅读更多 →
非升即走扎心真相:大部分青椒三年没成果直接走人

非升即走扎心真相:大部分青椒三年没成果直接走人

现在从头部双一流到地方普通本科,非升即走已经是高校通用的考核规则。绝大多数院校都划死了硬性红线:聘期之内必须拿到国自然青年项目、产出要求数量的高水平论文,三年期限到了没达标,不续聘、直接解约走人。不少青年青椒白天排满…

2026/7/23 0:04:26 阅读更多 →
AI课程论文怎么写不撞车?2026年实测:一晚上搞定3000字,查重AIGC双达标

AI课程论文怎么写不撞车?2026年实测:一晚上搞定3000字,查重AIGC双达标

【一句话答案】课程论文用AI写最怕"全班撞车AI率超标",毕业之家AI(www.biye.com)的ai生成课程论文功能按个性化选题定向生成、内置双检优化,实测3000字课论一晚上完成,查重率和AIGC率双双低于学校红线。一、…

2026/7/23 0:04:26 阅读更多 →
[Android] 可视化音乐制作 -短视频超火的音乐视频制作工具

[Android] 可视化音乐制作 -短视频超火的音乐视频制作工具

[Android] 可视化音乐制作 -短视频超火的音乐视频制作工具 链接:https://pan.xunlei.com/s/VOy7xOpSlVN0N8AWBUpn13U6A1?pwdcss3# 一键生DIY律动音频特效,多种炫酷波形样式选择,搭配背景音乐快速,作简单,短视频创…

2026/7/23 0:04:26 阅读更多 →
最新量化实现前,先让AI检查逻辑参数和流程缺口

最新量化实现前,先让AI检查逻辑参数和流程缺口

从手工交易转向量化表达时,很多问题看起来像代码问题,实际上先是规则问题。只要规则没有讲清,流程没有闭合,再熟悉实现方式也会反复返工。AI 可以帮助读者提前检查这些缺口,让注意力回到规则本身。让 AI 先帮你把问题问…

2026/7/23 0:03:26 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻