/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
gethostbyname og getaddrinfo
Fra : Jacob Jensen


Dato : 19-08-05 12:31

Hej

Fra MSDN:

"The gethostbyname function has been deprecated by the introduction of the
getaddrinfo function. Developers creating Windows Sockets 2 applications are
urged to use the getaddrinfo function instead of gethostbyname."

Nu er jeg bare ude på at finde en ip-adresse ud fra et host-name. Kan nogle
forklare hvordan jeg gør det med getaddrinfo? MSDN's beskrivelse er her:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/getaddrinfo_2.asp

Det giver ikke så meget mening for mig.

Jacob



 
 
Benny Andersen (19-08-2005)
Kommentar
Fra : Benny Andersen


Dato : 19-08-05 12:54

On Fri, 19 Aug 2005 13:30:31 +0200, "Jacob Jensen" <omo@adslhome.dk>
wrote:

>Hej
>
>Fra MSDN:
>
>"The gethostbyname function has been deprecated by the introduction of the
>getaddrinfo function. Developers creating Windows Sockets 2 applications are
>urged to use the getaddrinfo function instead of gethostbyname."
>
>Nu er jeg bare ude på at finde en ip-adresse ud fra et host-name. Kan nogle
>forklare hvordan jeg gør det med getaddrinfo? MSDN's beskrivelse er her:
>
>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/getaddrinfo_2.asp
>
>Det giver ikke så meget mening for mig.

Har du prøvet eksemplet, følgende linket: addrinfo, erstattende:

   char* ip = "127.0.0.1";
   char* port = "27015";
   
med
   char* ip = "hostname";
   char* port = "80";

--
Mvh Benny Andersen

Jacob Jensen (19-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 19-08-05 13:37

> Har du prøvet eksemplet, følgende linket: addrinfo, erstattende:

Jaaa, jeg har kigget :) Jeg forstår ikke hvordan man skal bruge den der
linkede liste man får, og jeg forstår slet ikke hvad den indeholder.

> char* ip = "hostname";
> char* port = "80";

Hvorfor skal man angive port? Hvad vil det sige?

I kan lige få et udsnit af min kode. Det er overordnet noget jeg har fundet
på et forum, og jeg må indrømme at jeg heller ikke her er med på det hele
(specielt linjen hvor inet_ntoa kaldes). Det MSDN siger jeg skal er at
udskifte kaldes til gethostbyname med et kald til getaddrinfo ikke?:

