2012-04-09 73 views
2

我最近開始用PHP上的套接字練習,並且遇到了一個我沒有找到任何文檔的問題。我在C++中看到過類似的情況,但這不是一個明確的答案。代碼:Socket_read返回'1'..?

do { 
    $input = socket_read($client, 12,PHP_BINARY_READ); 
    echo $input; 
} while(TRUE); 

應該阻止插座(代碼創建,綁定等不包括在內),並得到使用12個字節或任何信息可以從另一個側面。

奇怪的是,如果讀取12個字節,我只是在變量$輸入中得到'1'。如果我從客戶端發送超過12個字節,那麼我會在$ input的值中收到'1 [REST_OF_DATA]'。

任何想法爲什麼會發生這種情況?

如果我將其更改爲更多數據並更改爲PHP_NORMAL_READ,那麼我會正確接收數據。

PHP手冊在網上沒有說什麼安博socket_read返回 '1' ..

**編輯:好的感謝YOUT早期的答案:)。我正在保存到一個文件並閱讀(不迴應瀏覽器)期待任何字符。我想我可能剛剛發現了一些可能很好的東西,如果有人知道C++套接字可以驗證。不管怎麼說,我讀代碼實際上是這樣的(不是我上面貼):

do { 
    $input = ($seq_id == 0) ? socket_read($client, 12,PHP_BINARY_READ) : socket_read($client,1024,PHP_BINARY_READ); 
    echo $input; 
} while(TRUE); 

我期待在第一次讀取12個字節,那麼1024塊,原因是什麼條件檢查。怪異的'1'來自這個。如果我用上面發佈的行代替它,則數據正常讀取。事實上,即使讀這樣的:

$input = ($seq_ID == 0) ? socket_read($client,12,PHP_BINARY_READ) : socket_read($client, 12,PHP_BINARY_READ); 

結果:第一次讀=「1」第2個讀=正確的數據,3 =讀取正確的數據..

+0

你怎麼知道'1'來自'$ input'? – 2012-04-09 16:24:36

+0

我將這個var保存在文件中,並使用vi讀取它 – quinestor 2012-04-09 17:32:42

+1

該代碼看起來有點誤導,'$ seq_id'不會改變。正如你已經改變了一次,我開始不相信你的話了。你在這裏提出的事實能夠強調多少?你能否提供更多細節和自動化測試以及結果? – hakre 2012-04-10 08:49:00

回答

0

對於上面的評論,是$ seq_id應該增加。我只是想縮短代碼。所以,現在,答案是不是對我很重要了,但仍然是一個謎,在本月升級我的Ubuntu版本,我已經無法用相同的腳本複製錯誤後:

<?php 
set_time_limit(0); 
$address = "192.168.1.1"; 
$port = 3320; 
$server_users = 3; 
$mysock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n"); 
$bind_result = socket_bind($mysock,$address, $port) or die("Could not bind to address\n"); 
$listen_result = socket_listen($mysock, $server_users) or die("Could not set up socket listener\n"); 
$client = socket_accept($mysock) or die("Could not accept the connection to socket\n"); 

$seq_id =0; 
do { 
$input = ($seq_id == 0) ? socket_read($client, 12,PHP_BINARY_READ) : socket_read($client,1024,PHP_BINARY_READ); 
echo $input; 
} while(TRUE); 
?> 

我在終端執行:

$php -q myscript.php 

而使用netcat的測試:

$netcat 192.168.1.1 3320 

注意的一個問題是關於socket_read返回1,因爲它的結果,這是不記錄任何地方

1

12您指定的最大長度讀取,因此12可以表示大小爲0-12個字符(PHP中的二進制字符串,1個字符= 1個字節)的返回字符串。

此外,因爲它可以是二進制的,我建議你使用var_dump和返回字符串值的hexdump來實際找出返回了多少字節,echo可能會隱藏一些控制字符,瀏覽器可能會隱藏空白。

+0

我剛剛編輯postm謝謝你的回答:) – quinestor 2012-04-09 17:31:57