- 私、コードのthatsがデータを受信以下の通りです:socket_recvは1448バイトのみを受信していますか?私のクライアントがサーバに送信する完全なデータを受信する<code>socket_recv</code>といくつかの問題を抱えて
while(true) {
$changedSockets = $this->sockets;
$result = socket_select($changedSockets,$write,$except,0);
foreach($changedSockets as $socket){
$buffer = '';
$message = '';
$bytes = @socket_recv($socket, $buffer, 4096, 0);
echo "Lenght: (".$bytes.length.")";
if ($bytes === false) {
$error = self::getLastError($this->socket);
trigger_error('Failed to receive data from client #'.$client->id.': '.$error->message.' ['.$error->code.']', E_USER_WARNING);
continue;
}
$len = ord($buffer[1]) & 127;
$masks = null;
$data = null;
if ($len === 126) {
$masks = substr($buffer, 4, 4);
$data = substr($buffer, 8);
}
elseif ($len === 127) {
$masks = substr($buffer, 10, 4);
$data = substr($buffer, 14);
}
else {
$masks = substr($buffer, 2, 4);
$data = substr($buffer, 6);
}
for($index = 0; $index < strlen($data); $index++) {
$message .= $data[$index]^$masks[$index % 4];
}
if ($bytes == 0) {
$this->disconnectClient($socket);
}
}
}
}
このコードは非常にうまく動作しますが、一つの問題で:I場合5800文字を超えるテキストを送信すると、私のコードはフルテキスト(小さな部分のみ)を受け取ることはありません。いただきましたが、私は持っているどのように多くのバイトを確認するには、以下のコードを挿入して起こっている表示するには
が来る:これにより
$bytes = @socket_recv($socket, $buffer, 4096, 0);
echo "Lenght: (".$bytes.length.")";
を私はあなたがバイトのサイズは5800文字未満のテキストを送信するときにことがわかりクライアントが送信するバイトと同じサイズ。テキストが5800文字を超えると、socket_recv
の長さは1448文字にとどまります。 (私はそれがより多くの文字を取得します高い値に値4096を変更するが、私が上げた場合、PHPは、メモリの問題行う場合)
私が使用してのように多くのことを試してみてください。この問題を解決するには:MSG_DONTWAIT
、MSG_WAITALL
、while($bytes > 0){ ... }
を。しかし、それらはすべてコードの残りの部分(socket_recv以下)がもはや実行されないように無限ループに入ります。
どうすればこの問題を解決できますか?私はこの問題を解決するために私の脳をラッキングされたが(私はlocalhostでwampserverで - 私のテスト)
解決策
は、私は一時的な解決策について考えた:
場合私たちは5800文字よりも大きいテキストを送ることはできません、私は の文字を5800 文字より小さな文字にカットするコードをクライアント側に作成して、これらの部分をソケットに別々に パラメータは、このエントリが切り捨てられ、ソケット内では がそれらをフィルタリングして文字に参加しようとする可能性があることを示しています。
あなたはwebsocketサーバーを実装しているようです。プレーンなソケットがどのように機能するかについて多くの知識がなくても、最初からこれをやりたいのですか?メッセージ全体を取得するまで、メッセージを解析して 'recv()'を続ける必要があります。 – CodeCaster
@CodeCaster、私は下の答えとして投稿された私のイデアを試して、とてもうまくいきました。そして、私のコードは5800文字以上のメッセージを受信できます。 – Lacrifilm
@RyanVincent私はこれらのライブラリを知っていますが、少し問題があります。ライブラリの多くは私が使用しないものがあります。私はプライベートチャットアプリケーションを作成しようとしていて、いつもソケットに関する好奇心が...初心者からの挑戦よりも優れたものはありません。D – Lacrifilm