2016-11-01 5 views
0

私はこの2面(クライアントとサーバー)のプログラムを基本的に "チャットプログラム"であるC++で書いています。C++ソケットマルチスレッドのない非同期/並列コード

一方の側から他方の側にデータを送信して他方の側にデータを送信します。 私はCソケット(TCP/SOCK_STREAM)を使用しています。

サーバーがデータ(「recv()」を待っている間に、recvキューが無限であるため、データ自体を送信できません。

私はこれを解決する2つの方法を考えましたが、その価値があるかどうかはわかりません。多分私はあまりにも愚かすぎると思う簡単な解決策があるので。

  1. 「物理サーバ」があり、私のサーバは4つのインスタンスで実行され、各クライアント(送信と受信)ごとに2回実行されていることを意味します。あるサーバーがデータを受信すると、データをファイルに保管し、他のクライアントの送信サーバーが読み取って送信するようにします。他の方法と同じように動作します。

この解決策はかなりばかげているので、私はそれにつかないかもしれません。

  1. マルチスレッドの使用。あなたがする必要がない限り、私は純粋な癌の使用を聞いたので、それを使用すべきではありません。

私の質問は何ですか?または、おそらく単純な解決策ですか?

答えて

0

recv()は、着信データを待つ必要があり、データが到着するまで何もする必要がない場合に使用されます。あなたのケースではない場合は、non-blocking socket、またはselectをタイムアウトに使用することができます。 selectは簡単です。ソケットに定期的に到着したものがあるかどうか(ループなど)を確認し、その間にしたいことをしてください。

ところで、これは "Cソケット"ではなく "BSDソケット"と呼ばれ、これはあなたのグーグルに役立つことができます。

+1

それをサポートするプラットフォームで 'select()'の代わりに 'epoll()'を使うことを検討してください。 –

+0

@RemyLebeau:そうです。実際に私はそれらのどれも(直接的に)使用せず、Boost.Asioのようなクロスプラットフォームの高水準のソリューションを好む –

関連する問題