3

私のアプリケーションは、tcpソケットを介してxmlデータを送受信する必要があります。メッセージの長さを含む固定長のヘッダーを含める方法はありません。私の知る限り、tcpを介して送信されたデータはこのように受信者に届く可能性があります。

  1. <メッサ

  2. ge><コンテンツ

  3. >こんにちは</content>

  4. </メッセージ>

しかし、どういうわけか、これは決して起こりません。つまり、1回のSend()操作で送信されたデータ(ソケットバッファーサイズより短いか等しいと仮定)は、常に1回のReceive()操作で完全に読み取られます。エンドポイントのソケットバッファが十分に大きく、超えられない場合、上記のシナリオは可能ですか?

4

3 に答える 3

4

はい、可能です。

ほとんどの場合に当てはまるように見えても、一方のsend()操作のバッファー境界がもう一方の端の対応するrecv()で見られるものと一致するとは、実際には想定できません。

たとえば、大量のデータを送信している場合、受信側のOSがTCPフロー制御を呼び出し、送信側のOSがバッファの一部しか送信できない可能性があります。または、基盤となるネットワークにパケットサイズの制限があり、分割する必要がある場合もあります。

于 2010-09-07T17:28:16.413 に答える
1

これは、間にプロキシがある場合に簡単に発生する可能性があります。プロキシがないと仮定すると、クライアントはサーバーが送信するのと同じパケットを受信します。リンクのTCPMSS未満のデータを分割して送信する場合、クライアントはおそらく1つの分割でデータを受信します。

しかし、私はこれに頼りません。closeタグ(</message>)を確認することで、XMLメッセージの終わりを簡単に確認できるため、ストリームからXMLを簡単に解析できます。

于 2010-09-07T17:28:22.513 に答える
0

メッセージにメッセージの長さを含めることができます。あなたがしなければならないのは、xml msgを送信するときに、最初の4バイトのmsgの長さを付加し、次にxmlmsgを付加することです。受信したら、ストリームの最初の4バイトをmsgの長さとして取得し、xmlmsgの各バイトを読み取ります

于 2010-09-07T17:29:10.797 に答える