2017-06-28 3 views
0

私はクライアント/サーバのプログラムを持っています。彼らはいくつかの文字と通信します。TCP/IP:保持バッファなしでrecv()メッセージを受け取りました

ex: 
client --send A-> server 
then 
client <-recv A'-- server 

しかし、私はサーバにメッセージを返さないようにしました。

ex: 
client --A--> --B--> --C--> server 
then 
client <--A'-- <--C'-- <--B'-- server 
what I want: 
client <--A'-- <--B'-- <--C'-- server 

ので、私は、クライアントプログラムの開発状況を扱いたいです。

は私だけがサーバからのデータを記録するためのバッファを維持するための一つの方法がある把握、およびクライアントが順序で受信C「をチェックし、受信したと」Bをチェックします。

クライアントでこれを実行してバッファを使用しないようにしてください。

+1

これは、コードにバグがある場合にのみ可能です。 TCPは送信されたバイトの順序を保持します。 – EJP

+0

@EJPはバグではなく、私はサーバに文字を返信するように設計しています。 – yayaya

+0

本当に。一つの質問。どうして?なぜ一方の端に意図的なバグを作り、もう一方の端で解決するか分からないのですか? – EJP

答えて

0

理想的には送信してから返信を待つ必要があります。以前の返信を受け取ったときに次の要求を送信するのが理想的です。 しかし、明らかにクライアントは、処理が完了したかどうかを問わず、返信とサーバーの応答を待たずに送信するようです。

このような場合、送受信されるデータに基づいて、クライアントプログラムとサーバープログラムにメカニズムを実装する必要があります。あなたのクライアントとサーバは、(ヘッダ+データ)のデータ上で動作するかを決定することができます

のような形式の何か:

length(2 bytes) - length of actual data 
sequence numner(2 bytes) - to be incremented for each request 
Actual data(length number of bytes) 

あなたがデータを送信保留中に、ソケット上で送信した後、要求データを保ちますサーバからの応答を待っているリクエストのリスト。 上記の形式でリクエストを受信すると、サーバーは「実際のデータ」セクションの応答データを更新し、ヘッダーの長さを更新し、シーケンスをそのまま維持して、サーバーからクライアントに返信を送信します。 クライアントは応答のシーケンス番号を保留中のリストの項目と照合して、サーバーから返信された要求を取得します

+0

なぜですか?データはどのように順序が乱れることがありますか? – EJP

+0

私は、データが順不同であると言っているのではなく、サーバがリクエストデータAとBを受け取ったとき、それがBとAを返信することを決定した場合、TCPは順番にデータを送信するメカニズムを持っています。要求データAに複数のバイトがある場合、送信されたのと同じ順序で到達します。 – Pras

+0

@Pras TCPは注文を保持します。しかし、私はサーバーが文字をクライアントに送り返し、順序どおりに送れないようにしました。クライアントのコンテンツの有効性を確認する必要があるかもしれません。私はちょうどあらゆる機能を知りたい、またはAPIがこれを処理できる。 thx – yayaya

関連する問題