首页 > 解决方案 > 在单独的函数中绑定套接字和 recvfrom

问题描述

我正在尝试从游戏中接收 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 来保留数据,但这似乎不起作用。

标签: phplaravelsockets

解决方案


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

此外,您现在正在尝试做的是一个套接字服务器(绑定一个套接字通常是为了服务器目的),并且套接字服务器需要不断地打开才能接收数据。我建议你尝试做一个 CLI 程序(仍然可以在 PHP 中完成)并使用socket_recvfromsocket_sendto方法来获取和发送数据(在完成绑定之后),然后将接收到的数据存储在数据库中或在一个文件中,然后让您的网站从中读取以将其发送到您的浏览器。这是一个说明如何在 PHP 中创建简单的 UDP 服务器的方法


推荐阅读