Winsock



  • Hallo,
    ich habe eine Verbindung via Winsock (TCP/IP) zwischen zwo PC's. Gibt es eine möglichkeit beim Server die IP des Client herauszufinden ?
    Danke schon mal für alle Vorschläge...



  • Hi!!!

    Schau mal <<<HIER>> nach.
    Section Tutorials und 1. Lektion. Ich glaube da muesste was drüber stehen...

    cu,
    Lukas



  • Ja das mit dem Struct den man beim accept angeben kann kenn ich, aber ich komm damit nicht klar. Bei mir kommt da immer eine merkwürde Zahl raus aber nich meine IP.



  • Hi!!!

    Also ich muss echt zugeben, dass ich das auch zum ersten Mal gemacht hab und auch zugeben, dass auf www.c-worker.ch dies nicht stand...

    Jetzt habe ich das Besipiel von www.c-worker.ch mal genommen und so geaendert, dass es deinen Wünschen entspricht:

    Man möchte es mir Seitens der "Tutorial Schreiber" von www.c-worker.ch vergeben, danke!!!

    Der Fettgedruckte Code sind die von mir vorgenommenen Änderungen:

    [cpp]
    #include <winsock2.h>
    #include <stdio.h>

    //Prototypen
    int startWinsock(void);
    int main()
    {
    long rc;
    SOCKET acceptSocket;
    SOCKET connectedSocket;
    SOCKADDR_IN addr;
    **SOCKADDR_IN c_addr;
    int len = sizeof(c_addr); // Habe hier malauf die schnelle int genommen...
    **
    // Winsock starten
    rc=startWinsock();
    if(rc!=0)
    {
    printf("Fehler: startWinsock, fehler code: %d\n",rc);
    return 1;
    }
    else
    {
    printf("Winsock gestartet!\n");
    }

    // Socket erstellen
    acceptSocket=socket(AF_INET,SOCK_STREAM,0);
    if(acceptSocket==INVALID_SOCKET)
    {
    printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
    return 1;
    }
    else
    {
    printf("Socket erstellt!\n");
    }

    memset(&addr,0,sizeof(SOCKADDR_IN));
    addr.sin_family=AF_INET;
    addr.sin_port=htons(12345);
    addr.sin_addr.s_addr=inet_addr("127.0.0.1");

    rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    if(rc==SOCKET_ERROR)
    {
    printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());
    return 1;
    }
    else
    {
    printf("Socket an port 12345 gebunden\n");
    }

    rc=listen(acceptSocket,10);
    if(rc==SOCKET_ERROR)
    {
    printf("Fehler: listen, fehler code: %d\n",WSAGetLastError());
    return 1;
    }
    else
    {
    printf("acceptSocket ist im listen Modus...\n");
    }

    connectedSocket=accept(acceptSocket,(SOCKADDR*)&c_addr,&len);
    if(connectedSocket==INVALID_SOCKET)
    {
    printf("Fehler: accept, fehler code: %d\n",WSAGetLastError());
    return 1;
    }
    else
    {
    printf("Neue Verbindung wurde akzeptiert! %d\n");
    printf("Client IP %s, PORT %u\n", inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port) );
    }

    rewind(stdin);
    getchar();

    return 0;
    }

    int startWinsock(void)
    {
    WSADATA wsa;
    return WSAStartup(MAKEWORD(2,0),&wsa);
    }[/cpp]

    Also, hoffe, dass alles klappt und, dass es so verständlich ist...

    cu,
    Lukas

    [ Dieser Beitrag wurde am 08.06.2002 um 22:54 Uhr von Consystor editiert. ]



  • Hi!!!

    Als Erklärung, wieso ich int genommen habe ist, weil ich zu diesem Thema diese Seite gefunden habe und socklen_t in windows.h nicht definiert ist.

    Jetzt hab ich aber diese Seite gefunden, wo socklen_t mit

    typedef int socklen_t;
    

    definiert ist.
    Kannste ja dann auch machen statt int.

    cu und machs gut,
    Lukas

    PS: Ne gute Seite mit den Erklärungen für inet_addr() und ähnliche Funktionen findest du <<<HIER>>>!!!

    [ Dieser Beitrag wurde am 08.06.2002 um 23:22 Uhr von Consystor editiert. ]



  • Wenn man die Client-IP wissen will, kann man auch getpeername() benutzen...



  • Thnx!!!



  • ich vergebe dir!
    🙂


Anmelden zum Antworten