0


0

Socket.Receive-終わりはどこですか?

クライアントからデータを受け取りたい。 正確には、クライアントが送信するすべてのデータ。 ただし、データを送り返したいので、接続を閉じたくありません。

多分それはすでに夜遅くまでです(少なくともドイツでは)-どうすればいいですか? 通常、私は最後にセミコロンまたはそのようなものを入れたと言いますが、HTTPのようなプロトコルもそれをしません(またはそうしますか?)。 そこでどのように機能しますか?

ありがとう、eWolf

3 Answer


4


HTTPプロトコルでは、Content-Lengthヘッダーを使用して、データの量を事前に識別します。

プロトコルで同様のことができます。


3


相手側がソケットを正常にシャットダウンした場合、すべてのデータを受信するとストリームの終わりに到達したことを示すReceive呼び出しはゼロを返します。 ただし、このストリームの終わり条件は永続的であり、もう一方の端がソケットでこれ以上データを送信することを防ぎます。

TCP / IPは、論理/アプリケーション固有のメッセージの大きさを理解していないストリームプロトコルです。 上記のストリームの終わりの指示を使用している場合を除き、送信するデータに独自のインジケーターを作成する必要があります。 これは「フレーミング」と呼ばれることもあります。 たとえば、送信者は、データの前に後続のバイト数を付けることができます。 受信者は最初にこのプレフィックスを読み取り、妥当な番号であることの健全性チェックを行います。 次に、受信者は、そのバイト数が受信されるまでループでReceiveを呼び出します。

フレーミングに関する適切な情報は、http://nitoprograms.blogspot.com/2009/04/message-framing.htmlから入手できます。


1


ヌルターミネータ(0)を探します。これは、データのエンコードに応じて異なるサイズになる場合があります。

ASCIIには1バイトのヌルターミネーターがあります。