2009-03-19 16 views
34

非常に小さなCまたはC++ TCPサーバー/クライアントソリューションをすばやく実装する必要があります。これは文字通りバイト配列をあるコンピュータから別のコンピュータに転送するだけです。スケーラビリティ/過度に複雑にする必要はありません。よりシンプルな方が良いでしょう。できるならクイックと汚れ。シンプルなCまたはC++ TCPサーバーとクライアントの例は何ですか?

私はこのチュートリアルからコードを使用しようとしましたが、私はそれは、LinuxでのG ++を使用して構築することができませんでした:http://www.linuxhowtos.org/C_C++/socket.htm

可能ならば、私は、サードパーティのライブラリを避けたいのですが、システムとしての私はこれを実行するのはかなり制限されています。既存のアプリケーションがすでに実装されているため、これはCまたはC++でなければなりません。 EMG-2の答えに

おかげで、私は上記の次の手順を使用してC++と互換性のコードサンプルを言及するために管理:

クライアントとサーバーの両方にこれらのヘッダを追加します。

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

server.cには、クリレンの種類をsocklen_tに変更してください。

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

へ:

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

答えて

39

私は過去にBeej's Guide to Network Programmingを使用しました。これはC言語ではなくC言語で書かれていますが、例は良いです。シンプルなクライアントとサーバーのサンプルプログラムの場合は、section 6に直接アクセスしてください。

+0

ありがとうございます - サンプル(http://beej.us/guide/bgnet/output/html/multipage/clientserver.html#simpleserver)が見つかりましたが、わかりませんそれが過度の場合、本当にすべてのコードが必要ですか? –

+0

@ nickbolton2705:おそらく、はい。 Beejのコードにはエラーハンドリングが含まれていますが、これは私がそんなに好きな理由の一部です。また、サーバーが複数の同時接続、IPv4とIPv6をサポートしていることにも注意してください。 –

+0

ええ、これはエレガントなソリューションにとっては素晴らしいことです - 機能の1つがシリアライゼーションであることに気付きました。 –

7

トライブースト:: ASIOのlib(http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio.html)、それは多くの例を持ってclient.c

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

は、次の行を変更します。

+1

これらのサンプルは適切ですか? 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

コードが単純ならば、おそらく伝統的なBSDソケットに基づくCの例を尋ねるでしょう。 boost::asioのような解決策は、短くて単純な「こんにちは世界」の例ではかなり複雑です。

上記の例をコンパイルするには、C++コンパイラでコンパイルするため、簡単な修正が必要です。両方のファイルに含まれる次の行を追加します。http://www.linuxhowtos.org/C_C++/socket.htm

  1. client.c
    #include <cstdlib> 
    #include <cstring> 
    #include <unistd.h> 
    
  2. 、行を変更:

    から
    http://www.linuxhowtos.org/data/6/server.c
    http://www.linuxhowtos.org/data/6/client.c
    :私は、ファイルを次のように言及しています
    if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) 
    { ... } 
    

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

あなたがCで見ることができるように++明示的なキャストが必要とされています。ここで

+1

また、server.cでclilenのタイプをsocklen_tに変更し、sizeof(cli_addr)の出力をキャストしなければならなかった; –

+0

簡潔な答え。 – bdd

関連する問題