2009-04-07 112 views
2

這裏是我的代碼:PHP:插座聽問題

<?php 

$host = "127.0.0.1"; 
$portListen = 1234; 
$portSend = 1240; 


// create socket 
$sSender = socket_create(AF_INET, SOCK_STREAM, 0); 

socket_connect($sSender, $host, $portListen); 

socket_write($sSender, "test", strlen ("test")); 


$sListen = socket_create(AF_INET, SOCK_STREAM, 0); 
socket_set_option($sListen, SOL_SOCKET, SO_REUSEADDR, 1); 

socket_bind($sListen, $host, $portSend); 

socket_listen($sListen,1); 
$dataSock = socket_accept($sListen); 
echo socket_read($dataSock, 3, PHP_NORMAL_READ); 

// close sockets 
socket_close($sSender); 
socket_close($sListen); 
?> 

我送「測試」到另一個應用程序,它接收和發送回「確認」。問題是,我只能做一次。如果我刷新,我得到的地址已經被使用錯誤。我嘗試了php.net上建議的解決方案,但無濟於事。在socket_close()之前試圖socket_shutdown()只給我沒有連接的警告,刷新後會給我一個永無止境的加載。

從我理解的原因套接字沒有立即關閉是因爲仍然有數據在緩衝區中。但正如你所看到的,我明確表示只聽1個連接。另外,我只從我的應用程序發送3個字符,並在此腳本中讀取3個字符。

我在做什麼錯?

編輯:我使用2個套接字的原因是因爲我不能在write()之後偵聽()它給我套接字已經連接錯誤。在write()之後跳過listen()並直接進入read()給我提供無效的參數錯誤。

+0

找到一個更簡單的方法來執行此操作。看看這篇博文。 http://www.christophh.net/2012/07/24/php-socket-programming/ – 2013-12-22 19:30:39

回答

2

我看到,在睡了幾個小時並重新分析我的代碼和文檔後,我設法修復了一切。你們是對的,1個插座確實夠用了,方法正確:

<?php 

$host = "127.0.0.1"; 
$portListen = 1234; 
$sSender = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); 

socket_connect($sSender, $host, $portListen) or die("Could not connect\n"); 

socket_write($sSender, "test", strlen ("test")) or die("Could not write output\n"); 

echo socket_read($sSender, 3, PHP_NORMAL_READ); 

socket_close($sSender); 
?> 

太簡單了!

1

爲什麼您需要創建2個讀寫插槽?它看起來像一個奇怪的設計。客戶端應用程序通常會打開與服務器的套接字連接,然後發送請求並在同一個套接字上讀取服務器的響應。 另外,創建監聽套接字(iow服務器)不會擴展任何防火牆或NAT網關。

回答yor評論:不需要聽。只需閱讀(如果您的服務器尚未回覆,可能會阻止操作)。

+0

我認爲這是正確的設計。我似乎無法使用第一個套接字socket_listen ...我得到:警告:socket_listen()[function.socket-listen]:無法偵聽套接字[0]:連接請求是在已連接的套接字上進行的。在第22行的C:\ wamp \ www \ sock.php中 – syaz 2009-04-07 22:26:09

1

連接關閉後,套接字進入延遲狀態,以便如果(在關閉期間)數據包丟失並重新傳輸,響應將是一個乾淨的確認而不是RST(復位),表示沒有這樣的套接字已打開。它是TCP規範的一部分,你不能讓它停止發生。

Listen(1)並不意味着只接受一個連接,這意味着維持一個連接等待應用程序的最多1個連接的隊列,它們是accept()。因此,只要您接受第一個套接字,套接字就可以聽取更多信息。

與其他人一樣,我想知道爲什麼奇怪的設計,但我認爲這是一個簡單的例子,提出你的問題,並不一定提出你的真實計劃。