соединение сокета udp между javascript (на веб-странице) и mc в локальной сети

#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-socket

2. изменение строки на 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 означает, что вся сложность не нужна.