[ Predrag Damnjanovic @ 06.05.2003. 17:25 ] @
Ovaj kod sam ja napisao, a i nasao sam isti takav primer na CodeGuru.com.
Trebao bi da mi izlista sve moje IP adrese.
Medjutim, uvek izlista samo 127.0.0.1, cak i kada sam na Internetu.

Code:

char local_host[256];
struct hostent *lpHostEntry;
struct sockaddr_in sock_addr_in;

char * get_local_ip()
{
   int rv = gethostname(local_host, 256);
   if (rv!=0) return 0;
   lpHostEntry = gethostbyname(local_host);

   for (int i=0; i<10; i++)
   {
      if (lpHostEntry->h_addr_list[i]==0) break;
      memcpy(&sock_addr_in.sin_addr, lpHostEntry->h_addr_list[i], lpHostEntry->h_length);
      printf ( "IP=%s\n", inet_ntoa(sock_addr_in.sin_addr) );
   }
}


Ovaj primer nisam probao na Windowsu, probao sam ga samo iz Linuxa, mada mislim da ne bi trebao to da bude problem, jer su funkcije i strukture kompatabilne.

Postoji li neki drugi nacin da dobijem svoj IP?
Ako sors ne moze da bude kompatabilan, onda dajte sta imate :)

[Ovu poruku je menjao Predrag Damnjanovic dana 07.05.2003. u 14:02 GMT]
[ bm101 @ 07.05.2003. 04:55 ] @
Ja pogledah sad u MSDN kad ono tamo kaze da gethostname() vraca 0 ako je sve ok. Tako da kod tebe u kodu, kad sve prodje kako treba, funkcija ne uradi nista.

Proveri kako stoje stvari na Linux-u, mada sumnjam da je drugacije, ali ...

Uz to evo verzija za Windows koja radi i na netu i u offline rezimu, zasnovane na kodu koji si postovao:

Code:

#include <crtdbg.h>
#include <stdio.h>
#include <windows.h>


char local_host[256];
struct hostent *lpHostEntry;
struct sockaddr_in sock_addr_in;

char * get_local_ip()
{
   int rv = gethostname(local_host, 256);
   //if (rv==0) return 0; // problem ?
   
   if (rv == SOCKET_ERROR)
   {
       int rvErr(0);
       
       rvErr = WSAGetLastError ();

       switch (rvErr)
       {
           case WSAEFAULT:
               printf ("WSAEFAULT\n");
               break;
           case WSANOTINITIALISED:
               printf ("WSANOTINITIALISED\n");
               break;
           case WSAENETDOWN:
               printf ("WSAENETDOWN\n");
               break;
           case WSAEINPROGRESS:
               printf ("WSAEINPROGRESS\n");
               break;
       }
   }

   lpHostEntry = gethostbyname(local_host);

   _ASSERT (lpHostEntry != NULL); // cisto predostroznosti radi :)

   for (int i=0; i<10; i++)
   {
      if (lpHostEntry->h_addr_list[i]==0) break;
      memcpy(&sock_addr_in.sin_addr, lpHostEntry->h_addr_list[i], lpHostEntry->h_length);
      printf ( "%s IP %s\n",local_host, inet_ntoa(sock_addr_in.sin_addr) );
   }
}

void main(void)
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
 
    wVersionRequested = MAKEWORD( 2, 2 );
 
    err = WSAStartup( wVersionRequested, &wsaData );
    
    if ( err != 0 ) {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        return;
    }
 
    get_local_ip ();
}


Toliko od mene ...
[ bokash @ 07.05.2003. 06:46 ] @
http://www.codeguru.com/cs_network/getip.html
http://cui.unige.ch/OSG/people/Past/fuentes/Mfc/HowTo_48.html
[ Predrag Damnjanovic @ 07.05.2003. 13:58 ] @
da, da, vraca 0 ako je ok, taj if sam dodao ovde, ovamo u mom kodu ga nemam, a isto vraca uvek 127...
ajd videcu da li ovo tvoje radi, mada na prvi pogled sve je isto...

verovatno i ono moje (bez if-a) radi u winu, probacu oba...

