この問題を抱えている他の人を見たことがありますが、私の状況を説明できるかもしれません。問題がどこにあるのかを指摘してください。
「警告: 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」などの行に問題がある場合、ソケットのクローズを処理するより効率的な方法はありますか?