0

私は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バイト。何が起こっているのかについての手がかりはありますか?

4

1 に答える 1

0

@simonc正解です。メッセージをすばやく受信すると、recvが受信したのと同じメッセージにマージされます。したがって、バッファが予想よりも長い場合は、recvから受信したメッセージを複数のメッセージに分割する必要があります。どうもありがとうございます!:)

于 2013-03-29T19:17:42.703 に答える