1

我正在尝试向同一连接发送 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

我观察到,当您在本地机器(客户端和服务器都在同一台机器上)上编程套接字时,会发生这种情况。

我的代码有两个响应从服务器发送到客户端,发生的情况是第一个响应被缓冲(实际上没有发送),当第二个请求到达时,它们都一起发送到客户端。

所以你的字符串可能有两个响应附加在一起。如果是这种情况,那么您不必担心,因为当服务器和客户端位于不同的机器上时,这不会发生。

于 2012-04-19T18:15:36.040 回答
0

请注意,socket_write()不保证传递给它的所有数据都已发送。从手册页

socket_write()不一定从给定缓冲区写入所有字节。有效的是,根据网络缓冲区等,尽管您的缓冲区更大,但只会写入一定数量的数据,甚至是一个字节。您必须小心,以免无意中忘记传输其余数据。

该函数将返回一个整数,该整数描述了成功发送的字节数。您需要检查返回值以确保正确发送所有数据。

像这样的东西:

// 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 回答