[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Можно ли выполнить условие $var===false
Макс1
Сокет-сервер, использующий скрипт на PHP под Linux, разрывает соединение со стороны сервера, если для данных $input, полученных с клиента, выполняется условие $input===false Если соединение с клиента происходит через модем, при закрытии соединения на клиенте с помощью команды AT^SISC=0 сервер получает данные, равные значению false в PHP, и закрывает соединение со стороны сервера. Если соединение происходит с помощью клиента на C#, при закрытии соединения клиентом сервер не получает значения false, не закрывает соединение, если оно закрывается по условию $input===false, и пытается читать пустые строки с клиента. Для пустой строки $input это условие не выполняется. Соединение можно закрывать по другому условию, например, при получении другой определенной строки.
Вопрос не о сетях, а о том, можно ли, чтобы не менять условие закрытия соединения на сервере, отправив определенные байты с клиента, получить на сервере значение, соответствующее условию $input===false? В чем отличие значения false на PHP от пустой строки, и можно ли получить true, сравнивая false с данными другого типа, например, строкой или байтом, с помощью оператора === Он проверяет тождество типов, но каким-то образом при получении данных с клиента, который использует модем, условие сравнения выполняется. Клиент на C# отправляет данные в виде массива байт.
Rand
Макс1
Точного ответа не дам, но поток байт не может быть просто так преобразован во внутренние типы PHP, для этого существуют механизмы сериализации. Предполагаю, что $input становится false только в случае ошибки соединения. В первом случае это происходит, во втором по какой-то причине нет (например C# закрывает соединение не корректно, и сокет не закрывается до тех пор пока не сработает таймаут, а что там с таймутами при отсутсвии пакетов надо смотреть на сервере).
Макс1
Rand, оказалось так, как Вы ответили. Значение false на сервере возвращает функция socket_read, когда модем на клиенте закрывает соединение. По этому условию закрывается соединение на сервере. Сначала неправильно понял, что отправляются данные с клиента, которые сервер воспринимает как значение false типа boolean. При закрытии соединения через сетевую карту клиентом на C# функция socket_read не возвращает значение false и продолжает пытаться читать пустые строки с клиента, так как сервер не закрывает соединение по этому условию. С функцией socket_recv такая же ситуация.
Вопрос в том, как корректно отслеживать закрытие соединения с клиента на C#.
Макс1
Нашел информацию, что вместо:
if($input === false) socket_shutdown($client);
рекомендуют выполнять проверку:
if(($input === false) || ($input === '')) socket_shutdown($client);
Сообщается, что вызов функции $input = socket_read($client, $length); при закрытии соединения на клиенте может возвращать как false, так и пустую строку. У меня это зависит от клиента. Пока соединение на клиенте открыто, в логах сервера не нашел пустых строк, полученных с клиента. Поэтому соединение чаще, чем надо, закрываться на сервере не должно. Сделаю проверку на false и пустую строку и протестирую.
arbuzmaster
Цитата
Вопрос в том, как корректно отслеживать закрытие соединения с клиента на C#.
На сколько я понял, то отследить отключение клиента от websocket сервера при помощи стандартных функций php не получится. Я делал отключение при помощи ping/pong, правда у меня клиент на C++. По сути ситуация была такая: при разрыве соединения с клиентом, сервер не мог понять отключен он или нет и закрывал сокет после таймаута с предупреждениями(сам сервер не падал, но тормозил жутко).

_____________
Мой первый сайтик

Посмотри на свой XBMC под другим углом
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.