PHP: сокеты TCP, «невозможно связать адрес»

Я видел других людей с этой проблемой, но, возможно, я могу объяснить свою ситуацию, и вы можете указать, где проблема может быть.

Я получаю сообщение «Предупреждение: socket_bind (): невозможно связать адрес» [98]: Адрес уже используется ».

ситуация такая. Я использую веб-приложение для запуска другой программы для выполнения задач (из интерфейса веб-страницы). Результаты этой программы отправляются через сокет в мое веб-приложение, которое прослушивает сокет.

сначала я создаю и открываю сокет, затем запускаю другую программу, затем, когда эта программа завершится, она должна отправить свои результаты обратно через сокет.

все работает отлично с первой попытки. Затем при следующей попытке (я запускаю этот процесс много раз) я получаю вышеуказанную ошибку привязки сокета при попытке открыть сокет, очевидно, сокет все еще связан.

я жду около минуты и могу снова успешно запустить процесс. Я думаю, что время ожидания подключения сокета.

Я не знаю, если проблема в том, как я структурировал свой код сокета, или проблема во внешней программе, которую я запускаю. Я не знаю много о внутренностях внешней программы, поскольку это файл 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

Решение

Вы пытались установить флаг SO_REUSEADDR на вашем сокете?
Там есть образец в socket_set_option«s документация.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]