#php
#php
Вопрос:
Это должно быть просто, и я подозреваю, что я исчез не в той кроличьей норе.
У меня есть http-сервер apache, работающий на pi, обслуживающий страницы (сервер LAMP), открытый через наш внутренний маршрутизатор. Я могу заставить php подавать материал, который я хочу, и подумал, что было бы легко заставить php (на сервере) общаться через сокеты с другим компьютером в локальной сети (например, 192.168.1.73)
Я могу получать данные с веб-страницы через сервер на локальный компьютер, но не могу заставить сервер получать сообщения с локального компьютера. В php вызов «‘ socket_bind (…) «‘ выдает ошибку «невозможно привязать адрес [99]: невозможно назначить запрошенный адрес»
Не знаю, откуда берется 99; установил и запустил ufw, чтобы открыть порт, который я использую (не подумал бы, что это необходимо или желательно, но все равно попробовал)
Любая помощь с благодарностью. P
Это проблема PHP.
Реализована «цитата дня» на Java, запуск клиента на той же машине, что и мой проблемный php, и сервер котировок на другой машине в локальной сети. Это работает нормально. замените java-клиент этим php-клиентом:
<?php
$server_ip = '192.168.1.78';
$port = 41235;
$message = 'hello world.';
$buf = [];
$skt = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die(..);
socket_sendto($skt,$message,strlen($message),0,$server_ip,$port);
// message is successfully sent and received at other end...
socket_bind($skt,$server_ip,$port)
or die("Could not bind socketn");
// the bind fails
$bc = socket_recvfrom($skt,$buf,256,0,$server_ip,$port);
echo "Got $bc bytes back";
?>
Сбой, как указано выше, с ошибкой [99]
Комментарии:
1. можете ли вы подключиться через netcat к серверу «quote of the day»? Поместите ваш
socket_recvfrom
код в цикл while: riptutorial.com/php/example/23035/udp-server-socket2. изменение строки на
socket_bind($skt,"0.0.0.0",$port)
изменяет ошибку на [22] — другое сообщение об ошибке! «Недопустимый аргумент в строке 7». Я думаю , что этот метод выполняет вызов по ссылке, чтобы изменить $port так, чтобы recvfrom прослушивал правильный порт для возвращаемого сообщения? По какой-то причине то же самое с ip? создание переменной со значением 0.0.0.0 НЕ изменяет ошибку.3. Глядя на netcat — проблема в том, что я не понимаю поведение или php и не вижу, как netcat поможет, но… И да, без цикла я также получаю только первые несколько байтов возвращаемого сообщения в java — оставил это для ясности.
Ответ №1:
Вариант использования заключается в запуске сервера на компьютере внутри локальной сети — давайте назовем его insideServer, и на запросы с веб-страницы, размещенной на компьютере Outside Server, отвечает код, запущенный на insideServer. Почему? Сервер InsideServer написан на Java, потому что мне это нравится. В старые времена правильным способом сделать это было запустить java на компьютере пользователя в виде апплета; современный способ — заставить внешний сервер запускать Apache Tomcat. Однако я не могу позволить себе роскошь делать это, так как же пересылать запросы?
Решение состоит в том, чтобы иметь PHP-скрипт в соответствующем каталоге outsideServer, который подключается через сокеты к insideServer, где код insideServer может быть любым, каким вы хотите. Однако PHP был проблематичным. Однако этот код работает:
$insideServerIP = '192.168.1.78';
$insideServerPort = 41234;
$message = 'pretend message from web page form';
$skt = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("create failed: " . socket_last_error());
socket_connect($skt, $insideServerIP, $insideServerPort) or die("connect failed: " . socket_last_error());
socket_write($skt, $message, strlen($message));
$in = socket_read($skt, 256, PHP_BINARY_READ);
echo "$inn";
socket_close($skt);
Мои исследования за последние несколько дней (Arr !!!) предполагается, что никто не знает, как должен работать socket_bind() , и оказывается, что вам это не нужно!
Пожалуйста, оставьте комментарии (или лучший ответ), если есть ошибки, но я считаю, что это решение работает.
P
Комментарии:
1. Как насчет веб-сокетов? Вопрос, который я задал себе позже. Еще один день, и я прихожу к выводу, что этот пост правильный: lucumr.pocoo.org/2012/9/24/websockets-101 Таким образом, https everywhere означает, что вся сложность не нужна.