0

アプリケーションで winsock を使用してクライアント サーバー接続を維持し、そのためにノンブロッキング ソケットを使用しています。しかし、FD_READメッセージを受け取ると、 recv()1 つではなく 2 つのパケットが返されることがあります。

パケットのサイズを変更して互いに異なるようにし、recv()返されるデータの量と比較しました。ときどき 2 つのパケットを受け取ることは 100% 確信しています。私のping機能が非難されるべきだと思います。アプリに、時々 ping メッセージを送信するスレッドがあります。その後、相手は別のメッセージで返信します。それが最善の方法かどうかはわかりませんが、現時点では問題ありません。

私が確かに知っていることは、これらのメッセージが「混合」されることがあるため、recv()「ping 要求」と「ping 応答」を一度に返すことです。それはどのように起こりますか?単一の呼び出しが送信recv()したデータの量だけを返すことになっていませんか? send()場合によっては、クライアントまたはサーバーが「ping 要求」メッセージを受信して​​それに応答し、自分自身の「ping 要求」メッセージを送信している場合でも、そのような不運なタイミングが考えられるとしても、相手側がパケットを別のパケットと区別して返すことはできないはずです。FD_READメッセージごとに1つ?

4

2 に答える 2

1

その場合、最後に recv を呼び出してから 2 つのパケットを取得するまでの間に、実際に 2 つのパケットを受信した可能性があります。recv は、一度に 1 つのパケットを取得するのではなく、バッファ内の利用可能なすべてのデータを読み込みます。これは、複数のデータ メッセージが利用できるか、メッセージの一部しか利用できない可能性があることを意味します。(メッセージが十分に大きい場合は、複数のパケットに分割されます。) 自分のデータをデコードするのはあなたの仕事です。これを行う簡単な方法は、メッセージ ID や予想されるデータ サイズの指示など、役立つ情報を含むヘッダーを追加することです。一般に、データの整合性を検証する (そしてメッセージが完全であることを確認する) ための CRC を含むフッターも問題ありません。

于 2013-05-21T20:04:20.313 に答える