0

この問題を抱えている他の人を見たことがありますが、私の状況を説明できるかもしれません。問題がどこにあるのかを指摘してください。

「警告: socket_bind(): アドレス [98] をバインドできません: アドレスは既に使用されています」というエラーが表示されます。

状況はこれです。Web アプリケーションを使用して、(Web ページ インターフェイスから) タスクを実行する別のプログラムをトリガーしています。そのプログラムの結果は、ソケットを介して、ソケットでリッスンしている Web アプリケーションに送信されます。

最初にソケットを作成して開き、次に他のプログラムをトリガーします。そのプログラムが終了すると、ソケットを介して結果を送信する必要があります。

最初の試行で問題なく動作します。次に、次の試行(このプロセスを何度もトリガーします)ソケットを開こうとすると、上記のソケットバインドエラーが発生します。明らかに、ソケットはまだバインドされています。

約 1 分待ってから、プロセスを正常に再実行できます。ソケット接続がタイムアウトしたと思います。

問題がソケットコードの構造にあるのか、トリガーしている外部プログラムに問題があるのか​​ わかりません。他の誰かが作成した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」などの行に問題がある場合、ソケットのクローズを処理するより効率的な方法はありますか?

4

1 に答える 1