Я изучаю программирование сокетов и экспериментирую с использованием php. Я хотел подключиться к сокет-серверу с помощью клиента и прочитать ответ сервера от клиента.
Коды для:
$address="127.0.0.1"; $port=3343; echo "I am here"; set_time_limit (0); if(false==($socket= socket_create(AF_INET,SOCK_STREAM, SOL_TCP))) { echo "could not create socket"; } socket_bind($socket, $address, $port) or die ("could not bind socket"); socket_listen($socket); if(($client=socket_accept($socket))) socket_write($client, "Welcome!!", 1024); socket_close($socket);
$host="127.0.0.1" ; $port=3343; $timeout=30; $sk=fsockopen($host,$port,$errnum,$errstr,$timeout) ; if (!is_resource($sk)) { exit("connection fail: ".$errnum." ".$errstr) ; } else { echo socket_read($sk, 256); //echo "Connected"; }
При подключении,
Выход сервера:
I am here
Выход клиента:
Warning: socket_read(): supplied resource is not a valid Socket resource in C:\xampp\htdocs\users\srv\test\client.php on line 16
Нашел проблему здесь.
socket_read () не работает с сокетами, которые не были созданы с помощью socket_create ().
Рабочий код:
$host="127.0.0.1" ; $port=3343; $timeout=30; $sk=fsockopen($host,$port,$errnum,$errstr,$timeout) ; if (!is_resource($sk)) { exit("connection fail: ".$errnum." ".$errstr) ; } else { while (!feof($sk)) echo fgets($sk, 256); //This does the trick //echo "Connected"; }
Вы смешиваете типы ресурсов.
fsockopen
возвращает указатель файла. Вам нужно использовать fread
, fwrite
и т. Д., А не socket_read
.
socket_read
принимает ресурсы сокетов create with socket_create
или socket_accept
Пример для fsockopen
на странице руководства PHP:
<?php $fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr); if (!$fp) { echo "ERROR: $errno - $errstr<br />\n"; } else { fwrite($fp, "\n"); echo fread($fp, 26); fclose($fp); } ?>
Ссылка fsockopen
ссылка socket_read