2017-11-27 27 views
0

私はソケットから読み取るために選択アプローチを使用していますが、ほとんどの人がこれを最善の方法として推奨しています。問題は、送信されたメッセージが分割され、その半分しか受信されない場合に発生します。私はループするようにサーバーアプリケーション全体をブロックし、残りのメッセージをrecv()しようとする必要があります。私は送信ソケットを扱うために新しいスレッドを作成することを考えていました。しかし、それは選択のアイデアを殺すように感じる。 クライアントのように、完全なメッセージを送信できないようなものがあります。selectを使用してブロックrecv()を処理する方法

どうすればよいですか?

+0

返信をバッファします。そして、あなたが十分に見えるまで、解析を開始しないでください。 – wildplasser

+0

どうすればそれらをバッファリングする必要がありますか?送信されたメッセージをバッファに入れたままにしておく、接続に関連した構造を持っていますか? –

+1

はい。はい。はい。はい。 – wildplasser

答えて

0

何もブロックする必要はありません。これまでチャンネルのどこかで読んだことを保存して、select()に戻り、必要な情報が蓄積されるまで続けます。

+0

ソケットに関連付けられたバッファを持っているようなものですか?多くのクライアントが未完了のメッセージを送信したときに追跡するのはそれほど難しくありませんか? –

+0

いいえ、なぜですか?必要なのは、ソケットからバッファへのマップです。多くの場合、ソケットに関連付けられた何らかの種類のContextまたはSessionオブジェクトがあり、バッファ、資格情報、タイムアウトなどが含まれます。 – EJP

関連する問題