WinSock: SOCKET zu IP-Adresse?



  • DPK schrieb:

    //...
    struct sockaddr *pFrom
    //...
    *pFrom		= (struct sockaddr *) grClientAddr; // <- ?
    //...
    

    Weiß jemand, was ich an der markierten Stelle verkehrt mach[e]? 😞

    Ich würde denken, du castest zuerst eine socketaddr_in in eine socketaddr* (beachte: Objekt zu Pointer -> kann nich gut gehen) und dann castest du den Pointer wieder zurück in ein Objekt.



  • Danke, also wäre

    *pFrom        = (struct sockaddr *) &grClientAddr; // <- ?
    

    richtiger?



  • Nö, da castest du immer noch Pointer zu Objekt.
    Was gehe würde, ist:

    *pFrom        = *((struct sockaddr *) &grClientAddr);
    

    Aber ich denke, das kann man auch ein bisschen einfacher formulieren:

    *pFrom        = (struct sockaddr) grClientAddr;
    

    Allerdings hab Ich keine Ahnung, ob man eine sockaddr_in überhaupt in eine sockaddr casten kann.



  • Der erste Schnipsel lässt das Programm abstürzen und der zweite funktioniert so nicht, aus dem Grund, den du schon nanntest...

    1>.\TSSprotect.c(68) : error C2440: 'Typumwandlung': 'sockaddr_in' kann nicht in 'sockaddr' konvertiert werden
    

    Passiert das aber nicht in dem Beispiel in der MSDN hier?

    // ...
    [b]sockaddr_in[/b] RecvAddr;
    // ...
    recvfrom(RecvSocket, 
        RecvBuf, 
        BufLen, 
        0, 
        ([b]SOCKADDR *[/b])&SenderAddr,
        &SenderAddrSize);
    // ...
    


  • Ich habe mich in dem zitierten Quelltext vertan, es müsste eigentlich

    // ...
    [b]sockaddr_in[/b] [i]Sender[/i]Addr;
    // ...
    recvfrom(RecvSocket, 
        RecvBuf, 
        BufLen, 
        0, 
        ([b]SOCKADDR *[/b])&SenderAddr, 
        &SenderAddrSize);
    // ...
    

    sein.



  • Hm.. offenbar muss man hier eine sockaddr_in beim IP-Protokoll an die Funktion übergeben. Aber ich sehe grade, du könntest dir den ganzen Aufwand so ersparen:

    int					iReturn;
    
    	iReturn		= OrigRecvFrom(uiSock, szBuf, iBufLen, iFlags, (struct sockaddr *) pFrom, pFromLen);
    


  • Dann stehe ich aber wieder am Anfang, denn ich schaffe es einfach nicht heraus zu finden, wie ich dann von pFrom auf die IP-Adresse schließen kann. Die entsprechenden Seiten in der MSDN verstehe ich nicht so recht.



  • Ev. hilft das:

    sockaddr_in from = {};
    int fromlen = sizeof(from);
    recvfrom(client, buf, len, 0, (sockaddr*)&from, &fromlen);
    
    const char* addr = inet_ntoa(from.sin_addr);
    printf("from ip address: %s\r\n", addr);
    


  • Danke, aber darauf bin ich auch schon gekommen. Sieht man ja in vielen Beispielen. Aber es klappt nicht...

    1>.\TSSprotect.c(67) : error C2039: 'sin_addr': Ist kein Element von 'sockaddr'
    1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winsock.h(485): Siehe Deklaration von 'sockaddr'
    

    Liegt wohl daran, dass ich die Funktion hooke und im Funktionskopf

    int MyRecvFrom(SOCKET uiSock, char *szBuf, int iBufLen, int iFlags, struct [b]sockaddr[/b] *pFrom, int *pFromLen)
    

    steht... 😕



  • Mir ist es zwar gelungen, den Code zu kompilieren

    int MyRecvFrom(SOCKET uiSock, char *szBuf, int iBufLen, int iFlags, struct [b]sockaddr_in[/b] *pFrom, int *pFromLen)
    

    , aber das Programm stürzt trotzdem an der Stelle ab, an der recvfrom aufgerufen wird... 😞



  • bump (sorry)


Anmelden zum Antworten