Автор Гілка: отримати IP з адреси  (Прочитано 3276 раз)

Відсутній Yola

  • Дописувач
  • **
  • дописів: 70
  • Карма: +0/-0
  • http://uk.wikipedia.org/wiki/User:Igor_Yalovecky
Хочу написати дещо, щоб полегшити роботу з перекладами в Вікі. Для цього треба вивантажити сторінку вікі. Перед цим потрібно отримати IP адресу. Я роблю це так:

#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[]) {
    struct hostent *lh = gethostbyname("uk.wikipedia.org");
      struct in_addr addr;

    if (lh->h_addrtype == AF_INET) {
            int i = 0;
            while (lh->h_addr_list[i]) {
                  addr.s_addr = *(u_long *) lh->h_addr_list[i++];
              cout << i << ": " << inet_ntoa(addr) << endl;
            }
      }
отримує вірний ip - 91.198.174.225 , але коли вбиваю його в адресний рядок, то отримаю невідомо шо. Що не так?

Може вони там зумисне щось замутили, щоб ботами не навантажували сервери, але як тоді оглядач працює?
« Змінено: 2012-04-19 20:59:34 від Yola »

Відсутній Дмитро Редчук

  • Кореспондент
  • ***
  • дописів: 104
  • Карма: +0/-0
Re: отримати IP з адреси
« Відповідей #1 : 2012-04-19 21:18:13 »
HTTP/1.1 протокол працює так.

На потрібну адресу переглядач (чи Ви — зайшовши телнетом на порт 80) шле запит:
GET / HTTP/1.1
Host: uk.wikimedia.org
\n

(це мінімальний запит, реальний помітно довший; замість / може бути сторінка — /index.html тощо)

Справа в тому, що на одній адресі може бути дуже багацько серверів, у кожного своє ім’я. Це зветься Virtual Hosts.
«Критика має бути конструктивною. Інакше вона деструктивна» ©
Щось не так? — Зроби так.

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: отримати IP з адреси
« Відповідей #2 : 2012-04-19 21:31:09 »
Нащо вам це робити мануально, тим більше з C??

wget -O output.html http://uk.wikimedia.org/page/...

Це збереже вказаний url у вказаний файл (можете зробити -O -, щоб спрямувати у stdout і потім передати своїй програмі через конвеєр), причому автоматично зробить будь-які перенаправлення (відповідь 403), якщо такі будуть.

Якщо дуже-дуже хочеться писати у С роботу з вебом (що я б не рекомендував робити), то використайте хоча б той же libcurl.

Edit:
Вивантажити — мається на увазі викласти на сервер?
Тоді або
wget --post-data="bla-bla-bla"
або
wget --post-file="foo.txt"
або один з варіантів WWW::Mechanize (я б робив у перлі, але існують варіанти для інших мов).

P.S. WWW::Mechanize — це просто! ;)
use WWW::Mechanize;

my $m = WWW::Mechanize -> new ( autocheck => 1 );

$m -> get ( "http://uk.wikimedia.org" );
$m -> follow_link ( text => "Log in / create account" );
$m -> form_name ( "userlogin" );
$m -> field ( "wpName", "foouser" );
$m -> field ( "wpPassword", "bazsecret" );
$m -> click ();

$m -> get ( "http://uk.wikimedia.org/$ARGV[1]" );
# and so on
Це (теоретично, не тестував) має вас залогінити і перейти на сторінку, вказану у аргументі. Далі у тому ж дусі.

P.P.S. Повівся на пост Дмитра, і написав для wikimedia, перевіряти wikipedia ліньки, але все що там може змінитися — назви кнопок та полів форми...
« Змінено: 2012-04-19 22:24:43 від ISBear »

Відсутній Yola

  • Дописувач
  • **
  • дописів: 70
  • Карма: +0/-0
  • http://uk.wikipedia.org/wiki/User:Igor_Yalovecky
Re: отримати IP з адреси
« Відповідей #3 : 2012-04-23 00:19:08 »
отримує вірний ip - 91.198.174.225 , але коли вбиваю його в адресний рядок, то отримаю невідомо шо. Що не так?

Може вони там зумисне щось замутили, щоб ботами не навантажували сервери, але як тоді оглядач працює?

Виявляється треба було розібратись із протоколом HTTP. А саме, як створювати заголовки запитів і розбирати заголовки відповідей.

GET http://stackoverflow.com/questions HTTP/1.1\r\nHost: stackoverflow.com:80\r\nConnection: close\r\n\r\n

Обов’язково порожній рядок наприкінці, типу позначка завершення заголовка.

Якщо кому цікаво можу порадити O'Reilly  "HTTP The Definitive Guide" - можна вивантажити з якогось торента. І http://tools.ietf.org/html/rfc2616.
« Змінено: 2012-04-23 17:19:11 від Yola »