Подключиться как клиент к удаленному серверу сокетов

Мне нужно создать простой служебный сокет PHP для подключения в качестве клиента к удаленному серверу сокетов, а затем сократить его. Проблема в том, что мне нужно подключиться к URL-адресу хоста, а не к IP-адресу хоста.

Я пробовал использовать метод socket_create(), но он подключается только по IP. Другой метод, который я пробовал, был stream_socket_server(), который разрешал URL-соединения, но я не могу продолжать прослушивание для получения ответов.

echo "Socket started...\n";

$server = 'ssl://sockserver.com/moreurl/params?56298';
$host = "sockserver.com";
$port = 80;
set_time_limit(0);

$socket = socket_create(AF_INET, SOCK_STREAM, 0);
$result = socket_connect($socket, $server, $port);
socket_bind($socket, $host);
socket_listen($socket);

while (true) {
  $result = socket_read ($socket, 1024);
  if($result){
    echo "Reply From Server  :".$result;
  }
}

socket_close($socket);

Итак, мне нужно продолжать слушать Socket удаленного сервера в качестве PHP-клиента, используя URL-адрес, например host.


person Alisson Pelizaro    schedule 21.08.2019    source источник
comment
Мне не хватает socket_bind и socket_listen в вашем коде... вы не сможете установить соединение, не привязав свой сокет к реальному IP-адресу...   -  person Lars Stegelitz    schedule 21.08.2019
comment
@LarsStegelitz, спасибо за ваш ответ, я изменил свой код здесь с помощью этих методов и был удивлен ошибкой: socket_read(): невозможно прочитать из сокета [107]: конечная точка транспорта не подключена. Эта структура правильная?   -  person Alisson Pelizaro    schedule 21.08.2019


Ответы (2)


На самом деле вам нужно ознакомиться с программированием сокетов... например, ваш $address является URL-адресом, но сокет не понимает URL-адреса. Вам нужно будет использовать IP-адрес (для AF_INET) или путь сокета Unix (для AF_UNIX).

Я предоставлю вам 2 сценария, очень простой сокет-сервер + сокет-клиент... не стесняйтесь делать с ним все, что хотите.

Сервер:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($socket, '0.0.0.0', 9999);
if (socket_listen($socket)) {
    $nsocket = socket_accept($socket);

    $exit = false;
    while(!$exit && $s = socket_read($nsocket, 100)) {
        $s = trim($s);

        if ($s == 'quit') {
            $exit = true;
            $a = 'Bye';
        }
        else {
            echo 'Received "'.$s.'" from '.$nsocket . PHP_EOL;
            $a = 'You wrote "'.$s.'"';
        }

        socket_write($nsocket, $a."\n");
    }
    socket_write($nsocket, "Bye\n");
    socket_close($nsocket); 
}

Клиент:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($socket, '127.0.0.1', 9999);
echo '> ';
while( ($data = fgets(STDIN)) && trim($data) != 'quit') {

    if (strlen($data))
        socket_write($socket, $data);
    $answer = '';
    while($ret = socket_read($socket, 1)) { 
        $answer .= $ret;
        if ($ret == "\n") break;
    }
    echo '< '.$answer;
    echo '> ';
}
person Lars Stegelitz    schedule 21.08.2019
comment
Еще раз спасибо. Мой английский не так хорош, поэтому, возможно, я не могу очень хорошо объяснить свою проблему. Моя проблема именно в этом: мне нужно создать клиента, используя сервер URL-сокетов, а не используя IP, потому что мне нужно передать некоторые параметры. Как вы думаете, это возможно? - person Alisson Pelizaro; 21.08.2019
comment
Не существует такой вещи, как сервер сокетов URL. Сокеты находятся на уровне 4 OSI (транспорт), а шифрование (ssl), dns или http — на уровне 6 (представление). Стек протоколов работает только от более высоких уровней к более низким. Уровень 4 не понимает URL, потому что эта концепция представлена ​​на более высоком уровне. TCP или UDP работают с IP-адресами (поскольку IP определяется на сетевом уровне 3) - person Lars Stegelitz; 21.08.2019
comment
Правильно, для меня это имеет смысл... Поэтому я попытаюсь подключиться только с IP и отправить параметры по заголовку при рукопожатии. Большое спасибо за помощь!! - person Alisson Pelizaro; 21.08.2019

O решил мою проблему, используя библиотеку ratchetphp/Pawl на Github. Эта библиотека позволяет подключаться в качестве клиента в WSS.

person Alisson Pelizaro    schedule 26.08.2019