//Get current IP-address from OS
if ( WSAStartup( wVersionRequested, &wsaData ) == 0 )
{
if( gethostname ( name, sizeof(name)) == 0)
{
if((hostinfo = gethostbyname(name)) != NULL)
{
new_ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);


Jacob



Benny Andersen (19-08-2005)
Kommentar
Fra : Benny Andersen


Dato : 19-08-05 23:50

"Jacob Jensen" <omo@adslhome.dk> wrote:

>Hvorfor skal man angive port? Hvad vil det sige?
Jeg må tilstå at jeg blot fulgte linket du gav, og gav et bud på et
eksperiment. Jeg er har ikke platform sdk på min maskine til at
kompilerer microsoft winsocket2.
Lidt google-ing antyder at getaddrinfo samler host adresse info og
service adresse info under samme hat. En tanketosk fra min side var at
jeg tænkte hosten var involveret og det jo nok var webserver (port 80)
- hvilket ikke er tilfældet, det er jo blot DNS systemet som skal
retunere ip'en. Så ..

retVal = getaddrinfo("<hostname>", NULL, &aiHints, &aiList)
(droppende variablerne ip og port)

er mit næste bud - i forlængelse af føromtalte eksempelkode.

>(specielt linjen hvor inet_ntoa kaldes). Det MSDN siger jeg skal er at
>udskifte kaldes til gethostbyname med et kald til getaddrinfo ikke?:

MSDN siger hvordan stilen er i deres platform SDK, som vel typisk
anvendes under Visual studio .Net (hvilket jeg ikke har)

Hvad du skal gøre afhænger af dit udviklingsudstyr, hvem det laves
til, og hvor mange fremtidige elementer kildekoden skal kunne
tilpasses til.

--
Mvh Benny Andersen

Jacob Jensen (20-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 20-08-05 11:14

> retVal = getaddrinfo("<hostname>", NULL, &aiHints, &aiList)
> (droppende variablerne ip og port)

Så langt nåede jeg også selv, men jeg har problemer med hvordan hints virker
og hvordan jeg arbejder med den liste. Har nogle herinde prøvet det her?

Jacob



Jacob Jensen (20-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 20-08-05 13:40

> Lidt google-ing antyder at getaddrinfo samler host adresse info og
> service adresse info under samme hat. En tanketosk fra min side var at
> jeg tænkte hosten var involveret og det jo nok var webserver (port 80)
> - hvilket ikke er tilfældet, det er jo blot DNS systemet som skal
> retunere ip'en. Så ..

hvad menes der med service adresse info?

Jacob



Jacob Jensen (20-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 20-08-05 15:01

Nu har jeg forsøgt mig lidt frem og prøvet at tyde MSDN'en. Den plejer altså
ikke være så ringe synes jeg. Min kode står i bunden af dette indlæg.

Så snart jeg når til at skrive canonname ud stopper programmet. "TEST"
bliver aldrig udskrevet. De andre giver følgende:

ai_flags : 0
ai_family : 2
ai_socktype : 0
ai_protocol : 0
ai_addrlen : 16

Den næste del i strukturen addrinfo efter canonname er så ai_addr som er en
peger til en sockaddr:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/sockaddr_2.asp

....og her står jeg altså af. HJÆLP :) Hvordan får jeg dog min lokale
IP-adresse at vide? Er det så besværligt? Det var relativt nemt med den game
gethostbyname. Jeg savner en god forklaring på alle de her termer samt HVOR
jeg skal finde den IP-adresse.

---KODE---

//Get current IP-address from OS
if ( WSAStartup( wVersionRequested, &wsaData ) == 0 )
{
if( gethostname ( name, sizeof(name)) == 0)
{
struct addrinfo *aiHints = NULL;
struct addrinfo *aiList = NULL;
struct addrinfo *temp_aiList = NULL;
char* port = NULL;

if(getaddrinfo(name, port, aiHints, &aiList) == 0)
{
temp_aiList = aiList;
cout << "PRINTING THAT WIERD THING" << endl;
do
{
cout << "ai_flags : " << aiList->ai_flags << endl;
cout << "ai_family : " << aiList->ai_family << endl;
cout << "ai_socktype : " << aiList->ai_socktype << endl;
cout << "ai_protocol : " << aiList->ai_protocol << endl;
cout << "ai_addrlen : " << aiList->ai_addrlen << endl;
cout << "ai_canonname : " << aiList->ai_canonname << endl;
cout << "TEST" << endl;

temp_aiList = temp_aiList->ai_next;
}
while(temp_aiList);

freeaddrinfo(aiList);
}

Jacob



Jacob Jensen (20-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 20-08-05 15:03

Det skal måske lige siges at hvis jeg udkommenterer den udskrivning af
canonname, sådan at programmet ikke pludseligt stopper, så kører det fint
nok til ende, så det kunne tyde på at jeg leder den lænkede liste rigtigt
nok igennem og at der kun er 1 element i listen.

Jacob



Jacob Jensen (20-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 20-08-05 15:39

Hvis man rent faktisk laver en hints-struktur og ikke bare bruger en
nul-peger, og man giver denne strukturs ai_flags-variabel værdien
AI_CANONNAME så fejler det ikke mere.

Men det jeg får i aiList->ai_canonname i den lænkede liste er navnet på min
computer (altså det navn som man helt selv vælger i windows, og som andre
ser hvis man er på et lokalnet). Altså ikke en IP-adresse.

---KODE---

struct addrinfo *aiHints = new struct addrinfo;
memset(aiHints, 0, sizeof(struct addrinfo));
aiHints->ai_flags = AI_CANONNAME;

Jacob



Thomas G. Larsen (21-08-2005)
Kommentar
Fra : Thomas G. Larsen


Dato : 21-08-05 12:04

"Jacob Jensen" <omo@adslhome.dk> wrote in message
news:<4307407e$0$182$edfadb0f@dtext02.news.tele.dk>...
> Hvis man rent faktisk laver en hints-struktur og ikke bare bruger en
> nul-peger, og man giver denne strukturs ai_flags-variabel værdien
> AI_CANONNAME så fejler det ikke mere.
>
> Men det jeg får i aiList->ai_canonname i den lænkede liste er navnet på
min
> computer (altså det navn som man helt selv vælger i windows, og som andre
> ser hvis man er på et lokalnet). Altså ikke en IP-adresse.
>
> ---KODE---
>
> struct addrinfo *aiHints = new struct addrinfo;
> memset(aiHints, 0, sizeof(struct addrinfo));
> aiHints->ai_flags = AI_CANONNAME;

Hej Jacob,

aiList->ai_cacnonname indeholder hostnavnet på den maskine du spørger på.
Hvis du skal have fat i IP adressen skal du kigge på aiList->ai_addr. IP
adressen er gemt som en long, så du skal bruge inet_ntoa() til at få det
konverteret til en streng.

Jeg har strikket et lille eksempel sammen baseret på det kode du postede. I
aiHints strukturen sætter jeg ai_family til PF_INET og ai_socktype til
SOCK_STREAM. Hvis du sætter dem til 0 vil den udskrive 2 records (en for TCP
og en for UDP).

int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
char *name = new char[256];
if ( WSAStartup( MAKEWORD(1,1), &wsaData ) != 0 )
return 1;

switch (argc)
{
case 1:
if (gethostname(name, 255) != 0)
name = "localhost";
break;
case 2:
strncpy(name, argv[1], 255);
name = argv[1];
break;
}

struct addrinfo aiHints;
struct addrinfo *aiList = NULL;
char* port = "80";
aiHints.ai_flags = AI_CANONNAME;
aiHints.ai_family = PF_INET;
aiHints.ai_socktype = SOCK_DGRAM; // Vis kun resultater for TCP
protokollen
aiHints.ai_protocol = 0;
aiHints.ai_addrlen = 0;
aiHints.ai_canonname = NULL;
aiHints.ai_addr = NULL;
aiHints.ai_next = NULL;

if(getaddrinfo(name, port, &aiHints, &aiList) == 0)
{
do
{
std::cout << "ai_flags : " << aiList->ai_flags << std::endl;
std::cout << "ai_family : " << aiList->ai_family << std::endl;
std::cout << "ai_socktype : " << aiList->ai_socktype <<
std::endl;
std::cout << "ai_protocol : " << aiList->ai_protocol <<
std::endl;
std::cout << "ai_addrlen : " << (unsigned int)aiList->ai_addrlen
<< std::endl;
if (aiList->ai_canonname != NULL)
{
std::cout << "ai_canonname : " << aiList->ai_canonname <<
std::endl;
}
if (aiList->ai_addr != NULL)
{
std::cout << "ai_addr : " <<
inet_ntoa(((sockaddr_in*)aiList->ai_addr)->sin_addr) << std::endl;
}
aiList = aiList->ai_next;
} while(aiList);

freeaddrinfo(aiList);
}

WSACleanup();
delete[] name;

return 0;
}



Jacob Jensen (21-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 21-08-05 14:45

Jeg så først kun din e-mail til mig, men nu så jeg at du også har svaret
her. Jeg kopierer lige det svar jeg har skrevet til dig privat herinde så
folk kan følge med :)

> aiList->ai_cacnonname indeholder hostnavnet på den maskine du spørger på.

Ja, men kun nogle gange ikke? Jeg synes alle de her variabler er pænt
forvirrende :)

> Hvis du skal have fat i IP adressen skal du kigge på aiList->ai_addr. IP
> adressen er gemt som en long, så du skal bruge inet_ntoa() til at få det
> konverteret til en streng.

Tusind tak. Det var lige det med inet_ntoa() jeg manglede.

> Jeg har strikket et lille eksempel sammen baseret på det kode du postede.
> I
> aiHints strukturen sætter jeg ai_family til PF_INET og ai_socktype til
> SOCK_STREAM. Hvis du sætter dem til 0 vil den udskrive 2 records (en for
> TCP
> og en for UDP).

Nej det kan jeg altså ikke få den til :) Og faktisk virker det nu selvom jeg
sætter hele aiHints strukturen til at pege på 0 og endda også med port
pegende på 0.

Jeg kunne virkeligt godt bruge en god oversigt over hvad alle de her
variabler bruges til og hvad det rent faktisk er der bliver returneret af
funktionen på baggrund af hints osv. Det giver ingen mening for mig at man
kan angive port-numre og alt muligt. Desuden ser den ud til at returnere det
samme stort set lige meget hvad jeg sætter hints til. En undtagelse er dog
at hvis jeg sætter hints' ai_flags til "AI_CANONNAME" så indeholder svarets
"ai_cannonname" tilsyneladende noget, ellers er det 0. Family og socktype
gør vist ingen forskel og jeg kan slet ikke får getaddrinfo til at returnere
mere end 1 element i den linkede liste.

Foreløbig har jeg nu fået det til at virke som det skal (jeg skal kun have
ip'en på den lokale computer), men jeg forstår ikke koden, og det er lidt
irreterende. Jeg drømmer sgu snart om det om natten :)

Kan du hjælpe med at forklare eller har du evt. et link til noget brugbart?
MSDN er ikke helt på toppen lige med denne funktion synes jeg.

Tak for hjælpen.
Jacob



Thomas G. Larsen (21-08-2005)
Kommentar
Fra : Thomas G. Larsen


Dato : 21-08-05 15:18


"Jacob Jensen" <omo@adslhome.dk> wrote in message
news:4308854d$0$169$edfadb0f@dtext02.news.tele.dk...
> Jeg så først kun din e-mail til mig, men nu så jeg at du også har svaret
> her. Jeg kopierer lige det svar jeg har skrevet til dig privat herinde så
> folk kan følge med :)
>

Ja, det var en smutter (jeg er lidt rusten i newsgroups). Og så har jeg jo
så også svaret direkte på din mail *suk*, men jeg paster den lige her også



> > aiList->ai_cacnonname indeholder hostnavnet på den maskine du
> spørger på.
>
> Ja, men kun nogle gange ikke? Jeg synes alle de her variabler er pænt
> forvirrende :)
>

Ja, det kommer an på hvordan du sætter Hints structen. Men det er jo
egentlig ret ligegyldigt om hostnavnet er der eller ej. Du skulle da meget
gerne kende det hostnavn du vil finde IP'en på inden du starter

> > Jeg har strikket et lille eksempel sammen baseret på det kode
> du postede.
> > I
> > aiHints strukturen sætter jeg ai_family til PF_INET og ai_socktype til
> > SOCK_STREAM. Hvis du sætter dem til 0 vil den udskrive 2 records (en for
> > TCP
> > og en for UDP).
>
> Nej det kan jeg altså ikke få den til :) Og faktisk virker det nu
> selvom jeg
> sætter hele aiHints strukturen til at pege på 0 og endda også med port
> pegende på 0.

Meget mystisk, men noget kunne tyde på at MS ikke engang selv er helt sikker
på hvordan det fungerer. Min lokale version af MSDN er ihvertfald anderledes
end den MSDN der ligger online :o/ Min lokale version fortæller at
funktionen kun findes i Windows XP og fremefter (jeg kører W2K). Desuden
skal jeg include ws2tcpip.h, og ikke wspiapi.h som der står i MSDN online.

> Jeg kunne virkeligt godt bruge en god oversigt over hvad alle de her
> variabler bruges til og hvad det rent faktisk er der bliver returneret af
> funktionen på baggrund af hints osv. Det giver ingen mening for mig at man
> kan angive port-numre og alt muligt. Desuden ser den ud til at
> returnere det
> samme stort set lige meget hvad jeg sætter hints til. En undtagelse er dog
> at hvis jeg sætter hints' ai_flags til "AI_CANONNAME" så
> indeholder svarets
> "ai_cannonname" tilsyneladende noget, ellers er det 0. Family og socktype
> gør vist ingen forskel og jeg kan slet ikke får getaddrinfo til
> at returnere
> mere end 1 element i den linkede liste.

Jeg tror faktisk at port nummeret er ligegyldigt når man arbejder med
TCP/IP. Så vidt jeg kan forstå fungerer getaddrinfo() også for andre slags
protokoller, og der kunne man godt forestille sig at det havde noget at
sige.
Hvis jeg angiver NULL i hints parameteren får jeg 2 elementer (et for TCP og
et for UDP), men kun hvis jeg angiver et port nummer. Hvis jeg også giver
NULL som port får jeg kun et element. Det er vist ikke til at blive klog på.

> Foreløbig har jeg nu fået det til at virke som det skal (jeg skal kun have
> ip'en på den lokale computer), men jeg forstår ikke koden, og det er lidt
> irreterende. Jeg drømmer sgu snart om det om natten :)
>
> Kan du hjælpe med at forklare eller har du evt. et link til noget
> brugbart?
> MSDN er ikke helt på toppen lige med denne funktion synes jeg.

Jeg tror jeg holder mig til at bruge gethostbyname() indtil MS selv får styr
på API'et. Grunden til at de anbefaler folk at bruge getaddrinfo() er at de
gamle funktioner kun understøtter IPv4. Med mindre du skal bruge dit program
med IPv6 (eller andre protokoller) så betyder det altså ikke noget.

Jeg ville ønske at jeg kunne give dig en god forklaring på getaddrinfo(),
men den giver lige så lidt mening for mig som den gør for dig Jeg måtte
prøve mig frem (og bruge debuggeren) og læse manualen de første 10 gange før
det ville virke.

Nu ved jeg ikke hvad du benytter til at skrive din kode, men hvis du har et
IDE med en rimelig debugger er det helt klart en stor hjælp. Så ville du
hurtigt kunne have fundet uf af hvorfor dit program f.eks. gav en AV (Access
Violation) når du prøvede at udskrive ai_canonname.
Men der er altså ikke andet at gøre end at klø på, så begynder tingene at
give mening til sidst

Og så lige en indskydelse.. Jeg fik lige kigget lidt nærmere på det kode jeg
sendte dig, og det har en memory leak i switch'en:

case 2:
strncpy(name, argv[1], 255);
name = argv[1]; <-- fjern denne linie
break;

Det var et resultat af at jeg prøvede lidt forskelligt, og så glemte jeg at
fjerne den linie da jeg indsatte linien ovenover :o/

MVH
Thomas



Jacob Jensen (21-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 21-08-05 15:45

> Ja, det var en smutter (jeg er lidt rusten i newsgroups). Og så har jeg jo
> så også svaret direkte på din mail *suk*, men jeg paster den lige her også
>

Ok, så nøjes jeg med at svare her :)

> Ja, det kommer an på hvordan du sætter Hints structen. Men det er jo
> egentlig ret ligegyldigt om hostnavnet er der eller ej. Du skulle da meget
> gerne kende det hostnavn du vil finde IP'en på inden du starter

Ja

>> Nej det kan jeg altså ikke få den til :) Og faktisk virker det nu
>> selvom jeg
>> sætter hele aiHints strukturen til at pege på 0 og endda også med port
>> pegende på 0.
>
> Meget mystisk, men noget kunne tyde på at MS ikke engang selv er helt
> sikker
> på hvordan det fungerer. Min lokale version af MSDN er ihvertfald
> anderledes
> end den MSDN der ligger online :o/ Min lokale version fortæller at
> funktionen kun findes i Windows XP og fremefter (jeg kører W2K). Desuden
> skal jeg include ws2tcpip.h, og ikke wspiapi.h som der står i MSDN online.

hmmm, jeg inkluderer ws2tcpip.h, og det troede jeg at jeg havde fra MSDN
online :) Kigger lige... ahhh på online-MSDN står der:

