我正在研究一个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_create”再次重新创建$ socket,但这也没有帮助。
编辑: 我的意思是如果我将最后一块代码更改为以下
$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 :(得分:2)
您无法重新连接套接字。你必须创建一个新的。