2013-04-26 129 views
0

我正在處理一個php套接字客戶端腳本。我希望腳本能夠處理服務器停機時間。PHP:重新連接客戶端套接字

我啓動連接如下

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 

function connect() 
{ 
    global $socket; 
    global $ip; 
    global $port; 
    $connected = FALSE; 
    while($connected === FALSE) 
    { 
     sleep(5); 
     $connected = socket_connect($socket, $ip, $port); 
    } 
} 

connect(); 

它試圖連接,直到服務器可用。

再往下看,我檢測到服務器不再響應,斷開套接字並嘗試重新連接到服務器。

$ret = socket_write($socket, $str, strlen($str)); 
if ($ret === false) 
{ 
    socket_shutdown($socket, 2); 
    socket_close($socket); 
    connect(); 
} 

不過,我從socket_connect出現以下錯誤:

A connect request was made on an already connected socket. 

在這一點上,即使服務器重新上線,爲我的腳本重新連接的唯一方式是通過殺死它,並開始它再次。是否有更多關閉客戶端套接字連接?我所能找到的大部分主題都涉及監聽傳入連接的套接字。

我試着再次使用「unset」重新創建$ socket,後面跟着「socket_create」,但那也沒有幫助。

編輯: 我的意思,如果我改變的代碼下面

$ret = socket_write($socket, $str, strlen($str)); 
if ($ret === false) 
{ 
    socket_shutdown($socket, 2); 
    socket_close($socket); 
    unset($socket); 
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    connect(); 
} 

最後一塊,然後我仍然得到同樣的錯誤。

任何幫助將不勝感激。

解決:原來這是一個真正的全局變量未設置的問題。這段代碼與socket_write是在一個單獨的功能。我在函數的開頭添加了「global $ socket」,但事實證明,我還需要在未設置之後添加它。另外,爲了取消設置全局,我應該使用unset($ GLOBALS ['socket']); 感謝EJP讓我重新審視這一點。

+0

你把「未定」放在哪裏? – PleaseStand 2013-04-26 22:28:29

+0

在socket_close後。然後我在connect()之前調用socket_create。 – 2013-04-26 22:38:07

回答

2

您無法重新連接套接字。你必須創建一個新的。

+0

我該如何去做呢?重新創建套接字仍然給我同樣的錯誤。即如果我調用「unset($ socket); $ socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);」在socket_close之後但connect()之前。 – 2013-04-26 23:43:13

+0

在全新的未連接套接字上收到錯誤消息並不合理。你確定新代碼被執行了嗎? – EJP 2013-04-27 10:42:43