Seite 1 von 1

getaddrinfo meldet erfolg, struktur bleitb aber leer.

Verfasst: 16.02.2006 21:57
von MVXA
Hallo!
Ich habe mal wieder ein Problem mit den Winsocks. Ich versuche den
Hostnamen mit der Funktion [c]getaddrinfo()[/c] auf zu lösen. Die
Prozedur gibt 0 zurück, das für keine Fehler steht.

Aber die Struktur tList bleibt bis auf ai_flags leer. Kann mir bitte
jemand helfen?

Code: Alles auswählen

    #AI_PASSIVE = 1
    #AI_CANONNAME = 2
    #AI_NUMERICHOST = 4

    Structure sAddrInfo
        ai_flags.l
        ai_family.l
        ai_socktype.l
        ai_protocol.l
        
        ai_addrlen.l
        ai_canonname.l
        
       *ai_addr.SOCKADDR
       *ai_next.sAddrInfo
    EndStructure

    Global WSA.WSADATA

     WSAStartup_(514, @wsa)

Procedure.l ResolveName(sHostName.s, lPort.l)
    DefType.sAddrInfo tHost, tList
    
    Select PeekB(@wsa\wVersion+1)&$FF
        Case 1 ; WinSck 1.1
        Case 2 ; WinSck 2.2
            tHost\ai_family = #AF_INET
            
            If SCK_getaddrinfo(sHostName, Str(lPort), @tHost, @tList) = 0
                If (tList\ai_flags & #AI_PASSIVE    ): Debug "PASSIVE"    : EndIf
                If (tList\ai_flags & #AI_CANONNAME  ): Debug "CANONNAME"  : EndIf
                If (tList\ai_flags & #AI_NUMERICHOST): Debug "NUMERICHOST": EndIf
                Debug Bin(tList\ai_flags)
                
            Else
                Debug "error"
            EndIf
    EndSelect

EndProcedure

ResolveName("www.google.de", 80)

Verfasst: 16.02.2006 22:18
von NicTheQuick
Was ist [c]SCK_getaddrinfo()[/c] für eine Funktion? Irgendeine Library?

Verfasst: 16.02.2006 22:28
von MVXA
Port für
http://msdn.microsoft.com/library/defau ... info_2.asp
PB kennt die Funktion nicht von selbst...

Verfasst: 16.02.2006 22:51
von edel
bah ... augen auf ... sorry

Verfasst: 16.02.2006 22:57
von NicTheQuick
Meinst du das mit dem [c]Str(lPort)[/c] funktioniert so? Was ist, wenn du
das erst einem String zuweist und den dann per Pointer übergibst?

Ich weiß jetzt aber immer noch nicht wie ich das testen soll...

Verfasst: 16.02.2006 23:10
von edel

Code: Alles auswählen

    lib = OpenLibrary(#PB_Any, "Ws2_32.dll") 
    Global getaddrinfo 
    getaddrinfo = GetFunction(lib,"getaddrinfo")

    [...]
    
    If CallFunctionFast(getaddrinfo,sHostName, Str(lPort), @tHost, @tList) = 0

Verfasst: 16.02.2006 23:15
von MVXA
Ach du >_____________________<. Ich hab den Fehler jetzt gefunden.
Die Funktion hat nur einen Pointer zu einer Struktur in der Variable
gespeichert. Danke.

//Edit:
Ist zwar sehr dreckig gecodet, funkt aber:

Code: Alles auswählen

    #AI_PASSIVE = 1
    #AI_CANONNAME = 2
    #AI_NUMERICHOST = 4

    Structure sAddrInfo
        ai_flags.l
        ai_family.l
        ai_socktype.l
        ai_protocol.l
       
        ai_addrlen.l
        ai_canonname.l
       
       *ai_addr.SOCKADDR
       *ai_next.sAddrInfo
    EndStructure

    Global WSA.WSADATA

     WSAStartup_(514, @wsa)

Procedure.l ResolveName(sHostName.s, lPort.l)
    DefType.sAddrInfo tHost, tList, tListEx
   
    Select PeekB(@wsa\wVersion+1)&$FF
        Case 1 ; WinSck 1.1
        Case 2 ; WinSck 2.2
            tHost\ai_family = #AF_INET
           
            If SCK_getaddrinfo(sHostName, Str(lPort), @tHost, @tList) = 0
                If (tList\ai_flags & #AI_PASSIVE    ): Debug "PASSIVE"    : EndIf
                If (tList\ai_flags & #AI_CANONNAME  ): Debug "CANONNAME"  : EndIf
                If (tList\ai_flags & #AI_NUMERICHOST): Debug "NUMERICHOST": EndIf
                Debug Bin(tList\ai_flags)
                
                CopyMemory(tList\ai_flags, @tListEx, SizeOf(sAddrInfo))
                While tListEx\ai_next
                    If tListEx\ai_addr
                        Debug Str(tListEx\ai_addr\sa_data[2]&$FF) + "." + Str(tListEx\ai_addr\sa_data[3]&$FF) + "." + Str(tListEx\ai_addr\sa_data[4]&$FF) + "." + Str(tListEx\ai_addr\sa_data[5]&$FF)
                    EndIf
                    
                    CopyMemory(tListEx\ai_next, @tListEx, SizeOf(sAddrInfo))
                Wend
               
            Else
                Debug "error"
            EndIf
    EndSelect

EndProcedure

ResolveName("www.google.de", 80)

Verfasst: 16.02.2006 23:35
von NicTheQuick
Das hätte ich dir auch sagen können. Aber weil du gesagt hattest, es wäre
alles leer und ich das grad nicht selbst testen konnte, wollte ich nichts
fragen, was schon beantwortet wurde. :wink:

Wieso geht das hier eigentlich nicht bei mir:

Code: Alles auswählen

DefType.sAddrInfo tHost, tList, tListEx
Garbage to the end of line.


///Edit:
Komisch, bei mir gibt es in der ws2_32.dll keine Funktion mit dem Namen
[c]getaddrinfo[/c]. Hab extra nochmal mit dem HexEditor nachgeschaut.
Gibts das erst ab XP?