画像検索サーバーが問題記録を作成――TCPがパッケージ化!!


サーバ側はマッチング度の高い画像を選択した後、複数の画像をクライアントに送信した結果、クライアントは最初の画像が正常である以外は文字化けであった.運が良ければ、二つは正しい.印刷クライアントの受信データは以下の通りです.
136199
���
����l~,s8�[��:��t���
       u�.bIc�9M���o��c�T1)\$�dLm��[�b'
                                        1�y�j%
                                              �qtU��grß��>٩�� F��4���)�l��ǰ$o���E`���Q��gަ2�2��y�	۽ ;�Po��Q$�p�8�@�s�v�'ޥ�r9�9�
�܁��d�E-~ �
             H��P,�B��j��
��?�n��4f&
      �Y8RzW&5v��;(?`�~d`�GyrB걝v~t�

���!)����
i*]@`�B���IvT4��q{Xo-��"�5&@=��U_2H��(�(:�v�z�p� ���ԒJ��*��63�
#m�I9�3�Y��_.��
0΁����U���DYW
��nHϰP�����6۽C�d�8�Ljd�w�6���߬�-Ex��(�T�O#If�Hc($����>�^ǂY�;y4�v�$���%oJ��*�\(�
                       }�E��w���\;1�3�@x�j�E42JV6��m|����՘���Ct��G�d�3���j���jבZ�
は一部削除したが、最初のファイルのファイルサイズ136199だけが明確に受信され、その他は文字化けしていることが明らかになった.
上から下までコードをチェックして、間違いは見つかりませんでした.
サーバから画像を1枚送信した後にsleep(3)を追加した結果,クライアントはすべて正常に受信した.頼む!!!
TCPボンドという古い言葉が頭に浮かんだ.そしてsockfdにTCPを付けましたNODELAY···
ただし、サーバ側にTCP_を設定NODELAY後もパケットを正しく受信できません.チェックすると、クライアントプログラムが間違っていることがわかりました.
元々クライアントプログラムはfor{read socketfd受信10 bitの長さであり、read socketfd受信20 bitのファイル名、read socketfd受信ファイル}このように最初のファイルを書き終わった後、残りのデータはすべて破棄されるので、残りのパケットが正しく受信できない.
複数のファイルを送信するのは、TCP====IP=======TCPのプロセスであり、送信側でNagleアルゴリズムを閉じると同時に(一度に一度、小さなパケットを大きなパケットにしないで一緒に送る)、受信側が一度に一度に受信することを確保するかもしれない.私の場合、受信側で正しく受信していない+送信側でNagleアルゴリズムを閉じていない.
次の手順に従います.http://www.cnblogs.com/qiaoconglovelife/p/5733247.html
1粘着現象TCP粘着とは、送信側から送信された複数のパケットデータが受信側に受信されたときに1パケットに粘着し、受信バッファから見ると、後のパケットデータの先頭が前のパケットデータの末尾に続くことを意味する.2なぜ粘着現象が現れるのか(1)送信側の理由TCPではデフォルトでNagleアルゴリズムが使用されていることが分かるが,Nagleアルゴリズムでは主に2つのことを行う:1)前のパケットが確認されてこそ,次のパケットが送信される;2)複数の小さなパケットを収集し,1つの確認が来たときに一緒に送信する.したがって,Nagleアルゴリズムが送信側にパケットの付着現象をもたらす可能性がある.(2)受信側要因TCPがパケットを受信した場合、すぐにアプリケーション層処理に送信されるわけではない、あるいは、アプリケーション層は必ずしもすぐに処理されるわけではない.実際には、TCPは受信したパケットを受信キャッシュに保存し、その後、アプリケーションは、受信したパケットをキャッシュから積極的に読み出す.このように、TCPがパケットを受信する速度がアプリケーションがパケットを読む速度よりも大きい場合、多くの個のパケットがキャッシュに格納され、アプリケーションが読むと、複数のヘッダが接続されたパケットが読み出されます.3いつ粘着現象を処理する必要があるか(1)送信者が送信した複数のパケットが本来同じデータの異なる部分であり、例えば大きなファイルが複数のパケットに分けて送信される場合、当然粘着現象を処理する必要はない.(2)しかし、複数のパケットブックが全く関係なく、さらには並列関係であれば、私たちは必ず粘着問題を処理しなければならない.例えば、私が受信する各パケットは固定形式の商品情報であり、粘着問題を処理しなければ、読み込んだ各パケットは一番前の商品だけを処理し、後ろのものは捨てられる.これは明らかに私が望んでいないものではない.結果.4どのように粘着現象を処理するか(1)送信者が送信者に与える粘着現象は、Nagleアルゴリズムを閉じることによって解決することができ、TCP_NODELAYオプションを使用してNagleアルゴリズムを閉じることができる.(2)受信者は、残念ながらTCPが受信者の粘着現象を処理していないメカニズムであり、アプリケーション層でしか処理できない.(3)アプリケーション層がアプリケーション層を処理する処理は簡単で実行しやすい!また、受信者による粘着問題を解決できるだけでなく、送信者による粘着問題も解決できる.解決方法は循環処理である:アプリケーションはキャッシュから読み取ったパケットを処理する時、1つのデータを読み終わった時、次のデータを循環して読んで、すべてのデータが処理されるまで;しかし、どのようにして各データの長さを判断しますか?2つの方法:1)データのフォーマット:各データに固定されたフォーマットがある(開始文字、終了文字)この方法は簡単で実行しやすいが、開始文字と終了文字を選択する際には、必ず各データの内部に開始文字や終了文字が現れないことに注意しなければならない.長さによって各データの開始と終了を判断することができる.