【问题标题】:PHP: Socket server interrupted by socket_recv()PHP:套接字服务器被 socket_recv() 中断
【发布时间】:2017-06-22 14:43:53
【问题描述】:

我正在编写 PHP 套接字服务器,这里显示的是导致错误的部分。我发现 socket_recv() 引起了问题,它只让一台计算机连接。但是,如果我注释掉 socket_recv 那么它工作正常。但我也必须在套接字服务器中接收数据。帮我找出解决办法。还请指出任何代码错误。 JQuery 部分工作正常,因此这里没有打印出来。

<?php
    set_time_limit(0);

    $host = '172.28.4.5';
    $port = 10000;
    $null = NULL;

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
    socket_bind($socket, $host, $port);
    socket_listen($socket);
    $clients = array($socket);

    while(true) {

       $new_socket = socket_accept($socket);//Accepting new connection/socket/client if any
       $clients[] = $new_socket;//Adding the new client/socket/connection to client array

       $header = socket_read($new_socket, 1024);
       perform_handshaking($header, $new_socket, $host, $port);

       /* If I want to notify if new connection is established**/
      socket_getpeername($new_socket, $ip);
      $message = "Welcome to WebSocket $ip";

      $array = array(
              'message' => $message
              );
      $message = mask(json_encode($array));     
      write_to_socket($message);

      $found = array_search($socket, $clients);
      unset($clients["$found"]); 

      //Going through each client
      foreach($clients as $client) {

             //Getting messages with loop how many packages for each client has
             while(socket_recv($client, $buf, 1024, 0) >= 1) {

                      $array = json_decode(unmask($buf));
                      print_r($array);
              }
       }
   }
 }
?>

【问题讨论】:

  • 你能提供更多信息吗?怎么了?
  • 我只能连接一台电脑。如果我不使用 socket_recv() 它工作正常。

标签: php jquery sockets


【解决方案1】:

看来 代码错误

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
    socket_bind($socket, $host, $port);
    socket_listen($socket);
    //$clients = array($socket);   <---- here

    while(true) {

好像你把监听的socket添加到array了,你不应该从监听的socket接收和数据。

【讨论】:

  • 一切正常,除了 socket_recv 部分。
  • 因为收到了监听的socket,所以报错了。
  • 照你说的做了,还是一样的问题。
  • 你可以自己试试吗?
猜你喜欢
  • 2012-07-02
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2014-03-10
  • 2016-06-05
  • 1970-01-01
相关资源
最近更新 更多