2015-09-28 103 views
0

我见过这个问题的其他人,但也许我可以解释我的情况,你可以指出问题可能出在哪里。PHP:TCP套接字,'无法绑定地址'

我得到一个'警告:socket_bind():无法绑定地址[98]:地址已被使用'错误。

情况就是这样。我正在使用Web应用程序来触发另一个程序执行任务(从网页界面)。该程序的结果通过套接字发送到正在套接字上侦听的我的Web应用程序。

首先我创建并打开套接字,然后我触发另一个程序,然后当程序结束时它应该通过套接字发回它的结果。

它工作正常的第一次尝试。然后下一次尝试(我多次触发此过程)当我尝试打开套接字时,出现上述套接字绑定错误,显然套接字仍然绑定。

我等了大约一分钟,我可以再次成功运行该过程。我认为套接字连接超时。

我不知道问题是因为我的结构我的套接字代码的方式,或者如果问题是在我触发的外部程序。我不太了解外部程序的内部,因为它是由其他人创建的jar文件。

继承人我用于创建和处理套接字的代码。我刚刚在php.net上使用了一个例子,并根据我的需要对其进行了修改。

$port1 = 15000;   


    // configure the socket 
    error_reporting(E_ALL); 
    set_time_limit(0); 
    ob_implicit_flush();    
    $address = '127.0.0.1'; 
    $port2 = 54321; 
    $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    $error = 'none'; 

    if ($sock) { 

     if (socket_bind($sock, $address, $port2)) { 

      if (socket_listen($sock, 5)) { 

       // trigger external process 
       if (start_calibration()) {       

        $buf = array(); 

        // listen to the socket for incoming messages 
        do { 
         // if incomming connection is not accepted break out and close socket 
         if (($msgsock = socket_accept($sock)) === false) { 
          break; 
         } 

         do { 
          // if cant read socket then break out and close socket 
          if (false === ($buf = socket_read($msgsock, 2048, PHP_BINARY_READ))) { 
           break 2; 
          } 

          $buf = unpack('C*', $buf); 

          socket_close($msgsock); 
          break 2; 
         } while (true); 
         socket_close($msgsock); 
        } while (true); 

        socket_close($sock); 

        // code to handle data recieved through the socket 

       }  
       else { 
        // start_calibration failed 
        $error = 'start_calibration failed'; 
        socket_close($sock); 
       }       
      } 
      else { 
       // socket_listen failed 
       $error = 'socket_listen failed'; 
       socket_close($sock); 
      }      
     } 
     else { 
      // socket_bind failed 
      $error = 'socket_bind failed'; 
      socket_close($sock); 
     }     
    } 
    else { 
     // socket_create failed 
     $error = 'socket_create failed'; 
    } 

    $data['error'] = $error; 
    echo json_encode($data); 

此外,有没有是处理插座的关闭,如果有是一个像“socket_bind”,“socket_listen”等线路问题的一种更有效的方式?

+0

这是一个CLI脚本吗?如果是这样,运行一次,然后它是一个侦听端口的小型服务器。如果您的操作系统内核支持同时在同一个端口上侦听多个进程,您可以尝试重用地址。但是,整个架构的结构似乎有些不同。 –

回答

2

您是否尝试在您的套接字上设置标记SO_REUSEADDR? 在socket_set_optiondocumentation中有一个样本。

相关问题