Автор Тема: ip2int и int2ip  (Прочетена 2102 пъти)

runtime

  • Напреднали
  • *****
  • Публикации: 807
  • Distribution: Ubuntu 14.04
  • Window Manager: Unity
  • LZ1DOT
    • Профил
    • WWW
ip2int и int2ip
« -: Oct 26, 2009, 14:17 »
Здравейте,
  цял ден си търся функция, която да ми конвертира ip в int и обратно за gcc и не намирам пример и не намирам..
Моля, ако някой му се занимава да погледне или да каже как да си я направя.

За съжаление се опитвам да направя някои работи и до някъде успявам, но познанията ми по C/GCC са доста малки и не мога да си я съчиня сам.

Ако не Ви се занимава не карам никой! Просто ако някой може да удари едно рамо ще съм му много благодарен.
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Re: ip2int и int2ip
« Отговор #1 -: Oct 26, 2009, 14:36 »
Функция на C или математическа формула?
Код
GeSHi (C):
  1. //A.B.C.D -> (A<<24)|(B<<16)|(C<<8)|D
  2. // X -> ((X>>24)&0xFF).((X>>16)&0xFF).((X>>8)&0xFF).(X&0xFF)
http://en.wikipedia.org/wiki/File:Ipv4_address.svg
« Последна редакция: Oct 26, 2009, 14:42 от bop_bop_mara »
Активен

hyankov

  • Напреднали
  • *****
  • Публикации: 86
    • Профил
Re: ip2int и int2ip
« Отговор #2 -: Oct 26, 2009, 15:04 »
Варианти има, но има два въпроса на които трябва да отговориш, за да ти се помогне.
1) какво разбираш под типа IP, стринг, масив от интегрален тип, структура  или нещо друго.
2) кой ще използва конвертирания адрес, тъй като в някои случаи ще ти се наложи след конвертирането да се извика някоя от любимите ми магически функции от семеиството htons(), htonl(), ntohs(), ntohl() ( http://beej.us/guide/bgnet/output/html/multipage/htonsman.html ).

Успех!
Активен

runtime

  • Напреднали
  • *****
  • Публикации: 807
  • Distribution: Ubuntu 14.04
  • Window Manager: Unity
  • LZ1DOT
    • Профил
    • WWW
Re: ip2int и int2ip
« Отговор #3 -: Oct 26, 2009, 16:20 »
@bop_bop_mara - благодаря, това ме насочи към:

Код
GeSHi (C):
  1. int iptoul (const char *ip, unsigned long *plong)
  2. {
  3.    char *next = NULL;
  4.    const char *curr = ip;
  5.    unsigned long tmp;
  6.    int i, err = 0;
  7.  
  8.    *plong = 0;
  9.    for (i = 0; i < NUM_OCTETTS; i++) {
  10.      tmp = strtoul(curr, &next, 10);
  11.      if (tmp >= 256
  12.          || (tmp == 0 && next == curr))
  13.      {
  14.        err++;
  15.        break;
  16.      }
  17.      *plong = (*plong << 8) + tmp;
  18.      curr = next + 1;
  19.    }
  20.  
  21.    if (err) {
  22.      return 1;
  23.    }
  24.    else {
  25.      return 0;
  26.    }
  27. }


@hyankov - стринг, за сега се уча само да смятам с него за това ми и трябваше... Чисто учебна цел :) Няма да правя нищо конкретно с него. Благодаря и на теб


П.С. сега остана да го обърна обратно някак... :)
Активен

hyankov

  • Напреднали
  • *****
  • Публикации: 86
    • Профил
Re: ip2int и int2ip
« Отговор #4 -: Oct 26, 2009, 16:55 »
Супер, дерзай при това положение. За човек, който сега се учи, смело използваш указатели и битови операции (според мен това е начина :) ) иначе след като го получаваш във стринг, може би ще ти е интересно да разгледаш функциите sscanf и sprintf. Виждам, че и сам добре си разкопаваш нещата, което е добре, но все пак да ти дам едно примерче:

Код
GeSHi (C):
  1. // Приемаме че по някакъв начин си стигнал до този вход
  2. char *ip_str="192.168.1.1"
  3. int ip_int[4];
  4. // Справяш се с адресната аритметика, така че смело...
  5. sscanf(ip_str, "%d.%d.%d.%d", ip, ip+1, ip+2, ip+3);
  6. // ip_int изглежда така = {192, 168, 1, 1}
  7. // яко е и мисля че ще се впише в твойта концепция, макар че признавам не се задълбочих в кода ти
  8.  

