"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