2009-03-19 6 views
34

Ich muss schnell eine sehr kleine C oder C++ TCP Server/Client-Lösung implementieren. Dies ist einfach, um buchstäblich eine Reihe von Bytes von einem Computer zu einem anderen zu übertragen - muss nicht skalierbar/übermäßig kompliziert sein. Je einfacher, desto besser. Schnell und schmutzig, wenn du kannst.Was ist ein einfaches C oder C++ TCP Server und Client Beispiel?

Ich habe versucht, den Code aus diesem Tutorial zu verwenden, aber ich konnte es nicht g ++ in Linux zu bauen erhalten zu verwenden: http://www.linuxhowtos.org/C_C++/socket.htm

Wenn möglich, ich 3rd-Party-Bibliotheken vermeiden möchten, wie das System I Ich laufe darauf ist ziemlich eingeschränkt. Dies muss C oder C++ sein, da die vorhandene Anwendung bereits implementiert ist.

Dank emg-2 ‚s Antwort, konnte ich das oben genannte Codebeispiel kompatibel mit C machen ++ mit den folgenden Schritten:

diese Header In dem Client und Server:

#include <cstdlib> 
#include <cstring> 
#include <unistd.h> 

Ändern Sie in server.c den Typ von clilen zu socklen_t.

if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) { ... } 

zu:

if (connect(sockfd,(const sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) 

Antwort

39

Ich habe Beej's Guide to Network Programming in der Vergangenheit verwendet. Es ist in C, nicht in C++, aber die Beispiele sind gut. Gehen Sie direkt zu für die einfachen Client- und Server-Beispielprogramme.

+0

Danke - Ich habe ein Beispiel gefunden (http://beej.us/guide/bgnet/output/html/multipage/clientserver.html#simpleserver), aber ich bin mir nicht sicher Wenn es übertrieben ist, brauche ich wirklich diesen ganzen Code? –

+0

@ nickbolton2705: Wahrscheinlich, ja. Beejs Code enthält eine Fehlerbehandlung, was ein Teil des Grundes ist, warum ich es so sehr mag. Beachten Sie außerdem, dass der Server mehrere gleichzeitige Verbindungen sowie IPv4 und IPv6 unterstützt. –

+0

Ja, das wäre großartig für eine elegante Lösung - ich bemerkte, dass eine der Funktionen Serialisierung ist, die für mich nützlich sein könnte, sollte ich dies irgendwann richtig implementieren müssen. –

7

try boost :: asio lib (http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio.html) es viele Beispiele haben

int sockfd, newsockfd, portno/*, clilen*/; 
socklen_t clilen; 

In client.c, die folgende Zeile ändern.

+1

Sind diese Proben geeignet? http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/example/iostreams/daytime_server.cpp http://www.boost.org/doc/libs/1_36_0/doc /html/boost_asio/example/iostreams/daytime_client.cpp –

12

Wenn der Code einfach sein sollte, dann fragen Sie wahrscheinlich nach C, basierend auf traditionellen BSD-Sockets. Lösungen wie boost::asio sind imho ziemlich kompliziert, wenn es um kurze und einfache "Hallo Welt" Beispiel geht.

Um Beispiele zu kompilieren, die Sie erwähnten, müssen Sie einfache Korrekturen vornehmen, weil Sie unter C++ - Compiler kompilieren. Ich beziehe mich auf folgende Dateien:
http://www.linuxhowtos.org/data/6/server.c
http://www.linuxhowtos.org/data/6/client.c
aus: http://www.linuxhowtos.org/C_C++/socket.htm

  1. In folgenden enthält zu beiden Dateien:

    #include <cstdlib> 
    #include <cstring> 
    #include <unistd.h> 
    
  2. In client.c, ändern Sie die Zeile:

    if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) 
    { ... } 
    

    zu:

    if (connect(sockfd,(const sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) 
    { ... } 
    

Wie Sie in C++ eine explizite Umwandlung benötigt wird, sehen.

+1

Auch in Server.c ich musste den Typ von clilen zu socklen_t ändern, und die Ausgabe von sizeof (cli_addr); –

+0

nette knappe Antwort. – bdd