繁体   English   中英

接受新连接时,PHP TCP套接字服务器挂起

[英]PHP TCP socket server hangs when accepting a new connection

我正在尝试设置一个TCP套接字服务器,该服务器应同时支持许多客户端连接以及接收和发送数据。

为此,我正在尝试使用PHP的socket_select(); 由于服务器始终挂在socket_read(); 过程中,无论是否存在数据,都应在哪里继续。 我试图在下面的代码中运行,但是它始终挂在新的客户端连接上。

// TCP socket created
$clients = array($socket);
while (true) { // Infinite loop for server
   $newsock = socket_accept($socket);
   if ($newsock !== false) {
      // Adds a new client
      $clients[] = $newsock;
   }
   $read = $clients;
   $write = NULL;
   $except = NULL;
   $num_changed_sockets = socket_select($read, $write, $except, 0);
   if ($num_changed_sockets === false) {
      // Error here
   } else if ($num_changed_sockets > 0) {
      // Something happened
      if (in_array($socket, $read)) {
         $key = array_search($socket, $read);
         unset($read($key]);
      }
      foreach ($read as $read_socket) {
         $data = socket_read($read_socket, 128); // This should not hang!
         if ($data === false) {
            // Disconnect client
         }
         // Reads data, sends answer...
      }
   }
   // Something to send for all clients
}

是否也可以使用socket_select(); 没有在数组中包含我的客户的副本,其中包含侦听器? 只是为客户准备了一个干净的阵列。

默认情况下,套接字是阻塞的 ,您也应该将被动侦听套接字(在您的情况下$socket )放入传递给socket_select的读取集中,当您可以接受新连接时,它将可读。

只需将监听套接字$socket设置为非阻塞模式即可。 客户端已建立连接并且正在读取数据,但是客户端断开连接无法实时处理(延迟很大)。 有什么理由吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM