1

同じ接続に 2 つの応答を送信しようとしています。しかし、送信に問題があります。たまに2ndリクエスト欠品。

2番目のリクエストが同じ接続で正しく行われていることを確認する方法を教えてください。

何らかの理由で、私のクライアントは 2 つの要求を受け入れます。1. メッセージの数。2.表示するメッセージ。

$valCount = str_pad(strlen($message), 4, "0", STR_PAD_LEFT);
socket_write($socket, $valCount) or die("[" . @date('H:i:s') ."] Could not send output\n");
socket_write($socket, $message) or die("[" . @date('H:i:s') ."] Could not send output\n");
4

2 に答える 2

1

私は、ローカル マシン (クライアントとサーバーの両方が同じマシン上にある) でソケットをプログラミングしているときに、これが発生することを確認しました。

私のコードには、サーバーからクライアントに送信された 2 つの応答があり、最初の応答がバッファリングされ (実際には送信されませんでした)、2 番目の要求が到着すると、すべて一緒にクライアントに送信されました。

したがって、文字列には 2 つの応答が一緒に追加される場合があります。この場合、サーバーとクライアントが別のマシン上にある場合には発生しないため、心配する必要はありません。

于 2012-04-19T18:15:36.040 に答える
0

socket_write()渡されたすべてのデータが送信されることを保証するものではないことに注意してください。マニュアルページから:

socket_write()指定されたバッファからすべてのバイトを書き込む必要はありません。ネットワークバッファなどによっては、バッファが大きい場合でも、1バイトでも一定量のデータしか書き込まれないのが妥当です。残りのデータを意図せずに送信することを忘れないように注意する必要があります。

この関数は、正常に送信されたバイト数を表す整数を返します。すべてのデータを正しく送信するために、戻り値をチェックする必要があります。

このようなもの:

// An array of the messages to send
$messagesToSend = array();
$messagesToSend[] = str_pad(strlen($message), 4, "0", STR_PAD_LEFT);
$messagesToSend[] = $message;

// Loop the message queue
foreach ($messagesToSend as $data) {

  // Loop while still data to send
  while ($data) {

    // Send data
    $bytesSent = socket_write($socket, $data);

    // Check for failures
    if ($bytesSent === FALSE) {
      die("[".date('H:i:s')."] Could not send output (".socket_strerror(socket_last_error($socket)).")\n");
    }

    // Trim the data that was sent off $data
    // This approach means that the while() loop will finish when all the data
    // has been sent - $data will be an empty string so will evaluate to FALSE
    $data = substr($data, $bytesSent);

  } // while

} // foreach
于 2012-04-19T10:21:26.713 に答える