5

いくつかのソケット関数を使用して、特定の IP とポートを使用してクライアントと通信するために使用されるソケット ハンドラ クラスがあります。関数を初めて使用するときはwritetosocket()、完全に機能しています。

しかし、クライアントを再起動するとき(IPとポートを使用)。そしてそれを使用しようとすると、エラーコード 32 で壊れたパイプエラーがwritetosocket()返されます。ただし、関数の実行が成功した後。ソケットにデータを書き込んでいるときに、しばらくするとこのエラーが発生することを意味します。私はいくつかの解決策を読み、クライアントが応答していないことがわかったときにソケット接続を適切に終了するために、使用している最も一般的な解決策を試しました。その後、再び startconnection を呼び出しています。これにより、新しいソケットが提供されます。しかし、それでも壊れたパイプエラーが発生します。socket_writesocket_shutdownsocket_close

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;
}

関数が壊れたパイプエラーを処理できるように、この問題を理解して解決するのを手伝ってください。

4

1 に答える 1

0

サーバーソケットが閉じられてリッスンしなくなり、クライアントソケットが閉じられた後、ポートが解放されて再び使用できるようになる前に、クライアントソケットがサーバーソケットにデータを送信しようとしているため、このエラーが発生しています( TIME_WAITにある間) )。

サーバー ソケットクライアント ソケットは、I/O で使用できるようになるまでに異なる手順を実行します。

サーバ

  1. ソケット()
  2. 練る()
  3. 聞く()
  4. 受け入れる()

クライアント

  1. ソケット()
  2. bind() [オプション、下記参照]
  3. connect() [まだバインドされていない場合、一時ポートで暗黙的にバインドします]
于 2013-07-21T07:20:28.047 に答える