getaddrinfo meldet erfolg, struktur bleitb aber leer.

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

getaddrinfo meldet erfolg, struktur bleitb aber leer.

Beitrag 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)
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Was ist [c]SCK_getaddrinfo()[/c] für eine Funktion? Irgendeine Library?
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Port für
http://msdn.microsoft.com/library/defau ... info_2.asp
PB kennt die Funktion nicht von selbst...
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

bah ... augen auf ... sorry
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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...
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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)
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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?
Antworten