2013-02-20 153 views
0

我想在php中編寫異步套接字偵聽器代碼。但聽衆響應只回答第一個請求和其他請求它只能接收數據包沒有響應(我正在檢查與嗅探器)我還在計算有多少時間循環活動和循環活動只爲第一個請求.... ..我會告訴我的代碼:異步套接字連接在php

addr = '192.168.0.117'; 
$port = 7878; 
$sock = socket_create(AF_INET, SOCK_STREAM, 0); 
socket_bind($sock, $addr, $port) or die('Could not bind to address'); 
socket_listen($sock); 

$null = NULL; 
$clients = Array(); 
$cc = 0; // loop counter 

while(true){ 

    echo $cc."<br>"; 
    $cc = $cc +1; 

    $read[0] = $sock; 

    $ready = socket_select($read,$null,$null,$null);  
    $client = socket_accept($sock); 
    $input = socket_read($client, 312); 


    echo $input; 

    if($input == "exit"){ 
     socket_close($client); 
     socket_close($sock); 
     return false; 
    } 

    $output = 0x11; 
    socket_write($client,$output); 
    $input = ""; 
} 
+0

供參考:這不是異步 – 2013-02-20 12:11:27

+0

感謝科林的信息,但你能幫我嗎? – user1360571 2013-02-20 12:12:55

回答

0

可能是你正在關閉監聽套接字的第一客戶端發送exit命令之後。當客戶端發送exit命令時,您應該只關閉client套接字。並且您從while循環中您return false。這意味着它顯然只會處理一個客戶端。

if($input == "exit"){ 
    socket_close($client); 
    socket_close($sock); // Think about this Line. 
    return false; // Think about this Line. 
} 
+0

謝謝你的回答shazin,這個命令退出是爲所有的客戶端是正確的......這裏沒有問題......問題出現在首先請求例如「3401000031313639313030303938383334380051」服務器接收它並打印到屏幕中的循環...但1個數據包後,只有嗅探器可以看到數據包在同一個本地端口接收,但我的服務器無法顯示到屏幕上,並且循環計數器再次爲0.當我從另一個服務器發送請求「退出」時,它可以收回它並且循環數爲1。它只爲新的連接循環,但我需要循環每個新的異步數據包... PS對不起英語 – user1360571 2013-02-20 12:11:36

+0

@ user1360571如果你想要真正的異步通信,你需要選擇一種新的語言。就目前而言,這是同步和阻塞。你的'socket_read'將會掛起,直到它接收到312個字節的數據,或者連接關閉(以先到者爲準)。在PHP手冊中查找'stream_set_blocking',但明白它不能解決你所有的問題。 PHP並不打算像這樣異步。考慮爲這個項目使用類似node.js的東西,如果這些是你的要求的話。 – 2013-02-20 12:14:19