0

私はソケットプログラミングがまったく初めてで、Cで結合されたTCP / UDPサーバーソケットをプログラムしたいのですが、これら2つを結合する方法がわかりません。

したがって、現時点では、TCP および UDP サーバー/クライアントがどのように機能するかを知っており、TCP および UDP のクライアントを既にコーディングしています。また、どうにかして select() 関数を使用する必要があることも知っていますが、その方法がわかりません。

TCP クライアントまたは UDP クライアントのいずれかを使用して TCP/UDP サーバーに送信される 2 つの数値を読み取り、これらの数値を使用して計算を行い、結果をサーバーに出力する必要があります。

誰かがそのチュートリアルやサンプルコードを知っているか、それを手伝ってくれますか?

または、少なくとも select() 関数の適切な説明。

4

4 に答える 4

4

基本的にイベントループを使用します。それはこのように動作します:

  1. 私が今しなければならないことはありますか?もしそうなら、それをしてください。

  2. 次に何かをする必要があるまでの時間を計算します。

  3. select読み取りセットで読み取ろうとしているすべてのソケットと、書き込みセットで書き込もうとしているすべてのソケットを指定して呼び出します。

  4. 読み取りの準備ができているソケットが見つかった場合は、それらから読み取ります。

  5. 書き込みの準備ができているソケットが見つかった場合は、それらへの書き込みを試みます。書く必要があるものをすべて書いたら、それらを書き込みセットから削除します。

  6. 手順 1 に進みます。

通常、ソケットに書き込むには、次のロジックに従います。

  1. 私はすでにこのソケットに書き込もうとしていますか? その場合は、これをキューに追加するだけで完了です。

  2. データをソケットに書き込もうとします。すべて送信したら完了です。

  3. 残りをキューに保存し、このソケットを書き込みセットに追加します。

次の 3 つの点に注意してください。

  1. すべてのソケットをノンブロッキングに設定する必要があります。

  2. ファイル記述子セットを変更するselectため、渡す前に必ずファイル記述子セットをコピーしてください。select

  3. TCP 接続の場合、おそらく独自の書き込みキューが必要になります。

于 2013-04-21T23:09:35.580 に答える
0

1) tcp/udp サーバー コードを単純に記述し、メッセージを受信したら、それを出力するだけです。

2) 印刷コードを process_message() 関数に置き換えます。

次に、TCP と UDP サーバーを同じ手順に組み合わせることに成功しました。

処理手順には注意してください。並列実行に対応する必要があります。

于 2013-04-27T06:02:01.123 に答える
0

アイデアは、サーバー内で TCP 部分と UDP 部分を混在させることです。

次に、入力を多重化します。古いselect(2)多重化呼び出しを使用できますが、制限があります (google for C10K problem)。poll(2) 多重化呼び出しを使用することをお勧めします。

libevのようないくつかのイベント ループ ライブラリを使用したい場合があります(これはselectまたはpollまたは のようなより洗練されたメカニズムを使用しますepoll)。ところで、グラフィカル ツールキット (GTK や Qt など) も独自の偶数ループ機構を提供します。

Advanced Linux Programming book (オンラインで入手可能)のような優れた Linux プログラミングの本を読んでください。syscall とイベント ループの多重化に関する優れた章があります。これらは複雑すぎて、そのような回答では数分で説明できません。本はそれらをよりよく説明しています。

于 2013-04-21T23:10:52.157 に答える