通过套接字发送2个请求

时间:2012-04-19 10:10:20

标签: php sockets tcp

我正在尝试发送2个响应相同的连接。但我发送问题。有时第二次请求丢失。

任何人都可以帮助确保第二次请求在同一连接上正确进行。

出于某种原因,我的收件人接受了两个请求。 消息计数 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");

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

请注意socket_write()并不保证发送传递给它的所有数据。来自manual page

  

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