Вот мой код:
<?php
$host = "127.0.0.1";
$portListen = 1234;
$portSend = 1240;
// create socket
$sSender = socket_create(AF_INET, SOCK_STREAM, 0);
socket_connect($sSender, $host, $portListen);
socket_write($sSender, "test", strlen ("test"));
$sListen = socket_create(AF_INET, SOCK_STREAM, 0);
socket_set_option($sListen, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($sListen, $host, $portSend);
socket_listen($sListen,1);
$dataSock = socket_accept($sListen);
echo socket_read($dataSock, 3, PHP_NORMAL_READ);
// close sockets
socket_close($sSender);
socket_close($sListen);
?>
Я отправляю "test" в другое приложение, оно получает и отправляет обратно "ack". Проблема в том, что я могу сделать это только один раз. Если я обновлюсь, я получу адрес уже использованной ошибки. Я попробовал решения, предложенные на php.net , но безрезультатно. Попытка socket_shutdown () перед socket_close () выдает только предупреждение о неподключенном подключении, а при обновлении дает бесконечную загрузку.
Из того, что я понимаю, причина, по которой сокет закрывается не сразу, заключается в том, что в буфере все еще есть данные. Но, как вы можете видеть, я четко заявляю, что слушаю только 1 соединение. Кроме того, я отправляю только 3 символа из своего приложения и читаю 3 в этом сценарии.
Что я делаю не так?
edit: причина, по которой я использую 2 сокета, заключается в том, что я не могу слушать () после write (), которая выдает ошибку подключения к сокету. Пропуск listen () и переход к read () после write () приведут к неверной ошибке аргумента.