我正在尝试发送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");
答案 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