Всем привет! Появилась задача настроить Socket Server на PHP для обмена данными с клиентами(не только на PHP, предположительно на C++).
Но так как я вообще до этого не имел дело с сокетами, то соответственно куча вопросов.
Что именно мне нужно:
Нужно чтобы сервер и клиент обменивались посредством определенных сигналов.
В зависимости, кому нужны данные идет определенный сигнал на обмен данными(протокол ASTM).
Т.е, если клиенту нужны данные от сервера, то клиент отправляет сигнал на обмен данными ENQ, а сервер собирает данные запроса по сигналу ACK, до сигнала заверщения EOT.
<i>Запрос </i>
Клиент -> ENQ,<code>https://qna.habr.com/#</code>
<i>Ответ</i>
Сервер ->ACK(до тех пор пока не пришел сигнал EOT),
<i>Запрос </i>
<b>Клиент->EOT, </b>
Серевер(заверщение обмена данными)
Почему если fread() стоит раньше шем fwrite(), то консоль вообще ничего не показывает.
Пример:
<?php
$ACK="ACK\n";
$ENQ="ENQ\n";
$EOT="EOT\n";
$socket = stream_socket_server("tcp://127.0.0.1:8300", $errno, $errstr);
if (!$socket) {
echo "$errstr ($errno)<br />\n";
} else {
while ($connect = stream_socket_accept($socket,-1)) {
$msg=fread($connect,1024);
echo $msg;
fclose($connect);
}
fclose($socket);
}
?>
<?php
$ACK='ACK';
$ENQ='ENQ';
$EOT='EOT';
$socket_client= stream_socket_client("tcp://127.0.0.1:8300", $errno, $errstr, 30);
if (!$socket_client){
echo "$errstr ($errno)<br />\n";
} else {
$msg= fread($socket_client, 1024);
fwrite($socket_client,$ENQ);
echo $msg;
fclose($socket_client);
}
А если fread поставить ниже fwite() то консоль выводит $msg.