当前位置:首页 > > 充电吧
[导读]利用IP地址得到物理位置: 原理:这里要讲的就是通过socket去发送GET请求,发送至转换的网站,然后解析其中的内容,这里GET的是http://ip.chinaz.com/网站。 步骤

利用IP地址得到物理位置: 原理:这里要讲的就是通过socket去发送GET请求,发送至转换的网站,然后解析其中的内容,这里GET的是http://ip.chinaz.com/网站。 步骤: 先使用Wireshark抓包工具,抓取查询http://ip.chinaz.com/的封包,然后就可以模仿这个封包,利用socket发送GET请求,获取IP地址的物理地址信息了。

从上面可以得到要发送的封包的具体格式:

GET /?IP=223.124.1.232 HTTP/1.1rn
Host: ip.chinaz.comrn
Connection: keep-alivern
Upgrade-Insecure-Requests: 1rn
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36rn
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8rn
Accept-Language: zh-CN,zh;q=0.8rnrn

使用socket进行send发送时,缓冲区填入上面的固定格式即可,这里要改的只有?IP=你要查询的IP地址
这里还要强调一点,在上面的封包中最好不要加上Accept-Encoding: gzip, deflate, sdchrn,除非你会使用代码解压gzip压缩包,否则recv接收服务器响应回来的文档的时候,发送的是gzip压缩过的数据。由于我们只是查询而已,所以去掉这个字段,让服务器直接发回来html文档,然后我们解析就可以了。

下面是一个解析http://ip.chinaz.com/获取物理地址的例子:

//名字转IP(OK,New)
char* NET::GetIp(char* szhostname)
{
    char* szip = NULL;
    char* ipbit = NULL;
    hostent* ipstr = NULL;

    szip = new char[30];
    if (!szip)
        goto Err;
    ZeroMemory(szip, 30);
    ipstr = gethostbyname(szhostname);
    if (ipstr == NULL)
        goto Err;
    ipbit = inet_ntoa(*(in_addr*)ipstr->h_addr);
    if (ipbit == NULL)
        goto Err;
    memcpy(szip, ipbit, strlen(ipbit));


    return szip;
Err:
    return NULL;
}

//连接HTTP服务器(OK,Connected)
SOCKET NET::ConnectHttpServer(char* szip)
{
    SOCKET szclient_socket = 0;

    szclient_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (INVALID_SOCKET == szclient_socket)
        goto Err;
    //连接服务器
    SOCKADDR_IN info;
    info.sin_port = htons(80);
    info.sin_family = AF_INET;
    info.sin_addr.S_un.S_addr = inet_addr(szip);
    if (0 != connect(szclient_socket, (SOCKADDR*)&info, sizeof(SOCKADDR)))
        goto Err;

    //返回
    return szclient_socket;
Err:
    if (szclient_socket != NULL && szclient_socket != INVALID_SOCKET)
    {
        closesocket(szclient_socket);
        szclient_socket = 0;
    }
    return 0;
}

//设置套接字缓冲区大小(OK)
BOOL NET::SetSocketInfo(SOCKET szsocket,int uBufferSize)
{
    if (SOCKET_ERROR == setsockopt(szsocket, SOL_SOCKET, SO_RCVBUF, (char*)&uBufferSize, sizeof(int)))
        goto Err;
    if (SOCKET_ERROR == setsockopt(szsocket, SOL_SOCKET, SO_SNDBUF, (char*)&uBufferSize, sizeof(int)))
        goto Err;
    return TRUE;
Err:
    return FALSE;
}