"Header:
Declared in Ws2tcpip.h.
Declared in Wspiapi.h on Windows 2000, Windows NT, and Windows Me/98/95."

> Jeg tror faktisk at port nummeret er ligegyldigt når man arbejder med
> TCP/IP. Så vidt jeg kan forstå fungerer getaddrinfo() også for andre slags
> protokoller, og der kunne man godt forestille sig at det havde noget at
> sige.

Tjaaa, den er protocol independent ifølge MSDN-online. Jeg ved ikk hvad
getaddrinfo egentligt kan og ikke kan. Jeg bliver mere og mere forvirret.
Den findes vist også på linux-distributioner. Er der nogle der kender den
derfra?

> Hvis jeg angiver NULL i hints parameteren får jeg 2 elementer (et for TCP
> og
> et for UDP), men kun hvis jeg angiver et port nummer. Hvis jeg også giver
> NULL som port får jeg kun et element. Det er vist ikke til at blive klog
> på.

Nææ, når du siger at du angiver NULL mener du så at du laver en 0-peger?
Altså (struct addrinfo* aiHints = 0) eller at du sætter alle variablerne i
strukturen til 0?

> Jeg tror jeg holder mig til at bruge gethostbyname() indtil MS selv får
> styr
> på API'et. Grunden til at de anbefaler folk at bruge getaddrinfo() er at
> de
> gamle funktioner kun understøtter IPv4. Med mindre du skal bruge dit
> program
> med IPv6 (eller andre protokoller) så betyder det altså ikke noget.

