2012-04-19 99 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

我觀察到,當你在本地計算機上編程插座(客戶端和服務器在同一臺機器上)出現這種情況。

我的代碼已經從服務器向客戶端發送兩個響應和實際情況是,第一個反應是緩衝(不是實際發送),當第二個請求到達時,這一切都是一起發送給客戶端。

所以你的字符串可能有附加在一起的兩個反應。 如果是這種情況,那麼您不必擔心,因爲當服務器和客戶端位於不同的計算機上時不會發生這種情況。