PHP-сокеты – полуработающие

Итак, у меня есть mIRC, чтобы прослушать (медведь со мной на этом) на порту 1235, и я попытался сделать php-скрипт для подключения к этому порту на моем локальном сервере.

Мой localhost – это чистый Apache + PHP с запуском mIRC на другом компьютере (внутри lan).

Скрипт работает наполовину как: 1) он подключается к порту 1235; 2) он отправляет $ i 2.1), но с другой стороны не получает msg (ака, я получаю событие чтения носка, но текст не всплывает) 3) он считывает все входящие сообщения. Соответствие 4) оно закрывается, когда «конец» является буфером сообщений 5) он работает только в том случае, если функция while отсутствует. 5.1) aka Inifi-load. он показывает только эхо, когда сокет закрывается через 'end'

вот код, который является простым примером, который я нашел на php.net, заранее спасибо 🙂

<?php //The Client error_reporting(E_ALL); $address = "192.168.1.101"; $port = 1235; /* Create a TCP/IP socket. */ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) { echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; } else { echo "socket successfully created.\n"; } echo "Attempting to connect to '$address' on port '$port'..."; $result = socket_connect($socket, $address, $port); if ($result === false) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n"; } else { echo "successfully connected to $address.\n<br>"; } $allow = true; $i = 0; while ($allow == true) { $i++; echo "Sending $i to server.\n<br>"; socket_write($socket, $i, strlen($i)); $input = socket_read($socket, 2048); if ($input == 'end') { $allow = false; } echo "Response from server is: $input\n"; sleep(5); } echo "Closing socket..."; socket_close($socket); ?> 

это то, что я получаю в браузере, после слова «конец»

сокет успешно создан. Попытка подключиться к «192.168.1.101» на порту «1235» … успешно подключена к 192.168.1.101. Отправка 1 на сервер. Ответ от сервера: ok Ответ от сервера: end

это в mIRC:

test: 89.152.172.21 в! читать закрыть Blockquote

если бы я оставил его работать в течение часа, умножьте «чтение» на 60 и «отправьте N + 1 на сервер», но это только показывает вверх по закрытию носа (после остановки)

Related of "PHP-сокеты – полуработающие"

У вас есть «обычные» socket_write() и socket_read() . К сожалению, функции сокетов ненадежны по дизайну (это поведение унаследовано от сокетов BSD). Вы не можете просто вызвать socket_write() и ожидать, что он будет писать байты (как это ни странно, как это звучит …)

Справочная информация PHP:

socket_write () не обязательно записывает все байты из данного буфера. Действительно, в зависимости от сетевых буферов и т. Д., Хотя ваш буфер больше, записывается только определенный объем данных, даже один байт. Вы должны следить за тем, чтобы вы не случайно не забывали передавать остальную информацию.

Вы должны проверить, сколько байтов было написано, и продолжать повторять попытку, пока не будет отправлено все, что вам нужно.

То же самое касается чтения. Чтение вызова может читать столько, сколько вы запросили или меньше, и вы ожидаете повторить вызов.

Удостоверьтесь, что блокируются блокировки сокетов, а затем вызывается чтение / запись в цикле или используется (одинаково ужасный) select() чтобы найти, какие сокеты могут иметь некоторые данные или, возможно , закончили отправку.


Если вы хотите, чтобы API не был таким PITA, вместо этого используйте потоки , которые имеют надежные чтения / записи.

Если вам не обязательно нужен PHP, обратитесь к Node JS , который специально разработан для сервера / среды для программ с долговременными сетевыми подключениями.

+ Изменить

 socket_write($socket, $i, strlen($i)); 

Для того, чтобы:

 socket_write($socket, strval($i), strlen(strval($i))); 

Вы предоставляете целое число, в котором PHP ожидает строку.

Из одной из заметок в документации: http://php.net/manual/en/function.socket-write.php

Некоторые клиенты (например, XMLSocket от Flash) не будут запускать событие чтения до тех пор, пока не будет получена новая строка.

Поэтому попробуйте изменить свой код:

socket_write($socket, $i, strlen($i)); to: socket_write($socket, $i.'\n', strlen($i)+1);