Tjaa, der er også noget fikst ved at den er protocol independent velsagtens.
Jeg tænkte bare at jeg ville prøve at få det til at virke nu når de
anbefaler folk den så kraftigt.

> Jeg ville ønske at jeg kunne give dig en god forklaring på getaddrinfo(),
> men den giver lige så lidt mening for mig som den gør for dig Jeg
> måtte
> prøve mig frem (og bruge debuggeren) og læse manualen de første 10 gange
> før
> det ville virke.

Sådan havde jeg det også. Jeg glemte bare lige inet_ntoa :) Det var sådan
set det eneste jeg manglede.

> Nu ved jeg ikke hvad du benytter til at skrive din kode, men hvis du har
> et
> IDE med en rimelig debugger er det helt klart en stor hjælp. Så ville du
> hurtigt kunne have fundet uf af hvorfor dit program f.eks. gav en AV
> (Access
> Violation) når du prøvede at udskrive ai_canonname.
> Men der er altså ikke andet at gøre end at klø på, så begynder tingene at
> give mening til sidst

Jeg bruger bare metapad lige nu :) Og minGW oversætteren. Jeg vidste ikke
det var en access violation. Programmet stoppede bare.

> Og så lige en indskydelse.. Jeg fik lige kigget lidt nærmere på det kode
> jeg
> sendte dig, og det har en memory leak i switch'en:
>
> case 2:
> strncpy(name, argv[1], 255);
> name = argv[1]; <-- fjern denne linie
> break;

