アプリケーションで winsock を使用してクライアント サーバー接続を維持し、そのためにノンブロッキング ソケットを使用しています。しかし、FD_READ
メッセージを受け取ると、 recv()
1 つではなく 2 つのパケットが返されることがあります。
パケットのサイズを変更して互いに異なるようにし、recv()
返されるデータの量と比較しました。ときどき 2 つのパケットを受け取ることは 100% 確信しています。私のping機能が非難されるべきだと思います。アプリに、時々 ping メッセージを送信するスレッドがあります。その後、相手は別のメッセージで返信します。それが最善の方法かどうかはわかりませんが、現時点では問題ありません。
私が確かに知っていることは、これらのメッセージが「混合」されることがあるため、recv()
「ping 要求」と「ping 応答」を一度に返すことです。それはどのように起こりますか?単一の呼び出しが送信recv()
したデータの量だけを返すことになっていませんか? send()
場合によっては、クライアントまたはサーバーが「ping 要求」メッセージを受信してそれに応答し、自分自身の「ping 要求」メッセージを送信している場合でも、そのような不運なタイミングが考えられるとしても、相手側がパケットを別のパケットと区別して返すことはできないはずです。FD_READ
メッセージごとに1つ?