如何在php中处理套接字断管[错误32]?

时间:2013-07-16 13:40:37

标签: php sockets

我有套接字处理程序类,它用于在几个套接字函数的帮助下通过特定的ip和端口与客户端通信。在我第一次使用writetosocket()函数时,它的工作正常。

但是当我重新启动客户端(使用ip和port)时。并尝试使用writetosocket()它返回损坏的管道错误,错误代码为32 。但在成功执行socket_write函数之后。意味着我在一段时间后得到这个错误,当我在socket上写数据时。我读了一些解决方案并尝试了最常见的解决方案,我使用socket_shutdownsocket_close来正确地终止套接字连接,只要我发现客户端没有响应。之后我再次调用startconnection,这给了我新的socket。但是我的管道错误仍然存​​在。

function startconnection(){
     /* Create a socket in the AF_INET family, using SOCK_STREAM for TCP connection */
     $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
     if ($this->socket === false) {
            $errorcode = socket_last_error();
            $errormsg = socket_strerror($errorcode);
            echo "$errorcode : $errormsg";
            return false;
     }
     else {
            echo "Socket successfully created.";
     }

     /* Accept incoming connections */
     $this->result = socket_connect($this->socket, $this->ipaddress, $this->port);
     if($this->result === false){
            $errorcode = socket_last_error();
            $errormsg = socket_strerror($errorcode);
            echo "$errorcode : $errormsg";
            return false;
     }
     else {
            echo "successfully connected to $this->ipaddress, $this->port";
     }
     return true;
}


function writetosocket($input){
      $sent = socket_write($this->socket, $input, strlen($input));
      if($sent === false) {
            $errorcode = socket_last_error();
            $errormsg = socket_strerror($errorcode);
            echo "$errorcode : $errormsg";
            return false;
      }
      else {
            echo "Message Sent : $input";
      }
      return true;
}

帮助我理解并解决此问题,以便该函数可以处理损坏的管道错误。

1 个答案:

答案 0 :(得分:0)

您收到该错误是因为服务器套接字已关闭且不再侦听且客户端套接字正在尝试将数据发送到服务器套接字< / strong>关闭后但在端口可以再次使用之前(当它在 TIME_WAIT 时)。

服务器套接字客户端套接字在可用于I / O之前都会执行不同的步骤:

SERVER

  1. 插座()
  2. bind()的
  3. 听()
  4. 接受()
  5. 客户端

    1. 插座()
    2. bind()[可选,见下文]
    3. connect()[对临时端口进行隐式绑定,如果尚未绑定]