Er dét et memory leak? Du havde også angivet DGRAM istedet for STREAM et
sted så jeg. Men den fangede jeg :)

> Det var et resultat af at jeg prøvede lidt forskelligt, og så glemte jeg
> at
> fjerne den linie da jeg indsatte linien ovenover :o/

Det kan ske.

Hvad er egentligt parameter nummer 2 til funktionen? Det er sgu en mystisk
funktion. Hvis man søger lidt bredere end bare windows giver lidt google-tid
sådan noget her:

http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=getaddrinfo
http://developer.apple.com/documentation/Darwin/Reference/ManPages/man3/getaddrinfo.3.html
http://linux.about.com/library/cmd/blcmdl3_getaddrinfo.htm

Endnu engang tak for hjælpen.
Jacob



Thomas G. Larsen (21-08-2005)
Kommentar
Fra : Thomas G. Larsen


Dato : 21-08-05 16:57


"Jacob Jensen" <omo@adslhome.dk> wrote in message
news:43089357$0$184$edfadb0f@dtext02.news.tele.dk...

> hmmm, jeg inkluderer ws2tcpip.h, og det troede jeg at jeg havde fra MSDN
> online :) Kigger lige... ahhh på online-MSDN står der:
>
> "Header:
> Declared in Ws2tcpip.h.
> Declared in Wspiapi.h on Windows 2000, Windows NT, and Windows Me/98/95."

