我怎样才能得到相同的IP地址,我得到当我去“ http://www.whatsmyip.org/ ”使用C ++和Winsock库?
我知道如何让“127.0.0.1”和路由器IP“192.168.1.103” ......但是当我到“ http://www.whatsmyip.org/ ”我知道“65.55.105.132” ...
我怎样才能做到这一点?
我怎样才能得到相同的IP地址,我得到当我去“ http://www.whatsmyip.org/ ”使用C ++和Winsock库?
我知道如何让“127.0.0.1”和路由器IP“192.168.1.103” ......但是当我到“ http://www.whatsmyip.org/ ”我知道“65.55.105.132” ...
我怎样才能做到这一点?
在一般的方式 - 你不能。 你可以打开HTTP连接到whatmyip和分析结果。 或者像贾斯汀建议在评论中,使用http://www.whatismyip.com/automation/n09230945.asp并节约解析和带宽。 但最终,这只会给你的NAT /代理/知识产权不管这是你和whatsmyip之间。 该地址只能通过代理连接到您的计算机。
没有取回您的路由器面向Internet的IP地址(也就是你所看到的65.55.105.132 IP)。即使你可以,没有理由认为不可能有内廷的更多层的方式获得的通用方法。
你不能。
http://www.whatsmyip.org告诉你的IP地址,当你谈论到它,它看到的。 这可能会看到你的,或代理服务器或NAT盒,或其他任何东西。 有没有办法让你知道。
你想达到什么目的?
有没有办法做到这一点不使用的东西,是你的网络之外。
返回的地址是计算机和外部世界之间的第一个公网IP地址。 10.,192.168。 ,172 [16-31]。*的IP地址为“私有”,不应该被转发完好任何非私有IP地址。
在某些时候,私有IP地址必须链接到一个公网IP地址。 在从电脑到whatsmyip.com网站路径中的第一个公网IP地址是什么显示的页面上。 诀窍是,您的计算机可能有一个公网IP,或者可能有跳电脑/交换机/路由器具有私有IP的,直到有最后一个公网IP的一些数字。 有没有办法知道跳的,这个数字,并根据网络上的路由可以从一个请求的每个时间(不可能用于家庭网络,但更可能在改变到另一个,有migth是一个不同的跳数公司网络)。
拿到第一个公网IP地址的唯一方法是发送一个数据包到是公共地址,和微量元素,它走的路线。 一个复杂的网络上再次...这条路线可以(不)的变化。
如果您有正在试图解决一个具体的问题,有可能是一个更好的答案。
正如其他人所说,你需要网络上的第三方,如whatismyip.com告诉你,你的IP地址。 我只是想补充一点,你不应该依赖于whatismyip.com,相反,你应该考虑建立自己的,因为这样的服务往往来去或更改谁可以连接到它们(见这个例子对于为什么会发生)。
您可以轻松地设置一个服务只为您的应用程序做这个免费的,也就是说,基于谷歌AppEngine上。 必要的请求处理程序可能看起来是这样的:
from google.appengine.ext import webapp
class RemoteAddressHandler(webapp.RequestHandler):
def get(self):
self.response.out.write(self.request.remote_addr)
正如其他人所说,有可能不是一个简单的/伟大的解决方案。 一个(虽然哈克)解决方案可能是掏出到“tracert的”系统调用。 例如:
tracert google.com
这个调用将在您的PC和google.com之间返回所有的路由器列表(或任何外部网站。)然后,您可以遍历这些结果,考虑是不是第一个节点的私有IP地址范围。 (即,不192.168。,等)
当然,这决不是一个很好的解决方案。 但是,它可能给你你需要的信息。 作为一个测试,你可以简单地从一个命令行运行上面,看看它是否有帮助。
那么,有没有招果然。 究其原因www.whatsmyip.com可以告诉你的“外部” IP地址是因为他们收到已经经过NAT(网络地址翻译)您的路由器,所以他们看到你的公网IP地址的请求。 这是东西,你不能真正在你的网络上的任意内部主机-除非你有对外部的服务器 ,你可以查询或有一个机制来问你什么路由器的IP地址,它使用使公共互联网请求时..
哇,这是一个非常快速回复。 谢谢你们的答案,现在我知道更好。
我目前正在建设一个C ++的HTTP服务器用于学习目的。 我做到转发的IP地址,我得到当我到“whatismyip.org”我的私有IP“192.168.1.3”作出任何外部调用是由我的服务器处理。 所以,几乎我创建了一个简单的C ++服务器。 不过我使用一种叫做无IP DUC翻译“yellowyackets.no-ip.org”到我的公网IP,这样人们就不必记住我的公网IP。 但由于IP改变我跟踪到什么是我的新的IP,使人们能够保持连接到我的...所以我得去“whatsmyip.org”知道我的新的IP。 然后,我想创建一个程序,它实际上告诉我,这就是我的新的IP。
我不知道如果我刚才说的有道理,但是...我是全新的,以服务器......就像我说的,这是学习的目的。
再次感谢。 和好运气给大家。
获得外部IP的一个C / C ++的方法是使用一个基于网络的IP地址的API工具,下载包含您的IP地址将网页划分为字符数组,并从HTML源代码提取IP地址。 下面是一些Winsock的代码来证明它。 它采用http://api.ipify.org/的在线网络API。
//
// Winsock get external ip address from website api at api.ipify.org
// api.ipify.org
//
#include <string.h>
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cctype>
#include <locale>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
string website_HTML;
locale local;
char ipaddress[16];
int ic=0;
void get_Website(char *url );
char mystring[] = " ";
char seps[] = " ,\t\n";
char *token;
char lineBuffer[200][80] ={' '};
char buffer[10000];
char ip_address[16];
int i = 0, bufLen=0, j=0,lineCount=0;
int lineIndex=0, posIndex=0;
int main( void ){
SYSTEMTIME st;
GetLocalTime(&st);
char *today = new char[32];
memset(today,' ', sizeof(today) );
sprintf(today,"%d-%d-%d", st.wYear , st.wMonth , st.wDay);
memset(buffer,'\0',sizeof(buffer));
get_Website("api.ipify.org" );
for (size_t i=0; i<website_HTML.length(); ++i) website_HTML[i]= tolower(website_HTML[i],local);
token = strtok( buffer , seps );
while( token != NULL ){
strcpy(lineBuffer[lineIndex],token);
int dot=0;
for (int ii=0; ii< strlen( lineBuffer[lineIndex] ); ii++ ){
if (lineBuffer[lineIndex][ii] == '.') dot++;
if (dot>=3){
dot=0;
strcpy(ip_address,lineBuffer[lineIndex]);
}
}
token = strtok( NULL, seps );
lineIndex++;
}
cout<<"Your IP Address is "<< ip_address<<" \n\n";
return 0;
}
void get_Website(char *url ){
WSADATA wsaData;
SOCKET Socket;
SOCKADDR_IN SockAddr;
int lineCount=0;
int rowCount=0;
struct hostent *host;
char *get_http= new char[256];
memset(get_http,' ', sizeof(get_http) );
strcpy(get_http,"GET / HTTP/1.1\r\nHost: ");
strcat(get_http,url);
strcat(get_http,"\r\nConnection: close\r\n\r\n");
if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0){
cout << "WSAStartup failed.\n";
system("pause");
//return 1;
}
Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
host = gethostbyname(url);
SockAddr.sin_port=htons(80);
SockAddr.sin_family=AF_INET;
SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0){
cout << "Could not connect";
system("pause");
//return 1;
}
send(Socket,get_http, strlen(get_http),0 );
int nDataLength;
while ((nDataLength = recv(Socket,buffer,10000,0)) > 0){
int i = 0;
while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r'){
website_HTML+=buffer[i];
i += 1;
}
}
closesocket(Socket);
WSACleanup();
delete[] get_http;
}