Предупреждение: stream_socket_client(), php_network_getaddresses getaddrinfo не удалось указать ни имя узла, ни имя сервера, ни неизвестно

Когда я подключен к Интернету, он работает отлично, но когда Интернет не подключен, я получаю сообщение об ошибке в следующих строках:

$socket_context = stream_context_create($options);

$this->smtp_conn = @stream_socket_client($host.":".$port, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $socket_context);

Я намеренно не подключен к интернету и хочу show alertView в приложении iOS для пользователя, когда пользователь не подключен к Интернету, что:

Вы не подключены к интернету

Вместо

Предупреждение: stream_socket_client(), php_network_getaddresses getaddrinfo не удалось указать ни имя узла, ни имя сервера, ни неизвестно

Так как я могу справиться с этой ошибкой?

// -------------- Code where I am setting NSStream in .m file :----------

#import "LoginViewController.h"

// --------------- here I set the delegate -------------
@interface LoginViewController () <NSStreamDelegate>

-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{

}

Любая помощь будет оценена.

2 ответа

Предполагая, что вы используете NSStream для подключения ваших сокетов. В вашем методе делегата

-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode

Вы будете уведомлены, если сокет имеет ошибку с:

case NSStreamEventErrorOccurred:

или же

case NSStreamEventEndEncountered:

В этом случае вы можете показать ошибку сети вашему пользователю. Однако если они потеряют подключение к Интернету, вы не узнаете, пока не попытаетесь отправить некоторые данные через сокет. Таким образом, чтобы обойти эту проблему, вы должны реализовать Reachability.

Проект Github

или вспомогательный класс Apple.

Apple Reachability

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

Надеюсь, я правильно понял.

Подождите... так что в вашем сценарии приложение для iPhone является "сервером сокетов", относительно которого PHP является "клиентом сокетов". Я правильно понял?

Предполагая, что так... Вы уже отключили сообщение об ошибке с помощью "@". Остается только то, что вы просто проверяете, является ли возвращаемое значение ложным, например,

$socket_context = stream_context_create($options);

$this->smtp_conn = @stream_socket_client($host.":".$port, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $socket_context);
if (false === $this->smtp_conn) {
    //Handle the error here
    echo 'You are not connected to internet';
}

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

Другие вопросы по тегам