Получение адреса, который уже используется, когда я пытаюсь привязать сокет к localhost в php - PullRequest
0 голосов
/ 11 апреля 2011

Я пытаюсь создать сокет-соединение из сценария php с локальным сервером (Qt, QLocalServer), но у меня возникают проблемы при создании соединения на стороне php.

<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');


set_time_limit(0);
ob_implicit_flush();

echo 'usr='. get_current_user().'<br/>';

$address = 'localhost';
$port = 4444; //Different port numbers produce same result

if (($sock = socket_create(AF_UNIX, SOCK_STREAM, 0)) === false) 
{
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
    exit();
}

 if (socket_bind($sock, $address, $port) === false) 
{
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
    exit();
}

...

Этов результате

usr = root Предупреждение: socket_bind (): невозможно связать адрес [98]: сбой адреса, уже используемого в /var/www/nbr/socket.php в строке 28 socket_bind (): reason: Адрес уже используется

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

$addr = ""; $pt = "";    
echo "Socket name ok: " . socket_getsockname($sock, &$addr, &$pt) . '<br/>';
echo $addr .    ", " . $pt . '<br/>';

, то результат будет

Socketимя ок: 1

0.0.0.0, 0

Так что адрес / порт просто никогда не устанавливаются должным образом?Кроме того, последующее socket_get_option($sock, 0, SO_REUSEADDR) завершается с ошибкой AF_UNIX, выполняется с AF_INET, но я все еще получаю ошибку недоступного адреса.

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 11 апреля 2011

socket_bind используется для привязки сокета на локальной машине.Привязка к сокету означает, что резервирует адрес / порт для сокета.Вы обычно используете его для слушателя (сервера), а не для клиента.В вашем случае, поскольку сервер (Qt) уже запущен, то адрес уже используется, поэтому socket_bind не удастся.

Если вы хотите подключиться к сокету ,используйте socket_connect:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!socket_connect($socket, 'localhost', 4444)) {
    die('failed');
}

Если вы хотите подключиться к локальному сокету (т.е. через файл сокета, а не через TCP / UDP):

$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
if (!socket_connect($socket, '/var/run/mysqld/mysqld.sock')) {
    die('failed');
}
0 голосов
/ 09 апреля 2019

Первый открытый порт использования:

<?PHP
$port= 4444;
$cmd = explode("*", str_replace(array("/"), "*",
    str_replace(" ","",shell_exec("netstat -tulpn | grep :".$port))));
if (count($cmd)>1) {  //if found use port
    shell_exec("kill -9 " . $cmd[1]);
}
.
.
.
.code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...