Jeps, og jeg kører Win 2000. Jeg får bare spyttet en forfærdelig mange fejl
i hovedet hvis jeg prøver wspiapi.h :o/

> Tjaaa, den er protocol independent ifølge MSDN-online. Jeg ved ikk hvad
> getaddrinfo egentligt kan og ikke kan. Jeg bliver mere og mere forvirret.
> Den findes vist også på linux-distributioner. Er der nogle der kender den
> derfra?

Jeg har smugkigget lidt i nogen linux/freebsd manpages, og jeg tror jeg har
regnet fidusen ud. Ved at angive ting som port nummer og protokol osv. i
hint parameteren kan du få en fiks og færdig addrinfo struct tilbage som du
så kan hælde direkte i et kald til bind() eller connect(). Hvis du bare vil
have IP'en behøver du altå ikke at give den et port nummer eller en hint
struct.

> Nææ, når du siger at du angiver NULL mener du så at du laver en 0-peger?
> Altså (struct addrinfo* aiHints = 0) eller at du sætter alle variablerne i
> strukturen til 0?

NULL bliver brugt som en 0-pointer (f.eks. struct addrinfo* aiHints = NULL).
Egentlig er den bare et synonym for et almindeligt rundt 0, men det gør det
lidt nemmere at se i koden at det er en pointer man manipulerer og ikke
f.eks. en int.

> Tjaa, der er også noget fikst ved at den er protocol independent
velsagtens.
> Jeg tænkte bare at jeg ville prøve at få det til at virke nu når de
> anbefaler folk den så kraftigt.

