2012-03-17 23 views
4

這是關於如何處理從網絡套接字接收的前綴消息的follow-up question。我嘗試做的是:具有前導長度值的處理套接字數據

  1. 閱讀前4個字節(這是$前綴,表示消息的長度)
  2. 檢查$前綴有真正的4個字節的大小,如果它是一個整數
  3. 使用從$前綴
  4. 檢查長度閱讀完整的$消息,如果消息具有$真正大小前綴字節

到目前爲止,我的代碼如下兩行:

$prefix = socket_read($socket, 4, PHP_BINARY_READ); //No 1. 
    //No 2: how to do the checks? 
    $message = socket_read($socket, $prefix, PHP_BINARY_READ); //No 3. 
    //No 4: how to do the checks? 

我該如何做上述檢查?

一個小側面說明:通過網絡套接字連接發送的所有數據是UTF8,小尾數

回答

4

你可以驗證你只需使用strlen收到的二進制字符串的長度:

$prefix = socket_read($socket, 4, PHP_BINARY_READ); 
if (strlen($prefix) != 4) { 
    // not 4 bytes long 
} 

根據你以前的問題,這個二進制字符串表示一個32位長。 Unpack它是這樣(具有相同的格式說明您使用時包-ING它),然後獲取消息,並再次使用strlen驗證長度:再次

$length = current(unpack('l', $prefix)); 
$message = socket_read($socket, $length, PHP_BINARY_READ); 
if (strlen($message) != $length) { 
    // $message not the size of $length 
} 
+2

感謝您的幫助,真的很感激。要檢查$前綴是否是一個整數,我必須檢查$ length(is_int($ length))中的解壓值,是否正確? – Mike 2012-03-18 20:14:25

+0

@Mike:如果'$ prefix'不是指定的格式(在上面的例子中是一個32位有符號長符,'l'),'unpack'將返回'false'。如果解壓縮返回「false」以外的任何內容,則不必檢查「is_int」。 – netcoder 2012-03-19 02:05:01

+0

謝謝,作品完美! – Mike 2012-03-24 00:18:27