Разбира се аз бих ползвал char, а не int, за да не се разхищава излишно памет, но това са си лично мои изкривявания. Ползвайки получените стойности можеш да ползваш първия метод на боп_боп_мара. Обратната операция също би се улеснила със sprintf (приниципа е същия).

Поздрави,
Ицо
« Последна редакция: Oct 27, 2009, 00:57 от VladSun »
Активен

runtime

  • Напреднали
  • *****
  • Публикации: 807
  • Distribution: Ubuntu 14.04
  • Window Manager: Unity
  • LZ1DOT
    • Профил
    • WWW
Re: ip2int и int2ip
« Отговор #5 -: Oct 26, 2009, 17:11 »
Ще го разгледам  :) А аз не ги ползвам - уча се, а те така учат по сайтовете  ;D ;D
Важното е да има упоритост...

П.С. Мога да работя на Delphi добре, но под Linux онова изчадие Lazarus е ужасно... На C не мога да пиша и ред :-D
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: ip2int и int2ip
« Отговор #6 -: Oct 26, 2009, 17:47 »
Има си glibc функция за това, нарича се inet_aton()
Активен

"Knowledge is power" - France is Bacon

runtime

  • Напреднали
  • *****
  • Публикации: 807
  • Distribution: Ubuntu 14.04
  • Window Manager: Unity
  • LZ1DOT
    • Профил
    • WWW
Re: ip2int и int2ip
« Отговор #7 -: Oct 27, 2009, 12:32 »
@gateway - много благодаря, кода се съкрати с 40 реда...

Обаче! Някой да си има на идея защо ми връща "Memory allocation failed" и гърми програмката след 10 мин работа по смятане? Позлвам pthread_create за многонишково изпълнение на функцията, може ли да е от това?
« Последна редакция: Oct 27, 2009, 12:35 от run_time »
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: ip2int и int2ip
« Отговор #8 -: Oct 27, 2009, 13:13 »
Дай да видим сорса, нищо не мога да кажа така :)
Активен

"Knowledge is power" - France is Bacon

runtime

  • Напреднали
  • *****
  • Публикации: 807
  • Distribution: Ubuntu 14.04
  • Window Manager: Unity
  • LZ1DOT
    • Профил
    • WWW
Re: ip2int и int2ip
« Отговор #9 -: Oct 27, 2009, 14:29 »
Имаш Л.С. ако системата ги праща защото няма никакъв статус дали е пратено или не?!?
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: ip2int и int2ip
« Отговор #10 -: Oct 27, 2009, 15:09 »
Пратено е даже 2 пъти, трябва и отговор да имаш вече :)
Активен

"Knowledge is power" - France is Bacon

hyankov

  • Напреднали
  • *****
  • Публикации: 86
    • Профил
Re: ip2int и int2ip
« Отговор #11 -: Oct 27, 2009, 15:16 »
Хммм, дали все пак не става въпрос за някой секретен проект за военните или има друга причина да не публикуваш кода, та току виж и другите сме се научили на нещо ;)
Активен

runtime

  • Напреднали
  • *****
  • Публикации: 807
  • Distribution: Ubuntu 14.04
  • Window Manager: Unity
  • LZ1DOT
    • Профил
    • WWW
Re: ip2int и int2ip
« Отговор #12 -: Oct 27, 2009, 16:00 »
Съвсем леко е в разрез с правилата... за това и избягвам да го пусна. Мен лично не ми пречи.
Става въпрос за един socks/proxy скенер, ако администратор каже, че може да го пусна няма проблем :)
Активен

hyankov

  • Напреднали
  • *****
  • Публикации: 86
    • Профил
Re: ip2int и int2ip
« Отговор #13 -: Oct 28, 2009, 17:00 »
Щом е така - ок* :) . Това, което мога да препоръчам като четиво, е следното: http://www.advancedlinuxprogramming.com/alp-folder. Книжката е много добра (по мое скромно мнение), а четвърта глава е точно за нишки, сигурно пропускаш нещо дребно и съм почти сигурeн, че ще намериш отговора там. А дори gat3way вече да ти е помогнал пак бих ти препоръчал да прегледаш материала.

/off-topic *само не разбрах кое точно от правилата на форума нарушаваш, но здраве да е  [_]3
Активен