2013-12-02 2 views
6

У меня проблема с командой php fsockopen.php fsockopen как узнать, жив ли соединение

Мне нужно открыть соединение сокета на сервере для реализации обмена сообщениями. Если сервер ничего не получает с моей (клиентской) стороны, он закрывает соединение после определенного таймаута (который я не знаю точно, я не могу изменить).

Вопрос в том, как я могу узнать, открыт ли сокет несколько минут назад, еще жив?

Это скрипт, который я использую, чтобы открыть соединение

$socket = fsockopen("automation.srv.st.com", 7777, $errno, $errstr); 
if ($socket === false) { 
    echo "Unable to open Socket. Error {$errno} : {$errstr}\n"; 
    die(); 
} 
$status = stream_get_meta_data($socket); 
print_r($status); 

и распечатать

Array 
(
    [stream_type] => tcp_socket/ssl 
    [mode] => r+ 
    [unread_bytes] => 0 
    [seekable] => 
    [timed_out] => 
    [blocked] => 1 
    [eof] => 
) 

затем каждого сообщения, написанного на сервер ...

fwrite($socket, $message); 

... Я получаю обратную связь в течение 200 мсек:

Но если мой сценарий тратит 30 минут без отправки каких-либо сообщений на сервер (потому что у него нет ничего для связи), то соединение автоматически закрывается сервером, и я не могу понять, как я могу проверить его до того, экземпляр нового соединения:

Если пробовали с

if ($socket) echo "The socket is still having a valid resource\n"; 

, но это ответит мой, что $ сокет все еще действующий ресурс

поток Я попытался с

$status = stream_get_meta_data($socket); 
print_r($status); 

Я хотел бы получить назад точно такой же вывод:

Array (
    [stream_type] => tcp_socket/ssl 
    [mode] => r+ 
    [unread_bytes] => 0 
    [seekable] => 
    [timed_out] => 
    [blocked] => 1 
    [eof] => 
) 

Я тогда попытался прочитать некоторые данные, прежде чем писать что-то, но он блокирует на fgets заявление:

$result = fgets($socket, 1024); //--- Blocking statement 
echo ">".$result."\n"; 

Итак, я почти застрял. Мой вопрос: как я могу узнать, открыт ли сокет с помощью команды fsockopen по прошествии определенного периода времени или нет? Какую команду мне нужно использовать или какой подход вы предлагаете мне реализовать?

Спасибо, кто-нибудь мне помог!

Ciao, Стефано

+0

Это будет сложно, так как TCP соединения могут остаться в живых в течение длительного времени, даже выживание перезагружается. Теперь можно сразу узнать, умерло ли соединение, если данные не отправляются. Существует TCP keepalive, но автоматическая проверка выполняется только каждый час или около того. В зависимости от системы вы можете получить это поведение по запросу, отправив данные длиной 0 байт. Эксперимент. – Brad

+0

Существует параметр optionnal для установки тайм-аута для fsockopen, возможно, он может помочь. Или возможно stream_set_timeout() – user2196728

ответ

2

Я не знаю, если это правильный подход, или если он может заинтересовать кого-то, но единственный способ я в конце нашел бы знать, если сокет еще жив или нет использует

feof($socket); 

или лучше ...

if (feof($socket) === true) echo "Socket close\n"; 

ни

get_resource_type($socket); 

или

stream_get_meta_data($socket); 

будет производить ожидаемое поведение.

В любом случае, спасибо всем!

Стефано

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