3 / 3 / 2
Регистрация: 27.06.2013
Сообщений: 94
|
|
1 | |
Можно ли выполнить условие $var===false, если переменная $var другого типа (не boolean)?10.10.2018, 09:13. Показов 925. Ответов 7
Метки нет (Все метки)
Сокет-сервер, использующий скрипт на PHP под Linux, разрывает соединение со стороны сервера, если для данных $input, полученных с клиента, выполняется условие $input===false Если соединение с клиента происходит через модем, при закрытии соединения на клиенте с помощью команды AT^SISC=0 сервер получает данные, равные значению false в PHP, и закрывает соединение со стороны сервера. Если соединение происходит с помощью клиента на C#, при закрытии соединения клиентом сервер не получает значения false, не закрывает соединение, если оно закрывается по условию $input===false, и пытается читать пустые строки с клиента. Для пустой строки $input это условие не выполняется. Соединение можно закрывать по другому условию, например, при получении другой определенной строки.
Вопрос не о сетях, а о том, можно ли, чтобы не менять условие закрытия соединения на сервере, отправив определенные байты с клиента, получить на сервере значение, соответствующее условию $input===false? В чем отличие значения false на PHP от пустой строки, и можно ли получить true, сравнивая false с данными другого типа, например, строкой или байтом, с помощью оператора === Он проверяет тождество типов, но каким-то образом при получении данных с клиента, который использует модем, условие сравнения выполняется. Клиент на C# отправляет данные в виде массива байт.
0
|
10.10.2018, 09:13 | |
Ответы с готовыми решениями:
7
Как сцепить строки? Например <? $var='Ура!'; $var=$var+' Еще раз...'; echo $var; ?> Скрипты перестали различать $_POST['var'], $_SESSION['var'] и просто $var Что значит в списке переменных, то есть var, выражение типа <переменная>: 0.1; ? Как можно обратиться к var из другого метода? |
12505 / 8689 / 1310
Регистрация: 21.01.2016
Сообщений: 32,649
|
|
10.10.2018, 09:16 | 2 |
Max_t, вы код людям покажите. А это всё - надписи на заборе.
0
|
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
|
|
10.10.2018, 10:44 | 3 |
Мало что понял из текста, но.
=== - это строгое сравнение. $input должен быть типом bool, иначе всегда будет false. == - не строгое сравнение. Пустая строка, ноль приравняются к false, иначе будет true.
0
|
12505 / 8689 / 1310
Регистрация: 21.01.2016
Сообщений: 32,649
|
|
10.10.2018, 11:11 | 4 |
У ТС-а некий сервер на сокетах, который как-то через задницу написан и работает соответсвенно. Сначала он упорно грешил на клиента написанного на C#, но потом сам убедился, что сервер гонит даже, когда нет подключений.
Но код сервера он упорно показывать не хочет. Всё ждёт, что ему подскажут, что всё можно решить через волшебное свойство sdelatZashibis = true и ничего переписывать не придётся.
3
|
3 / 3 / 2
Регистрация: 27.06.2013
Сообщений: 94
|
|
11.10.2018, 00:40 [ТС] | 5 |
Значение false на сервере возвращает функция PHP socket_read, когда модем на клиенте закрывает соединение. По этому условию закрывается соединение на сервере. Сначала неправильно понял, что отправляются данные с клиента, которые сервер воспринимает как значение false типа boolean. Не думаю, что такое возможно. При закрытии соединения через сетевую карту клиентом на C# функция socket_read не возвращает значение false и продолжает пытаться читать пустые строки с клиента, так как сервер не закрывает соединение по условию:
if($input === false) socket_shutdown($client); Вопрос в том, как корректно отслеживать закрытие соединения с клиента на C#. Буду разбираться или задам вопрос в другом разделе. Usaga, Ваши фантазии, как у меня написан сервер, лучше оставьте при себе. Проблема в связке конкретной функции PHP на сервере и клиента на C#.
0
|
12505 / 8689 / 1310
Регистрация: 21.01.2016
Сообщений: 32,649
|
|
11.10.2018, 04:34 | 6 |
Кто клиент - роли не играет от слова совсем. Сетевой стёк у всех один.
Нет. Проблема в говнокоде на сервере. Корректный код будет корректно отрабатывать любые ситуации, включая внештатные. А ваш не может нормально отработать даже совершенно нормальную ситуацию - закрытие соединения. Мои "фантазии" верны, ибо ваш сервер работает некорректно. Пока вы не покажете код сервера и не преслушаетесь к рекомендациям по его исправлению (а не минусы раздавать советующим), у вас ничего не изменится. Без этого, ваше описание проблемы - слова на заборе и не более.
0
|
3 / 3 / 2
Регистрация: 27.06.2013
Сообщений: 94
|
|
11.10.2018, 08:30 [ТС] | 7 |
Нашел информацию, что вместо:
if($input === false) socket_shutdown($client); рекомендуют выполнять проверку: if(($input === false) || ($input === '')) socket_shutdown($client); Сообщается, что вызов функции $input = socket_read($client, $length); при закрытии соединения на клиенте может возвращать как false, так и пустую строку. Пока соединение на клиенте открыто, в логах сервера не нашел пустых строк, полученных с клиента. Поэтому соединение чаще, чем надо, закрываться на сервере не должно. Сделаю проверку на false и пустую строку и протестирую. Usaga, на сервере некорректно работал вызов одной функции. И да, ее работа зависит от клиента. Думаю, что разобрался в этом вопросе. Если не разобрался, уточню. Предполагаю, что Вам научиться нормальному общению на форуме будет сложнее.
0
|
12505 / 8689 / 1310
Регистрация: 21.01.2016
Сообщений: 32,649
|
|
11.10.2018, 09:25 | 8 |
Нет, не зависит. Никак. Взаимодействие сервера и клиента идёт через сетевой стёк и протокол TCP. Никаких особенностей технологии сервера или клиента через этот протокол не просачивается.
Я хорошо и вежливо общаюсь. Просто некоторые собеседники имеют свойство к невосприятию советов и нежелание выкладывать код. Если бы вы СРАЗУ выложили код клиента и сервера, то сразу бы получили комментарии и рекомендации по исправлению. А так пришлось вам несколько раз одно и тоже объяснять, плюс код сервера мы так и не увидели.
0
|
11.10.2018, 09:25 | |
11.10.2018, 09:25 | |
Помогаю со студенческими работами здесь
8
/var/lock и /var/run, как будто нет таких директорий Почему Мандрива не захотела копировать диск в /var/ftp и /var? [?] Вопрос по адресации. В каком случае [var] =var= True, если не меняется, False, если меняется boolean переменная (Unity) Global $var или $GLOBALS['var'] В чем разница между $var и $$var? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |