【问题标题】:Bind socket, and recvfrom in separated functions在单独的函数中绑定套接字和 recvfrom
【发布时间】:2019-02-04 02:42:22
【问题描述】:

我正在尝试从游戏中接收 UDP 数据。并在页面上不断更新。使用 JSON 从函数中检索数据。

是否可以将 socket_create/socket_bind 与 socket_recvfrom 分开?

(我已经删掉了一些不必要的代码)

private $socket;

public function socketConnect($port)
{

    $ip = '0.0.0.0'; // local IP
    $port = 20777; // port to listen

    $this->socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    socket_bind($this->socket, $ip, $port) or die("Could not connect");

   return view('telemetry');
}

public function getData()
{
   while (socket_recvfrom($this->socket, $buf, $bytes, 0, $remote_ip, $remote_port)) {
      // do something
      return response()->json($data);
    }
}

我尝试设置 $this->socket 来保留数据,但这似乎不起作用。

【问题讨论】:

    标签: php laravel sockets


    【解决方案1】:

    你不能那样做,不。使用 socket_* 方法创建的套接字不是持久的,因为它们是低级套接字。在这里,您的两个函数在两个相互独立的不同页面调用中执行(这就是 PHP 的工作方式)。

    此外,您现在正在尝试做的是一个套接字服务器(绑定一个套接字通常是出于服务器目的),并且套接字服务器需要不断打开才能接收数据。我建议你尝试做一个 CLI 程序(仍然可以在 PHP 中完成)并使用 socket_recvfromsocket_sendto 方法来获取和发送你的数据(在你绑定之后),然后存储接收到的数据在数据库或文件中,然后让您的网站从中读取以将其发送到您的浏览器。 Here is a howto that shows how to create a simple UDP server in PHP.

    【讨论】:

    • 好的,谢谢!我的最终目标是让我网站上的人们能够将数据从他们的游戏发送到网站,并拥有一个包含该数据的实时页面。要知道哪个连接属于玩家游戏,我正在考虑为他们分配一个随机端口。现在:我将如何运行 CLI 程序,例如当用户单击网站上的“开始”按钮时?或者我应该有一个 24/7 运行的程序来检测“开始”,然后让它在循环中执行数据检索?
    • 您必须让程序 24/7 全天候运行,游戏在需要时向您的程序发送数据,您的程序将该数据保存到数据库中(例如),然后您的网站检索所述数据当人们刷新网页时从数据库中提取。
    猜你喜欢
    • 2021-11-05
    • 2015-05-23
    • 1970-01-01
    • 2013-05-22
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多