p.s. bokash, i ona 2 primera su ista kao ovo gore... anyway, tnx.
[ Dusan Marjanovic @ 07.05.2003. 17:13 ] @
probaj na ovaj način:
Code:

        adrese=lpHostEntry->h_addr_list;
        while(*adrese){
                printf("%s",inet_ntoa(*(struct in_addr*)*adrese));
                adrese++;
}
[ Predrag Damnjanovic @ 07.05.2003. 18:03 ] @
time nista ne dobijas, samo si zamenio nacin petlje :)
jos nisam pogledao u win, verovatno radi, a ovaj moj linux zeza...
[ Dusan Marjanovic @ 07.05.2003. 23:21 ] @
ako ništa drugo onda bar priznaj da lepše izgleda od i koje ide od 1 do 10 :o)
[ bokash @ 08.05.2003. 03:50 ] @
Citat:
Predrag Damnjanovic:

p.s. bokash, i ona 2 primera su ista kao ovo gore... anyway, tnx.


Kod mene rade (TM) oba. Mora da nesto drugo nije u redu.
Posalji ceo kod.
[ leka @ 08.05.2003. 16:47 ] @
http://www.kohala.com/start/unpv12e.html

Da ne trazis okolo - prmyaddrs1.c :)

Btw. moj savet ti je da da se manes "guru" sajtova. Za mene, kad je mrezno programiranje u pitanju, postoji samo jedan guru - Richard W. Stevens.
[ Predrag Damnjanovic @ 08.05.2003. 18:38 ] @
Citat:
bokash:
Kod mene rade (TM) oba. Mora da nesto drugo nije u redu.
Posalji ceo kod.

Pa ono u prvoj poruci je ceo kod, eno sredio sam onaj if...
Samo dodaj inicijalizaciju za WSA ako kompajliras za win, i include-uj windowes.h, i linkuj wsock32.lib :)

Ma 100% me linux zeza, evo bas cu posle da proverim u windowsu...
[ bokash @ 09.05.2003. 04:03 ] @
Nemam linux da proverim na njemu. Da nije mozda
problem u /etc/hosts ili tako nesto.
Sta ide na linuxu umesto WSAStartup ?
Cisto me zanima.
[ Predrag Damnjanovic @ 09.05.2003. 14:16 ] @
na unix-ima nista ne ide umesto WSAStartUp :), jednostavno sve je vec inicijalizovano.

Probao sam onaj moj kod u windowsu - radi.
Linux me nesto zeza, ili se na unix-ima jednostavno lokalni IP dobija na drugaciji nacin.
Remote IP lepo dobijam...
Pogledacu ono lekino, ako opet dobijem 127 onda je definitivno do mog OS-a, mozda /etc/hosts, ko zna...
[ Dusan Marjanovic @ 09.05.2003. 14:49 ] @
evo ja znam :o)
pa onaj Lekin, tačnije Stevensov, primer je upravo ono što sam ti ja dao...tako da što se tiče koda sve je ispravno...u pitanju je tvoj /etc/hosts fajl u kome pored tvog hostname-a stoji 127.0.0.1...ja sam probao na mashini koja je non stop online i ima svoju ip adresu naznacenu u /etc/hosts...i daje pravu ip adresu, tek kasnije sam probao kod mene kuci i daje ip adresu koju mashina ima u lokalnoj mrezi...jer ta adresa stoji uz njen hostname...
[ filmil @ 09.05.2003. 16:04 ] @

Pa to je onda neispravno konfigurisan računar. 127.0.0.1 treba da bude samo localhost i ništa više. Ako treba drugi IP za računar, treba podići dummy interfejs. U /etc/hosts koji dolazi uz Slekver umirujućim crvenim slovima piše:

Code:

# By the way, Arnt Gulbrandsen <[email protected]> says that 127.0.0.1
# should NEVER be named with the name of the machine.  It causes problems
# for some (stupid) programs, irc and reputedly talk. :^)
#

# For loopbacking.
127.0.0.1       localhost


f
[ silverglider @ 09.05.2003. 17:53 ] @
Prosle ili pretprosle godine sam imao slican problem, ali stvar nije bila samo u /etc/hosts vec i u tome da li je pored loopbacka podignut uopste koji interfejs (ethx, pppx, etc). Recimo da je podignut samo lo, a eth0 ne, vratice 127.0.0.1 bez obzira na /etc/hosts. Mislim, i da nemas staticke IP adrese i sredjen /etc/hosts, nego dhcp server, recimo, funkcija bi trebala da vraca korektnu IP adresu.
Dakle, ifconfig u ruke...
[ Predrag Damnjanovic @ 09.05.2003. 20:46 ] @
Ni ono lekino ne radi:
---------
peca@peca:~/unpv12e/names$ ./prmyaddrs1
address: 127.0.0.1
---------

