Frage zu Ports /WinSock



  • Hallo, ich mache folgendes:

    Ich erstelle einen Server
    Ein Client connected
    Der Server nimmt ihn an mit accept und übergibt accept einen pointer zu einer SOCKADDR Structur, um die Client Informationen zu speichern...

    SOCKET sk_AcceptSocket(SOCKET skServer, SOCKADDR_IN *pClientAddr)
        {   
            /* Variables */ 
            int iInAddrSize = sizeof(*pClientAddr);
    
            return accept(skServer, (SOCKADDR*) pClientAddr, &iInAddrSize);       
        }
    

    so, wenn ich nun die ip aus der Structur extrahiere bekomme ich die richtige Ip
    wenn ich nun versuche den Port zuerfahren, wirds interesant:

    ich stelle so eine verbindung her... Client Port: 1994
    (obwohl der server eigentlich auf 1234 geöffnet ist, müsste der Client nicht über den selben port connecten ?! oder regeln dass die winsocks dynamisch?)
    nun trenne ich die verbingung...

    dann verbinde ich wieder.. und nun ist der Client auf Port: 1995
    Also das der Client immer auf einem anderen Port connected kann ich noch verstehen, aber warum immer um eins erhöht ?! ich disconnecte ja schliesslich ordentlich...

    int i_CloseSocket(SOCKET skClose)
        {
            return closesocket(skClose);
        }
    
        int i_CloseWinsock(void)
        {
            return WSACleanup();
        }
    

    Ist das normal das sich der "Client Port immer um eins erhöht ?"
    Ich hab das auch mal anders ausprobiert..
    ich verbinde meine beiden programme (port : 1994 zb.) danach schliesse ich sie
    öffne meinen Browser und schliesse ihn..
    verbinde wieder meine programme und bin dann bei port: 2011, als ich das gesehen hab dachte ich mir es wäre normal das der Port vom Clienten immer "hochgezählt" wird... Habt ihr ne Idee woran das liegt ?

    Den Port lass ich mir folgender Maßen anzeigen:

    /* Get the port from addr */   
        string s_AddrToIp(SOCKADDR_IN *pAddr)
        {
            /* Check the pointer */    
            if(!pAddr) return "";
    
            /* Variables */   
            string sIp;
            sIp = inet_ntoa(pAddr->sin_addr);
    
            return sIp;
        }
    /* End */
    
    /* Get the ip from addr */  
        unsigned short ush_AddrToPort(SOCKADDR_IN *pAddr)
        {
            /* Check the pointer */      
            if(!pAddr) return 0;
    
            return ntohs(pAddr->sin_port);
        }
    /* End */
    

    Gruß Chris



  • Bei einer Tcp/Ip Verbindung ist "nur" der Einstiegspunkt mit einem Endpoint (IP Adr + Port) "fixiert.

    Der Server Socket ist auf diesem fixen Port im listen mode und wartet dann im accept auf einkommende verbindungsanfragen. Wenn eine solche kommt, wird ein neues socket erstellt (der return wert von accept), welches auf einen vom betriebssystem vergebenen port gebunden ist.

    Dann kann erneut accept aufgerufen werden um wieder verbindungsanfragen zu behandeln.

    Edit: Wie das OS die Ports vergibt ist nicht weiter interessant.
    Edit2: Mit TcpView kannst Du sehen, welcher Process welche Ports auf welche Interfaces (IP) gebunden hat. http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx?wt.svl=related

    Gruss Simon



  • Also muss ich mir keine Sorgen machen, dass ich jedesmal vergesse iwelche Sockets zu shcliessen ? (Hätte ich mir ansich auch nicht gedacht...)

    Danke schonmal Gruß Chris



  • Foxx90 schrieb:

    Also muss ich mir keine Sorgen machen, dass ich jedesmal vergesse iwelche Sockets zu shcliessen ? (Hätte ich mir ansich auch nicht gedacht...)

    Danke schonmal Gruß Chris

    Doch, das musst Du. Resourcen die angefordert werden, müssen auch wieder korrekt freigegeben werden. Nur weil gerade funktioniert ist es noch lange nicht korrekt. Es ist schlicht falsch ein nicht mehr benötigtes socket nicht zu schliesen.



  • Aber es reicht doch (so habs ich gelernt) den Socket mit closesocket (unter windows) zu schliessen und dann ganz am ende WSACleanUp() aufzurufen oder ?



  • Ja, closesocket ist korrekt. Ev. hab ich dich falsch verstanden. Wie hast Du es denn gedacht?



  • ich dachte die vergabe der ports (vom os) poassiert deshalb immer um eins erhöht weil ich iwie den vorherigen nicht richtig geschlossen hab, aber closesocket reicht ja xD 🙂

    Danke nochmal Gruß Chris


Anmelden zum Antworten