//UTF8转ANSI字符串(OK,New)
char* STR::Utf8ToAnsi(char* utf8,int len,char szcc)
{
    BOOL szok = FALSE;
    int szlen = 0;
    char* szretstr = NULL;
    wchar_t* whar_str = NULL;
    //UTF8转UNICODE
    szlen = MultiByteToWideChar(CP_UTF8, 0, utf8, len, NULL, 0);
    if (szlen <= 0)
        goto Err;
    szlen += 1;
    whar_str = new wchar_t[szlen];
    if (!whar_str)
        goto Err;
    ZeroMemory(whar_str, szlen * sizeof(wchar_t));
    MultiByteToWideChar(CP_UTF8, 0, utf8, len, whar_str, szlen);
    if (GetLastError() != 0)
        goto Err;
    //UNICODE转ANSI
    szlen = WideCharToMultiByte(CP_ACP, 0, whar_str, len, NULL, 0,&szcc,&szok);
    if (szlen <= 0)
        goto Err;
    szlen += 1;
    szretstr = new char[szlen];
    if (!szretstr)
        goto Err;
    ZeroMemory(szretstr, szlen * sizeof(char));
    WideCharToMultiByte(CP_ACP, 0, whar_str, len, szretstr, szlen, &szcc, &szok);
    if (GetLastError() != 0)
        goto Err;
    if (whar_str)
    {
        delete[] whar_str;
        whar_str = NULL;
    }
    return szretstr;
Err:
    if (whar_str)
    {
        delete[]whar_str;
        whar_str = NULL;
    }
    return NULL;
}


//获取物理地址(OK,ip.chinaz.com,New)
char* GET_POINT::GetPoint(char* ip_address,char* get_ip_de_host_name)
{
    int szlen = 0;
    char* szPoint = NULL;
    char* szTemp = NULL;
    char* szTemp2 = NULL;
    char* szTemp3 = NULL;
    char* get_host_name_ip = NULL;
    SOCKET http_client_socket = NULL;
    char packet[400] ="GET /";
    strcat(packet, "?IP=");
    strcat(packet, ip_address);
    strcat(packet, " HTTP/1.1rn" 
    "Host: "
    );
    strcat(packet, get_ip_de_host_name);
    strcat(packet, "rn" 
        "Connection: keep-alivern" 
        "Cache-Control: max-age=0rn" 
        "Upgrade-Insecure-Requests: 1rn" 
        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8rn" 
        "Accept-Language: zh-CN,zh;q=0.8rnrn"
    );


    char* recv_buffer = NULL;
    //代码开始
    recv_buffer = new char[50000];
    if (!recv_buffer)
        goto Err;
    ZeroMemory(recv_buffer, 50000);
    //返回解析物理地址的主机的IP地址
    get_host_name_ip = NET::GetIp(get_ip_de_host_name);
    if (get_host_name_ip == NULL)
        goto Err;

    //连接服务器
    http_client_socket = NET::ConnectHttpServer(get_host_name_ip);
    if (http_client_socket == 0)
        goto Err;

    //设置缓冲区大小
    if (!NET::SetSocketInfo(http_client_socket, 30000))
        goto Err;
    if (send(http_client_socket, packet, strlen(packet), 0) <= 0)
        goto Err;
    if (recv(http_client_socket, recv_buffer, 50000, 0) "); //???
    if (szTemp == NULL)
        goto Err;
    szTemp2 = strchr(szTemp, '<');
    if (szTemp2 == NULL)
        goto Err; 
    szlen = szTemp2 - szTemp;
    if (szlen <= 0)
        goto Err;
    szlen += 1;
    szPoint = new char[szlen];
    if (!szPoint)
        goto Err;
    ZeroMemory(szPoint, szlen);
    memcpy(szPoint, szTemp, szlen - 1);

    if (get_host_name_ip)
    {
        delete[]get_host_name_ip;
        get_host_name_ip = NULL;
    }
    if (http_client_socket)
    {
        closesocket(http_client_socket);
        http_client_socket = 0;
    }
    if (recv_buffer)
    {
        delete[]recv_buffer;
        recv_buffer = NULL;
    }
    if (szTemp3)
    {
        delete[]szTemp3;
        szTemp3 = NULL;
    }
    return szPoint;
Err:
    if (get_host_name_ip)
    {
        delete[]get_host_name_ip;
        get_host_name_ip = NULL;
    }
    if (http_client_socket)
    {
        closesocket(http_client_socket);
        http_client_socket = 0;
    }
    if (recv_buffer)
    {
        delete[]recv_buffer;
        recv_buffer = NULL;
    }
    if (szTemp3)
    {
        delete[]szTemp3;
        szTemp3 = NULL;
    }
    return NULL;
}

实现:

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