Znaci, onaj moj sors je ok...

Pogledacu sta zeza...
[ Predrag Damnjanovic @ 09.05.2003. 21:41 ] @
Code:

127.0.0.1       localhost

Ako samo ovo ostavim sve ode u djavola, apache se ne dize, a gethostbyname ili gethostname (mrzelo me da gledam koja f-ja) vracaju NULL.

Sta stvarno da radim, ja nikad nisam cuo za lo, eth0, pppx...
Mislim, cuo sam, ali samo toliko, samo sam cuo za ove stvarcice :)
[ 6544616a006e @ 09.05.2003. 22:34 ] @
a sta kaze ifconfig?
[ Predrag Damnjanovic @ 09.05.2003. 23:48 ] @
# ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:2 errors:0 dropped:0 overruns:0 frame:0
TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:100 (100.0 b) TX bytes:100 (100.0 b)

ppp0 Link encap:Point-to-Point Protocol
inet addr:195.250.103.107 P-t-P:195.250.103.126 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:297 errors:1 dropped:0 overruns:0 frame:0
TX packets:332 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:210306 (205.3 Kb) TX bytes:38552 (37.6 Kb)
[ 6544616a006e @ 10.05.2003. 01:46 ] @
I hoćeš da kažeš da onaj Stevensov kod ne radi kad si na NET-u i kad imaš taj drugi IP? - Ne verujem ti! :)
[ Predrag Damnjanovic @ 10.05.2003. 13:51 ] @
Evo (ponovo) sta daje Stevensov primer:
Code:

peca@peca:~/unpv12e/names$ ./prmyaddrs1
        address: 127.0.0.1

na internetu sam!

Evo /etc/hosts
Code:

127.0.0.1       localhost
127.0.0.1               peca.peca.net peca


p.s. kako to da me niko nije upozorio da inet_ntoa i gethostbyname nisu thread-safe na UNIX-ima? (na windowsu su thread-safe!)
nema veze, nadjoh thread-safe zamene...
[ leka @ 10.05.2003. 15:12 ] @
Ovo je resenje koje meni radi:
Code:

#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netdb.h>
#include <string.h>
/**
 * u /etc/hosts pored 127.0.0.1 ne sme da bude NISTA
 * drugo OSIM "localhost.localdomain" i/ili "localhost"
 * .........
 * The source below is written by Dejan Lekic <dejan§nu6.org>
 * and licensed under GPL license...
 */
int main(char argc, char** argv)
{
    char ac[80];
    int i = 0;
    struct hostent* phe;
    struct in_addr addr;
        
    if (gethostname(ac, sizeof(ac)) != 0) 
    {
        printf("Yoy, ne mogu da uzmem ime lokal-host-a bwe!\n");
        return 1;
    }
    else
        printf("Ime hosta je: %s\n", ac);
    /* 'aj sad da odradimo posao... */
    phe = gethostbyname(ac);
    if (phe == NULL) 
    {
        printf("Uh! Host lukap pandrknuo.\n");
        return 1;
    }
    /* ofo zapravo wadi poswitj */
    for (i = 0; phe->h_addr_list[i] != NULL; ++i) 
    {
        bzero(&addr, sizeof(struct in_addr));
        memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
        printf("Adresa %d : %s\n", i, inet_ntoa(addr));
    }
    
    printf("Peco, ako ti ovo ne radi, onda baci kompjuter kroz prozor.\n");
    return 0;
}


Da zadovoljim Pecu, koji ima frku sa manje prostim stvarima a nama naglasava da postoje i *_r() funkcije koje su reentrantne, ovaj kod bi trebalo malo modifikovati kada treba da funkcionise asinhrono. Tada treba, prema recima gospodina Richardu W. Stevensa, koristiti gethostbyname_r() . Ali, pazljivim programiranjem i gethostname() se moze iskoristiti...
[ Predrag Damnjanovic @ 10.05.2003. 15:51 ] @
Code:

peca@peca:~$ ./lekino
Ime hosta je: peca
Adresa 0 : 127.0.0.1
Peco, ako ti ovo ne radi, onda baci kompjuter kroz prozor.


