2013-04-26 81 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