PHP как подключиться к сокетам и прочитать ответ?


Название объясняет все это...

Как я могу подключиться к IP с помощью протокола tcp и прочитать/получить ответ? Я много искал, но не нашел никакого решения.

$socket = stream_socket_server("tcp://127.0.0.1:22", $errno, $errstr);
if (!$socket) {
  echo "$errstr ($errno)<br />\n";
} else {
  while ($conn = stream_socket_accept($socket)) {
echo fread($conn, 26);
    fclose($conn);
  }
  fclose($socket);
}

Этот код подходит? Выполняет свою работу? Потому что кажется, что это не делает работу...

Заранее благодарю

Author: user2493164, 2013-08-28

2 answers

Как предлагали другие; избегайте использования порта 22. Я рекомендую использовать неясный (неиспользуемый) номер порта сокета > 1024, например 4444. Все, что ниже 1024, обычно требует корневого доступа. Если вам нужно протестировать подключение для 22, попросите ваш серверный скрипт запустить дополнительные функции.

Что касается отправки ответа обратно подключенному клиенту, используйте stream_socket_recvfrom($socket, $length, 0, $peer) вместо fread()

Затем на стороне клиента добавьте ответ слушатель:

Client.php

$socket = stream_socket_client('tcp://127.0.0.1:4444');
if ($socket) {
    $sent = stream_socket_sendto($socket, 'message');
    if ($sent > 0) {
        $server_response = fread($socket, 4096);
        echo $server_response;
    }
} else {
    echo 'Unable to connect to server';
}
stream_socket_shutdown($socket, STREAM_SHUT_RDWR);

Server.php

$conn = stream_socket_server('tcp://127.0.0.1:4444');
while ($socket = stream_socket_accept($conn)) {
    $pkt = stream_socket_recvfrom($socket, 1500, 0, $peer);
    if (false === empty($pkt)) {
        stream_socket_sendto($socket, 'Received pkt ' . $pkt, 0, $peer);
    }
    fclose($socket);
    usleep(10000); //100ms delay
}
stream_socket_shutdown($conn, \STREAM_SHUT_RDWR);

Выполнить server.php который будет слушать в бесконечном цикле, прослушивая непустой пакет один раз server.php получает пакет, он ответит подключенному клиенту полученным пакетом.

Затем выполните client.php который отправит "сообщение" на server.php После отправки он затем получит и повторит ответ от server.php который должен гласить 'Received pkt message'

 1
Author: fyrye, 2014-07-09 16:19:37

Из http://php.net/stream_socket_accept

Примите подключение к сокету, ранее созданному stream_socket_server().

Это означает, что он ожидает, что один клиент захочет подключиться. (Вы просто привязываете себя к порту, но ничего не подключаете)

И fread также является неправильной функцией для использования с функциями socket_*. Правильной функцией будет stream_socket_recvfrom().


Но это действительно не то, чего ты, кажется, хочешь. Вы по-видимому, хотите открыть соединение с каким-то местом. Таким образом, fsockopen() является правильной функцией:

$conn = fsockopen("127.0.0.1", 22, $errno, $errstr);
if (!$conn) {
  echo "$errstr ($errno)<br />\n";
} else {
  echo fread($conn, 26);
  fclose($socket);
}
 1
Author: bwoebi, 2013-08-28 00:58:14