请告诉我背后得到的物理IP地址的伎俩?(Whats the trick behind getting

2019-06-26 11:28发布

我怎样才能得到相同的IP地址,我得到当我去“ http://www.whatsmyip.org/ ”使用C ++和Winsock库?

我知道如何让“127.0.0.1”和路由器IP“192.168.1.103” ......但是当我到“ http://www.whatsmyip.org/ ”我知道“65.55.105.132” ...

我怎样才能做到这一点?

Answer 1:

在一般的方式 - 你不能。 你可以打开HTTP连接到whatmyip和分析结果。 或者像贾斯汀建议在评论中,使用http://www.whatismyip.com/automation/n09230945.asp并节约解析和带宽。 但最终,这只会给你的NAT /代理/知识产权不管这是你和whatsmyip之间。 该地址只能通过代理连接到您的计算机。

没有取回您的路由器面向Internet的IP地址(也就是你所看到的65.55.105.132 IP)。即使你可以,没有理由认为不可能有内廷的更多层的方式获得的通用方法。



Answer 2:

你不能。

http://www.whatsmyip.org告诉你的IP地址,当你谈论到它,它看到的。 这可能会看到你的,或代理服务器或NAT盒,或其他任何东西。 有没有办法让你知道。

你想达到什么目的?



Answer 3:

有没有办法做到这一点不使用的东西,是你的网络之外。

返回的地址是计算机和外部世界之间的第一个公网IP地址。 10.,192.168。 ,172 [16-31]。*的IP地址为“私有”,不应该被转发完好任何非私有IP地址。

在某些时候,私有IP地址必须链接到一个公网IP地址。 在从电脑到whatsmyip.com网站路径中的第一个公网IP地址是什么显示的页面上。 诀窍是,您的计算机可能有一个公网IP,或者可能有跳电脑/交换机/路由器具有私有IP的,直到有最后一个公网IP的一些数字。 有没有办法知道跳的,这个数字,并根据网络上的路由可以从一个请求的每个时间(不可能用于家庭网络,但更可能在改变到另一个,有migth是一个不同的跳数公司网络)。

拿到第一个公网IP地址的唯一方法是发送一个数据包到是公共地址,和微量元素,它走的路线。 一个复杂的网络上再次...这条路线可以(不)的变化。

如果您有正在试图解决一个具体的问题,有可能是一个更好的答案。



Answer 4:

正如其他人所说,你需要网络上的第三方,如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)


Answer 5:

正如其他人所说,有可能不是一个简单的/伟大的解决方案。 一个(虽然哈克)解决方案可能是掏出到“tracert的”系统调用。 例如:

tracert google.com

这个调用将在您的PC和google.com之间返回所有的路由器列表(或任何外部网站。)然后,您可以遍历这些结果,考虑是不是第一个节点的私有IP地址范围。 (即,不192.168。,等)

当然,这决不是一个很好的解决方案。 但是,它可能给你你需要的信息。 作为一个测试,你可以简单地从一个命令行运行上面,看看它是否有帮助。



Answer 6:

那么,有没有招果然。 究其原因www.whatsmyip.com可以告诉你的“外部” IP地址是因为他们收到已经经过NAT(网络地址翻译)您的路由器,所以他们看到你的公网IP地址的请求。 这是东西,你不能真正在你的网络上的任意内部主机-除非你有对外部的服务器 ,你可以查询或有一个机制来问你什么路由器的IP地址,它使用使公共互联网请求时..



Answer 7:

哇,这是一个非常快速回复。 谢谢你们的答案,现在我知道更好。

我目前正在建设一个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。

我不知道如果我刚才说的有道理,但是...我是全新的,以服务器......就像我说的,这是学习的目的。

再次感谢。 和好运气给大家。



Answer 8:

获得外部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;
}


文章来源: Whats the trick behind getting the physical IP address?