Задать вопрос
@valeragan98

Почему сокет клиент зависает при разрыве соединения?

Здравствуйте. Имеется клиент сокет написанный на PHP, при обрыве соединения между клиентом и сервером (Например, если вытащить сетевой провод) зависает процесс ЧТЕНИЯ (socket_read) и не выводится ошибка о потери соединения.
Как отлавливать разрывы сети на стороне клиента в PHP и просто пропускать выполнения функции socket_read?
Код соединения:
public function connect($hostname, $socket_port) {
	    if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
	    	return false;
	    }
		
		$timeout = 3;	
		socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0)); //READ TIMEOUT
		socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => $timeout, 'usec' => 0)); //WRITE TIMEOUT
	
		socket_set_nonblock($socket);
		$time = time();
		while (!@socket_connect($socket, $hostname, $socket_port)) {
			$err = socket_last_error($socket);
			// success!
			if($err === 56) {
				//print('connected ok');
				break;
			}
			if ((time() - $time) >= $timeout) {
				socket_close($socket);
				//print('timeout reached!');
				return false;
			}
			usleep(250000);
		}
		socket_set_block($socket);

		$out = $this->read($socket);

	    if ($out == false) {
			return false;
	    }

	    return $socket;
	}

Код чтения:
public function read($link){
		socket_set_block($link);

		$out = "";		
		if($link){
   			while (true){
				$line = socket_read($link, 1024, PHP_NORMAL_READ);
				if($line === false) break;
				$out .= $line;			
				if (mb_stripos ($line, "\n") !== false or $line == "") break;

			}
 
		}
		return $out;
	}
  • Вопрос задан
  • 175 просмотров
Подписаться 1 Сложный Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Vitsliputsli
Как отлавливать разрывы сети на стороне клиента в PHP и просто пропускать выполнения функции socket_read?

Никак. Откуда ему знать, есть на другой стороне машина или нет?
Проверяйте что целевая машина отвечает по типу эхо-запросов и отключайте по таймауту.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы