2013-04-26 2 views
0

Я работаю над скриптом клиента php socket. Я хочу, чтобы скрипт мог обрабатывать время простоя сервера.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. 

На данный момент, даже если сервер возвращается в Интернете, единственный путь мой сценарий, чтобы восстановить это убить его и начать это снова. Есть ли еще способ закрыть соединение с клиентским сокетом? Большая часть того, что я смог найти по этой теме, касается сокетов, которые прослушивают входящее соединение.

Я попытался воссоздать $ socket снова, используя «unset», за которым следует «socket_create», но это тоже не помогло.

EDIT: Что я имею в виду, если я изменю, что последний кусок кода на следующий

$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(); 
} 

тогда я все еще получаю ту же ошибку.

Любая помощь была бы принята с благодарностью.

SOLVED: Оказывается, это действительно проблема с глобальной переменной. Этот кусок кода с socket_write был в отдельной функции. Я добавил «global $ socket» в начале функции, но, оказывается, мне также необходимо добавить его после сбоя. Кроме того, чтобы отключить глобальный, я должен использовать unset ($ GLOBALS ['socket']); Благодаря EJP, заставив меня пересмотреть это.

+0

Где вы положили "unset"? – PleaseStand

+0

После socket_close. Затем я вызвал socket_create перед connect(). –

ответ

2

Вы не можете повторно соединить разъем. Вы должны создать новый.

+0

Как мне это сделать? Воспроизведение сокета по-прежнему дает мне ту же ошибку. то есть, если я вызываю «unset ($ socket); $ socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); после socket_close, но до connect(). –

+0

Неверно, что вы получили это сообщение об ошибке в совершенно новом не подключенном сокете. Вы уверены, что новый код был выполнен? – EJP

Смежные вопросы