TCP/IP Tutorial



  • Hallo,

    ich möchte Daten über eine TCP/IP-Verbindung senden und empfangen. Gibt es da ein gutes Tutorial?
    Ich habe gehört, daß Bejees Network tutorial ganz gut sein soll, kann es aber nirgends finden. Weiß jemand, wo das zu finden ist?

    Dank Euch





  • Hallo und Danke für die Antwort.

    ich habe jetzt folgendes Problem:

    ich möchte einen Server programmieren, der Daten für einen CLient bereit stellt. Der Client stellt eine Verbindung her, sendet eine Anfrage und wartet auf Antwort. Der Server akzeptiert die Verbindung, erwartet die Anfrage und sendet die gewünschten Daten. Diese Kommunikation soll einmal oder mehrmals erfolgen können. Anschließend beendet der Client die Verbindung.

    Wie erkennt nun der Server, daß die Verbindung beendet wurde?

    Muss pro Kommunikation (= ein Datenpaket empfangen und eines senden) eine Verbindung aufgebaut und sofort wieder mit close() abgebaut werden?
    Falls dann in der Zwischenzeit der Client die Verbindung beendet, würde der Server dies erkennen, wenn accept() blockiert, bzw im nicht-blockierenden Modus einen Fehler liefert. So weit zur Theorie, in der Praxis funktioniert das nicht. accept erkennt trotz bestehender Verbindung seitens des Clients manchmal keine, manchmal eine Verbindung.

    Vielen Dank und schöne Grüße,

    yecc



  • yecc schrieb:

    Wie erkennt nun der Server, daß die Verbindung beendet wurde?

    Wenn du eine verbindungsorientierte Kommunikation (SOCK_STREAM) aufbaust, liefern recv() und send() den Return-Code "0", wenn die andere Seite die Verbindung schließt.
    In der Regel sollte man jedoch das Ende der Verbindung "ankündigen", bei HTTP sendet der Server beispielsweise vor der Übertragung der Web-Seite die Information, wie lang die Seite ist. Damit weiß der Client, wann die Übertragung beendet ist.

    yecc schrieb:

    Muss pro Kommunikation (= ein Datenpaket empfangen und eines senden) eine Verbindung aufgebaut und sofort wieder mit close() abgebaut werden?yecc

    Nein. Client und Server können sich beliebig lange über eine Verbindung unterhalten. Ein Beispiel hiefür ist FTP . Wenn du mit ftp eine Verbindung zum ftp-Server aufbaust, kannst du darüber beliebig viele Dateien in beide Richtungen übertragen.
    Bei HTTP wird dagegen für jede Seite und jede Grafik auf der Seite eine eigene Verbindung aufgebaut. Das ist aber in HTTP nicht in dem darunter liegenden TCP/IP begründet.

    Mehr (einsteigergerechte) Infos dazu und Beispiel-Server und -Client findest du auch in meinem Buch "C und Linux" 😉

    Martin



  • Bei HTTP wird dagegen für jede Seite und jede Grafik auf der Seite eine eigene Verbindung aufgebaut.

    Quatsch.



  • keep-alive schrieb:

    Bei HTTP wird dagegen für jede Seite und jede Grafik auf der Seite eine eigene Verbindung aufgebaut.

    Quatsch.

    Ich will mich nicht als HTTP-Experte bezeichnen, ich habe aber immerhin schon Web-Server und CGI-BINs programmiert, und die einzige Möglichkeit, die ich kenne, um mehr als eine HTML-Seite oder eine Grafik über die Verbindung zu übertragen ist "Content-type: multipart", was jedoch nicht von allen Browsern unterstützt wird.
    In allen anderen Fällen wird nach Übertragung der Datei (HTML-Seite oder Grafik) die Verbindung Server-seitig beendet. Jede HTTP-Anfrage wird als neue Verbindung (accept()) aufgebaut. Bei einem typischen HTTP-Server läuft jede dieser Anfragen auch in einem eigennen Thread ab:

    while (1)
     {
      addr_size = sizeof(struct sockaddr_in);
      client_fd = accept(sock_fd, &client_addr, &addr_size);
      if (client_fd == -1)
        err_exit("webserver: accept() failed");
    
      if ((pid = fork()) == -1)
       {
        fprintf(stderr, "webserver: fork() failed.\n");
        return(1);
       }
      else if (pid == 0)          /* Kind-Prozess */
       {
        close(sock_fd);
        http_service(client_fd);
        close(client_fd);
        return(0);
       }
      close(client_fd);
     }
    

    Da du offenbar anderslautende Spezifikationen hast, würde mich die Quelle mal interessieren, auf die du dich beziehst.

    Martin



  • Unter HTTP/1.0 gab es bemühungen das mittels des "Connection: Keep-alive"-Flags zu ändern (war aber kein teil des rfc standards afaik). Unter HTTP/1.1 ist das wohl bei jeder Verbindung, wenn nicht explizit durch "Connection: Close" geändert.

    In der RFC von HTTP/1.1 steht da einiges zu.



  • @ kingruedi:
    Stimmt, FireFox sendet im Header der Anfrage immer die Option "Connection: keep-alive" mit und nutzt dann - sofern der Server die Verbindung nicht beendet - die gleiche Verbindung für die weiteren Requests.

    HTTP/1.0-Browser haben dagegen immer eine neue Verbindung geöffnet.




Anmelden zum Antworten