获得自己外网ip地址

hkerzhouds 2009-10-06 11:44:41
怎样编程不用其它网站的帮助获得自己外网ip地址?就是用UPNP协议连接路由器获取那些方法差不多的
...全文
673 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Niteip 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

C/C++ code

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
  int doit(int, char **)
{
char host_name[255];
//获取本地主机名称
if (gethostname(host_name, sizeof(host_name)) == SOC……
[/Quote]

你在开玩笑?
arong1234 2009-10-07
  • 打赏
  • 举报
回复
实际应用中程序很少需要知道自己的外网地址,0.0.0.0就是最合理的本地地址。如果作为管理员,他应该知道哪个地址是外网的。有什么理由需要检测外网地址?
chlaws 2009-10-07
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
  int doit(int, char **)
{
char host_name[255];
//获取本地主机名称
if (gethostname(host_name, sizeof(host_name)) == SOCKET_ERROR) {
printf("Error %d when getting local host name.n", WSAGetLastError());
return 1;
}
printf("Host name is: %sn", host_name);
  //从主机名数据库中得到对应的“主机”
struct hostent *phe = gethostbyname(host_name);//用gethostbyaddr也可以
if (phe == 0) {
printf("Yow! Bad host lookup.");
return 1;
}
  //循环得出本地机器所有IP地址
for (int i = 0; phe->h_addr_list[i] != 0; ++i) {
struct in_addr addr;
memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
printf("Address %d : %sn" , i, inet_ntoa(addr));
}
  return 0;
}
  int main(int argc, char *argv[])
{
WSAData wsaData;
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
return 255;
}
  int retval = doit(argc, argv);
  WSACleanup();
  return retval;
}
飞天御剑流 2009-10-07
  • 打赏
  • 举报
回复
如果在一个比较大型的网络里,还分了很多子网,从客户端连接到互联网出口的路径可能会经过不只一个网关,这就有点麻烦了,真正的外网ip可能在列表中的第二、第三行或者更后。可以考虑让客户端连接一下到外部一个自己设立的网站上,在那网站上可以记录到源地址,再把此地址返回客户端。
hkerzhouds 2009-10-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 theone11 的回复:]
UPNP?楼主既然提到了这个,那是不是要在内网环境中要得知自己的外网地址?如果是这样的话,楼上说的基本都不管用,而4楼说的方法还是需要其它网站的帮助.要得到这个信息还是直接去路由/网关上获取吧.
[/Quote]
对,现在主要就是要编程到路由/网关上获取,用UPNP协议或有其它什么办法没有?
theone11 2009-10-07
  • 打赏
  • 举报
回复
UPNP?楼主既然提到了这个,那是不是要在内网环境中要得知自己的外网地址?如果是这样的话,楼上说的基本都不管用,而4楼说的方法还是需要其它网站的帮助.要得到这个信息还是直接去路由/网关上获取吧.
飞天御剑流 2009-10-06
  • 打赏
  • 举报
回复
漏了打\\
飞天御剑流 2009-10-06
  • 打赏
  • 举报
回复
有一个土方法,如果出口只经过一个网关,可以用tracert命令获得,第一个返回的ip就是你的外网ip,例如:


C:\>tracert -d www.163.com

通过最多 30 个跃点跟踪
到 www.163.com [60.191.80.127] 的路由:

1 <1 毫秒 <1 毫秒 <1 毫秒 219.137.185.12
2 7 ms 7 ms 7 ms 219.137.184.1
3 7 ms 7 ms 7 ms 121.8.132.69
4 11 ms 8 ms 8 ms 61.144.0.189
5 8 ms 7 ms 7 ms 61.144.3.22
6 30 ms 29 ms 23 ms 202.97.26.254
7 29 ms 35 ms 30 ms 61.130.124.58
8 44 ms 58 ms 43 ms 61.164.42.70
9 36 ms 36 ms 35 ms 60.191.80.127

跟踪完成。


219.137.185.12就是外网ip

直接通过命令system( "C:\>tracert -d www.163.com > d:\test.txt" );输出到一个文件里,再分析就行了。
jackyjkchen 2009-10-06
  • 打赏
  • 举报
回复
没法帮你,我连的就是外网,而且我也不懂这方面的

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