首页 > 解决方案 > javascript(在网页上)和本地网络上的 mc 之间的 udp 套接字连接

问题描述

一定很简单,我怀疑我走错了兔子洞。

我在通过我们的国内路由器公开的 pi 服务页面(LAMP 服务器)上运行 apache http 服务器。我可以让 php 提供我想要的材料,并认为让 php(在服务器上)通过套接字与本地网络上的另一台机器(例如 192.168.1.73)进行通信会很容易

我可以通过服务器从网页获取数据到本地机器,但无法让服务器从本地机器接收消息。在 php 中调用 ''' socket_bind(...) ''' 给出错误“无法绑定地址 [99]:无法分配请求的地址”

不知道 99 是从哪里来的;安装并运行 ufw 以打开我正在使用的端口(不会认为这是必要或可取的,但无论如何都尝试过)

非常感谢任何帮助。磷

这是一个PHP问题。

在 java 中实现“每日报价”,在与我有问题的 php 相同的机器上运行客户端,并在本地网络上的另一台机器上运行报价服务器。这很好用。用这个 php 客户端替换 java 客户端:

    <?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 socket\n");
      // the bind fails
      $bc = socket_recvfrom($skt,$buf,256,0,$server_ip,$port);
      echo "Got $bc bytes back";
   ?>

如上所述失败并出现错误 [99]

标签: php

解决方案


用例是在本地网络内的机器上运行服务器 - 让我们将其称为 insideServer,并让来自托管在机器上的网页的请求,outsideServer,由运行在 insideServer 上的代码响应。为什么?InsideServer 的服务器是用 java 编写的,因为我喜欢它。在过去,正确的做法是让 java 作为 applet 在用户的机器上运行。现代方法是让 outsideServer 运行 Apache Tomcat。但是,我没有这样做的奢侈,那么如何转发请求?

解决方案是在 outsideServer 的相关目录中有一个 PHP 脚本,该脚本通过套接字连接到 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 "$in\n";
socket_close($skt);

我过去几天的研究(Arr !!!)表明没有人知道 socket_bind() 是如何工作的,事实证明你不需要它!如果有错误,请发表评论(或更好的答案),但我相信这个解决方案有效。


推荐阅读