Imam mrezicu na prozor, pa ne bih da je cepam :)

Inace, postupak dobijanja IP-a u ovom tvom sorsu je isti kao onaj moj u prvoj poruci.

a za _r funkciuje znam, mada u onom pdf-u sto si mi dao preporucuju getaddrinfo() i naravno inet_ntop().
[ leka @ 10.05.2003. 17:40 ] @
Code:

dejan@gnu ~/prj/c 
$ ./addresses 
Ime hosta je: gnu.nu6.org
Adresa 0 : 192.168.0.12
Peco, ako ti ovo ne radi, onda baci kompjuter kroz prozor.


Ja sam 101% siguran da si ti nesto lose podesio na svojoj masini :)

Naravno da znas za *_r() funkcije! Inace ne bi napisao ono "p.s. kako to da me niko nije upozorio da inet_ntoa i gethostbyname nisu thread-safe na UNIX-ima?"
[ filmil @ 10.05.2003. 18:14 ] @
Citat:
Predrag Damnjanovic:
Imam mrezicu na prozor, pa ne bih da je cepam :)

Inace, postupak dobijanja IP-a u ovom tvom sorsu je isti kao onaj moj u prvoj poruci.


Peco, legendo. Rekoše ljudi da NE SMEŠ da okačiš ime svog hosta na localhost. Dakle ovo što si napisao ne valja:

Citat:

Evo /etc/hosts
Code:

127.0.0.1       localhost
127.0.0.1               peca.peca.net peca



Da bi imenovao svoj računar potreban ti je IP broj na koji ćeš okačiti ime. Kako je do Interneta dug put, najjednostavnije je da napraviš dummy mrežni interfejs. Kratka škola IP umrežavanja: IP brojevi se pridružuju mrežnim interfejsima a ne računarima. Svaki interfejs mora da ima IP broj a računar može imati više mrežnih interfejsa pa prema tome i pridruženih IP brojeva.

Kako da uradiš ono što ti treba? Ja bih počeo tako što uzmem jednu IP adresu iz privatnog adresnog prostora (na primer 192.168.1.2) i ubacim je u hosts:

Code:

192.168.1.2 peca.peca.net peca


I onda krstim dummy tim brojem:

Code:

# ifconfig dummy0 peca
# route add peca dummy0


pa kad to završim onda probam tvoje programsko čedo. Takođe bih pogledao šta mi vraća komanda hostname, pri podizanju sistema treba da se pomoću nje zada ime sistema, na primer:

Code:

# hostname peca


Da remiziramo?

f
[ sspasic @ 11.05.2003. 16:24 ] @
Hm, ni kod mene ne ispisuje sve adrese (na Linux-u).
Naime, mislim da ip adrese program ne treba da sazna tako sto krene od hostname-a, vec od liste interfejsa.
Evo jednog u attachu koji bas tako radi.
[ Predrag Damnjanovic @ 11.05.2003. 17:07 ] @
Code:

peca@peca:~$ ./iplist
lo 127.0.0.1
ppp0 195.250.103.74


Hvala bogu, hvala Sasa, znao sam da ima neki drugi nacin za dobijanje IP-a pod unix-ima.
[ leka @ 11.05.2003. 20:05 ] @
Sale, pre svega svaka cast za kod!
Druga stvar je tema... Naime, pitanje je bilo "Zasto uvek daje 127.0.0.1", a ne listanje interfejsa...

Citat:
sspasic:
Hm, ni kod mene ne ispisuje sve adrese (na Linux-u).
Naime, mislim da ip adrese program ne treba da sazna tako sto krene od hostname-a, vec od liste interfejsa.
Evo jednog u attachu koji bas tako radi.


Peci jedna kratka poruka: ako si znao, onda je trebalo i da napises kod. Jel' tako?
[ Predrag Damnjanovic @ 11.05.2003. 23:00 ] @
Ja sam Deyane jos u prvoj poruci napisao:
Citat:
Predrag Damnjanovic:
Postoji li neki drugi nacin da dobijem svoj IP?

a subject je takav kakav je jer sam ocekivao da mi kazete da mi je postupak (dobijanja IP-a) losh, tj. da mi kazete taj "drugi nacin".

Izvinjavam se zbog subjecta, i hvala svima na pomoci :)
p.s. Leko, najvise me raduje tvoj povratak na forum!
Pozdrav...