1

winsock でノンブロッキング ソケットを使用していますが、部分的にデータを受信できるのでしょうか?

私のパケットには「長さ」のワードが含まれており、最初にそれを読み取ってから、「長さ」に従ってパケット全体を読み取る必要があります。

実際、この質問は「recv() はどのように機能して終了するのですか?」のようなものですが、すべてのデータを取得するまで recv() を使用できますか?

4

2 に答える 2

4

ソケットの種類によって異なります。データグラム ソケットの場合は、データグラムrecv全体を 1 つだけ読み取ります。TCP ソケットの場合:

  • recv返す前に少なくとも 1 バイトを読み取ります
  • recv複数の完全な情報を読み取ることができますmessage

TCP を使用している場合は、おそらく次のようにします。

  • 長さを構成するバイトを少なくとも読み取る
  • 読み取りlengthバイト
  • これで完全なメッセージができました
  • すすぎ、繰り返し

readn関数から始めることができます。

于 2012-05-21T18:48:03.353 に答える
2

TCP ソケットの場合: 十分なバイト数が得られるまで、recv をループで使用できます。recv は、要求したよりも少ないバイト数を返す場合があることに注意してください。その場合は、メッセージ全体がわかるまで電話をかけ続けてください。

于 2012-05-21T18:49:02.353 に答える