Det er jo også fornuftigt nok. Og den er jo især smart hvis man efter at
have fundet IP'en så skal connecte til den. Så er det jo lige ud af
landevejen

> > case 2:
> > strncpy(name, argv[1], 255);
> > name = argv[1]; <-- fjern denne linie
> > break;
>
> Er dét et memory leak? Du havde også angivet DGRAM istedet for STREAM et
> sted så jeg. Men den fangede jeg :)

Ja, det er en memory leak. Jeg allokerer 256 bytes i starten af programmet,
og name peger på den buffer. Når jeg så sætter name til at pege på argv[1],
så kan jeg ikke frigøre min oprindelige buffer til sidst da der jo ikke er
nogen/noget der ved hvor den ligger. I stedet frigør kommer jeg til at
frigøre argv[1] som name nu peger på.

> Hvad er egentligt parameter nummer 2 til funktionen? Det er sgu en mystisk
> funktion.

Hvis det er main() funktionen du tænker på, så fortæller argc hvor mange
command-line switches du har kørt programmet med, og argv arrayet indeholder
så hver switch. argv[0] indeholder altid navnet og placeringen på prorammet
(f.eks. "C:\mitprogram.exe"). Hvis jeg så starter programmet med
"mitprogram.exe mitdomæne.dk" vil argv[1] indeholde "mitdomæne.dk". Den
switch() statement som ligger i main() vil så slå "mitdomæne.dk" op i stedet
for navnet på den lokale maskine. Det var nu mest for min egen skyld, så jeg
kunne se at den lavede de rigtige opslag.

> Endnu engang tak for hjælpen.
> Jacob

Det var så lidt. Det er altid sjovt at hjælpe folk når men selv bliver
klogere undervejs

MVH
Thomas



