私はCでWebSocketサーバーを構築しています。現在、rfc6455仕様に準拠しており、接続されたクライアントが相互にメッセージを送信できるように、チャットプロトコルを実装することができました。サーバーの強度をテストするために、JavaScriptを実行して、同じクライアントからの1秒あたりの複数のメッセージを処理できるかどうかをテストしました。
i = ''; a = 0; t = setInterval('a++; i += "...................................................................................................."; doSend(a + i);', 20);
上記のコードは、20ミリ秒ごとにメッセージを送信します。さらに、送信されるメッセージは、メッセージごとに100バイト大きくなります。サーバーはメッセージを取得し、接続されたクライアントに最初の360回送信することができましたが、その後、何か奇妙なことが起こりました。
サーバーが受信するすべてのメッセージについて、そのペイロード長が必要です。メッセージ360の場合、360 * 100 + 3 = 36003になります。この値はメッセージの最初の部分で指定されるため、メッセージが実際に送信されることに依存しています。 36003バイトの長さである。
関数recvを使用してソケット接続からデータを受信し、現在、バッファサイズは8192バイトです。バッファサイズよりも大きいメッセージを受信した場合は、メッセージ全体が受信されるまで、もう一度recvを呼び出します。奇妙なことに、メッセージ番号360を受信した場合、メッセージ全体を受信するには、バッファを5回読み取る必要があります(5 * 8192> 40000)。読み取り番号5が3235バイト(36003-(4 * 8192))である代わりに、recv関数はフルバッファー(別名)を返します。8192バイト。何が起こっているのかについての手がかりはありますか?