2012-04-19 75 views
1

我想发送2个对相同连接的响应。但我有问题发送。有时候第二次请求丢失。通过套接字发送2个请求

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

由于某种原因,我的clent接受两个请求。 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"); 
+0

你的套接字写入很可能正在完成,问题出在接收代码上。但没有任何适当的调试尝试,这只是一个猜测。 – Jon 2012-04-19 10:13:40

回答

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 
1

我观察到,当你在本地计算机上编程插座(客户端和服务器在同一台机器上)出现这种情况。

我的代码已经从服务器向客户端发送两个响应和实际情况是,第一个反应是缓冲(不是实际发送),当第二个请求到达时,这一切都是一起发送给客户端。

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