Jacob Jensen (21-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 21-08-05 19:53

> Jeg har smugkigget lidt i nogen linux/freebsd manpages, og jeg tror jeg
> har
> regnet fidusen ud. Ved at angive ting som port nummer og protokol osv. i
> hint parameteren kan du få en fiks og færdig addrinfo struct tilbage som
> du
> så kan hælde direkte i et kald til bind() eller connect(). Hvis du bare
> vil
> have IP'en behøver du altå ikke at give den et port nummer eller en hint
> struct.

Ahhh, det er da muligt at det er sådan det hænger sammen.

> NULL bliver brugt som en 0-pointer (f.eks. struct addrinfo* aiHints =
> NULL).
> Egentlig er den bare et synonym for et almindeligt rundt 0, men det gør
> det
> lidt nemmere at se i koden at det er en pointer man manipulerer og ikke
> f.eks. en int.

Jeps, det ved jeg. Du skrev bare noget med at sætte hints til 0 og jeg var i
tvivl om du mente en 0-peger eller en addrinfo-struktur hvor alle
variablerne er sat til 0.

> Ja, det er en memory leak. Jeg allokerer 256 bytes i starten af
> programmet,
> og name peger på den buffer. Når jeg så sætter name til at pege på
> argv[1],
> så kan jeg ikke frigøre min oprindelige buffer til sidst da der jo ikke er
> nogen/noget der ved hvor den ligger. I stedet frigør kommer jeg til at
> frigøre argv[1] som name nu peger på.

Klart, jeg havde lige mislæst koden.

> Hvis det er main() funktionen du tænker på, så fortæller argc hvor mange
> command-line switches du har kørt programmet med, og argv arrayet
> indeholder
> så hver switch. argv[0] indeholder altid navnet og placeringen på
> prorammet
> (f.eks. "C:\mitprogram.exe"). Hvis jeg så starter programmet med
> "mitprogram.exe mitdomæne.dk" vil argv[1] indeholde "mitdomæne.dk". Den
> switch() statement som ligger i main() vil så slå "mitdomæne.dk" op i
> stedet
> for navnet på den lokale maskine. Det var nu mest for min egen skyld, så
> jeg
> kunne se at den lavede de rigtige opslag.

Main-funktionen er jeg helt med på. Jeg prøvede også din kode. Det var
getaddrinfo jeg mente. Det var også lidt vagt at jeg bare skrev
"funktionen", sorry.

Jacob



Thomas G. Larsen (21-08-2005)
Kommentar
Fra : Thomas G. Larsen


Dato : 21-08-05 23:01


"Jacob Jensen" <omo@adslhome.dk> wrote in message
news:4308cd90$0$170$edfadb0f@dtext02.news.tele.dk...

> Main-funktionen er jeg helt med på. Jeg prøvede også din kode. Det var
> getaddrinfo jeg mente. Det var også lidt vagt at jeg bare skrev
> "funktionen", sorry.

Den anden parameter til getaddrinfo() er "service". Når vi snakker IP bruges
den til at angive hvilken port du gerne vil connecte til (f.eks. port 80 for
HTTP). Alternativt kan du angive servicens navn (i tilfælde af HTTP hedder
den så "http"). Jeg er ikke helt sikker på om det virker helt efter planen
på Windows, men det skulle spille på Linux/BSD/Unix.

/Thomas



Bo Andresen (22-08-2005)
Kommentar
Fra : Bo Andresen


Dato : 22-08-05 02:59

Thomas G. Larsen wrote:
> "Jacob Jensen" <omo@adslhome.dk> wrote in message
> news:4308cd90$0$170$edfadb0f@dtext02.news.tele.dk...
>
>
>>Main-funktionen er jeg helt med på. Jeg prøvede også din kode. Det var
>>getaddrinfo jeg mente. Det var også lidt vagt at jeg bare skrev
>>"funktionen", sorry.
>
>
> Den anden parameter til getaddrinfo() er "service". Når vi snakker IP bruges
> den til at angive hvilken port du gerne vil connecte til (f.eks. port 80 for
> HTTP). Alternativt kan du angive servicens navn (i tilfælde af HTTP hedder
> den så "http"). Jeg er ikke helt sikker på om det virker helt efter planen
> på Windows, men det skulle spille på Linux/BSD/Unix.
>
> /Thomas
>
>

Hvis du kigger i en fil, der hedder services, og på *nix normalt ligger
i /etc/, på Windows i C:\WINDOWS\system32\etc\, så ser du en liste over
services, og de tilsvarende portnumre og protokoller. Jeg har ikke
testet det i WINDOWS men på *nix finder den sin information i denne fil
og det virker aldeles udemærket.

/Bo

Jacob Jensen (22-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 22-08-05 10:09

> Hvis du kigger i en fil, der hedder services, og på *nix normalt ligger i
> /etc/, på Windows i C:\WINDOWS\system32\etc\, så ser du en liste over
> services, og de tilsvarende portnumre og protokoller. Jeg har ikke testet
> det i WINDOWS men på *nix finder den sin information i denne fil og det
> virker aldeles udemærket.

Ok

På windows XP ligger den her:
\windows\system32\drivers\etc\services

Jacob



Bo Andresen (22-08-2005)
Kommentar
Fra : Bo Andresen


Dato : 22-08-05 10:25

Jacob Jensen wrote:
>>Hvis du kigger i en fil, der hedder services, og på *nix normalt ligger i
>>/etc/, på Windows i C:\WINDOWS\system32\etc\, så ser du en liste over
>>services, og de tilsvarende portnumre og protokoller. Jeg har ikke testet
>>det i WINDOWS men på *nix finder den sin information i denne fil og det
>>virker aldeles udemærket.
>
>
> Ok
>
> På windows XP ligger den her:
> \windows\system32\drivers\etc\services
>
> Jacob
>
>

Var det ikke, det jeg skrev? ;)

/Bo

Jacob Jensen (22-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 22-08-05 11:14

> Var det ikke, det jeg skrev? ;)

Du manglede lige en "drivers"-folder. Det var mere for andres skyld jeg
skrev det. Det kan være der sidder nysgerrige sjæle og lytter med på linjen
:)

Jacob



Bo Andresen (22-08-2005)
Kommentar
Fra : Bo Andresen


Dato : 22-08-05 11:24

Jacob Jensen wrote:
>>Var det ikke, det jeg skrev? ;)
>
>
> Du manglede lige en "drivers"-folder. Det var mere for andres skyld jeg
> skrev det. Det kan være der sidder nysgerrige sjæle og lytter med på linjen
> :)
>
> Jacob
>
>

Jeg er blind. :( ;)

/Bo

Søg
Reklame
Statistik
Spørgsmål : 177429
Tips : 31962
Nyheder : 719565
Indlæg : 6407947
Brugere : 218878

Månedens bedste
Årets bedste
Sidste års bedste