myip.ru и winapi(с++)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by maked0n, 30 Oct 2011.

  1. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    Здравствуйте, уважаемые форумчане! Вопрос собственно вот в чем: я имею программу, написанную на чистом winapi (с++). мне необходимо получить внешний ip адрес компьютера. в гугле нашел что это можно сделать сокетами. перепробовал кучу примеров - выдает только внутренний ип. тогда я подумал что можно просто обращаться к сайту (к примеру myip.ru) и брать с него внешний ип. это конечно корявенько, но за не имением лучшего и так пойдет. как мне можно взять с него ип? в какую сторону хоть рыть? ибо с сайтами через winapi никогда не работал(
    ЗЫ: если есть другие идеи как получить внешний ип посредством winapi, буду очень благодарен!
     
  2. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    вот к примеру чисто одну строку дает
    http://www.whatismyip.org/
    дальше регулярками выдираешь айпи.
     
  3. sailor_truse

    sailor_truse Banned

    Joined:
    27 Sep 2011
    Messages:
    33
    Likes Received:
    1
    Reputations:
    0
    Dood тру сервис сказал.
    А так гугли winsock2 и http
     
  4. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    DooD, напиши те подробнее пожалуйста как я могу регулярки использовать тут.
    а за сервис спасибо!
    sailor_truse, я гуглил про сокеты, говорю же - выдает внутренний, а не внешний(
     
  5. sailor_truse

    sailor_truse Banned

    Joined:
    27 Sep 2011
    Messages:
    33
    Likes Received:
    1
    Reputations:
    0
    Нет я имею отправить http запрост к тому сервису, и тут даж регулярок не над, прост indexof и тд юзать
     
    1 person likes this.
  6. Ptr

    Ptr New Member

    Joined:
    1 Oct 2011
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Используй WinInet.

    Ящитаю нет такого понятия, как "программа на WinAPI". Она может быть написана с использованием WinAPI, но никак не на самом API :eek:
     
  7. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    я кое-что нашел в гугле и вот что написал:
    Code:
    char* ip()
    {
    	cout << "ip() begin" << endl;
    	char url[] = "http://www.whatismyip.org/";
    	cout << "url = " << url << endl;
    
    	HINTERNET hSession = InternetOpen("Internet Explorer", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
    
    	HINTERNET hUrl;
    	const int bufferSize = 80000;
    	char buffer[bufferSize];
    	DWORD bufferLen;
    
    	for(int i = 0; i < bufferSize; i++)
    	{
    		buffer[i] = '\0';
    	}
    	cout << "buffer = " << buffer << endl;
    
    	hUrl = InternetOpenUrlA(hSession, url, 0, 0, INTERNET_FLAG_NO_COOKIES, 0);
    	InternetReadFile(url, buffer, sizeof(buffer), &bufferLen);
    
    	return buffer;
    }
    но проблема в том, что в buffer ничего не пишется. почему?

    извините, учту Ваши возражения.
     
  8. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    вот тебе на wininet на масме накатал.
    Code:
    .386
    .model flat,stdcall
    option casemap:none
    
    include include\windows.inc
    include include\user32.inc
    include include\kernel32.inc
    include include\wininet.inc
    
    
    includelib lib\user32.lib
    includelib lib\kernel32.lib
    includelib lib\wininet.lib
    
    
    .data
    
     host      db 'http://whatismyip.org',0
      hInstance     dd 0
      AgentUser      db 'hacked',0
      hInternet     dd 0
      hOpenUrl      dd 0
      hConnect      dd 0
    
    
    
     .data?
      ByteWRite     dd ?
      Buffer       dw 4096 dup (?)
    
    
    
    .code
        start:
    
                    invoke  InternetOpen,addr AgentUser,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0
                    mov      hInternet,eax
    
                    invoke  InternetConnect,hInternet,addr host,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,1
                    mov     hConnect,eax
    
                    invoke  InternetOpenUrl,hInternet,addr host,0, 0,INTERNET_FLAG_RELOAD,0
                    mov     hOpenUrl,eax
    
                    invoke  InternetReadFile,hOpenUrl,addr Buffer,addr Buffer,addr ByteWRite
    
    
                    invoke MessageBox,0,addr Buffer,0,0
                    invoke  InternetCloseHandle,hOpenUrl
                    invoke  InternetCloseHandle,hConnect
                    invoke  InternetCloseHandle,hInternet
                    invoke ExitProcess,0
    
    
    end start
     
    #8 DooD, 30 Oct 2011
    Last edited: 31 Oct 2011
    1 person likes this.
  9. ~Shapaev~

    ~Shapaev~ Member

    Joined:
    24 Oct 2009
    Messages:
    29
    Likes Received:
    7
    Reputations:
    0
    Code:
    BOOL InternetReadFile(
      __in   HINTERNET hFile,
      __out  LPVOID lpBuffer,
      __in   DWORD dwNumberOfBytesToRead,
      __out  LPDWORD lpdwNumberOfBytesRead
    );
    
    
    Code:
    InternetReadFile(hUrl, buffer, sizeof(buffer), &bufferLen);
    
     
    1 person likes this.
  10. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    всем спасибо!
     
  11. r3l0c

    r3l0c New Member

    Joined:
    23 Jan 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Кста вот еще -- я закидывал на хост скрипт на пыхе
    <?php
    echo $_SERVER['REMOTE_ADDR'];
    ?>
    , который выдавал ип клиента, и сокетом отправлял гет запрос на хост и все пучком и без лишнего головняка ^^
    //// Мож пригодится кому.