WinSock: SOCKET zu IP-Adresse?



  • Hallo,

    gibt es eine Möglichkeit / Funktion um von einem SOCKET auf die IP-Adresse zurückschließen zu können?

    Danke 😕 😞



  • Das Problemkind schrieb:

    Hallo,

    gibt es eine Möglichkeit / Funktion um von einem SOCKET auf die IP-Adresse zurückschließen zu können?

    Danke 😕 😞

    Wenn der Socket nicht verbunden ist, nö.
    Ansonsten natürlich oder wie denkst du stellt dein Computer eine Verbindung her? Schau dir doch mal den Artikel Thema Sockets an, der erwähnt die Struct, die du suchst.



  • Mit welcher Funktion kann ich von einem verbundenen SOCKET auf die IP-Adresse zurückschließen?



  • Welches struct meinst du? sockaddr, sockaddr_in, SOCKADDR_STORAGE, ...? Muss ich dieses struct nicht noch mit Hilfe einer Funktion mit Werten füllen? 😕



  • getsockname
    getpeername



  • Danke, aber irgendwie stürzt das Programm ohne Fehlermeldung ab. (Versuche die recv Funktion aus der Winsock zu hooken)

    int MyRecvFrom(SOCKET puiSocket, const char *szBuffer, int iBufferLength, int iFlags, struct sockaddr *pFrom, int iFromLength)
    {
    	struct sockaddr_in	grSockAddr;
    	int					iReturn = OriginalRecvFrom(puiSocket, szBuffer, iBufferLength, iFlags, pFrom, iFromLength),
    						iLength = sizeof(grSockAddr);
    
    	getsockname(puiSocket, (struct sockaddr *) &grSockAddr, &iLength); // <-
    
    	return iReturn;
    }
    

    😞



  • Ich meinte natürlich die recvfrom Funktion 😞



  • bump



  • int MyRecvFrom(SOCKET uiSock, char *szBuf, int iBufLen, int iFlags, struct sockaddr *pFrom, int *pFromLen)
    {
    	int					iReturn,
    						iClientAddrLen;
    	struct sockaddr_in	grClientAddr;
    
    	iReturn		= OrigRecvFrom(uiSock, szBuf, iBufLen, iFlags, (struct sockaddr *) &grClientAddr, &iClientAddrLen);
    	*pFrom		= (struct sockaddr *) grClientAddr; // <- ?
    	*pFromLen	= iClientAddrLen;
    
    	echo("recvfrom: %s:%d", inet_ntoa(grClientAddr.sin_addr), ntohs(grClientAddr.sin_port));
    
    	return iReturn;
    }
    

    Weiß jemand, was ich an der markierten Stelle verkehrt macht? 😞



  • *mache



  • 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... 😞


Anmelden zum Antworten