Добрый день. Как проверить порт примерно нашел. PHP: $fp = @fsockopen($host,$some_port, stream_set_timeout($fp, 15)); if ($fp) { echo 'работает!'; fclose($fp); } else { echo 'ниработает!'; } А вот как мне послать тому, что может быть на этому порту какую-то строку и если будет ответ, то получить его, не пойму. Подскажите, пожалуйста? И еще,как-то можно время отклика получить, без пинга? $fp возвращает его? Я посмотрел, не нашел ничего похожего. Спасбио заранее.
Это же функции для записи/чтения в/из файл(а). А мне нужно послать эту строку "программе" висящей на том порту, и получить ответ.
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); } ?> Вот это, верно? Уберём udp, сменим порт и будет то, что мне нужно, да? То есть я могу тут заменить, допустим PHP: fwrite($fp, "\n"); на PHP: fwrite($fp, "my_cool_text"); Таким образом я запишу эту строку в соккет, так?
PHP: <?php $fp = fsockopen("127.0.0.1", 23412, $errno, $errstr); if (!$fp) { echo "ERROR: $errno - $errstr<br />\n"; } else { fwrite($fp, "qwer"); echo fread($fp, 26); fclose($fp); } ?> вот так попробовал - страница не грузится. У меня же ничего не запущено, что запустить - не знаю.
ну так на кой ты тычешь в порт 23412 строку "qwer" без понимания того что должно вернуться? какой запрос - такой и ответ будет в сокет. Если ты наугад чтото оправляешь то и ничего не вернется.
Ну да. Попробовал на 80 порт отправить строку. Вроде ок прошло. Считать не может пока что. Если на 80 так посылать, норм будет по идее же? или вебсервера там данные будут перемешиваться? Код такой. PHP: $fp = fsockopen("127.0.0.1", 80, $errno, $errstr); if (!$fp) { echo "ERROR: $errno - $errstr<br />\n"; } else { fwrite($fp, "my_text"); $output=fread($fp, 4096); fclose($fp); } Я вероятно саму логику не понимаю, можете просто еще советом помочь? Вот такой код будет работать, если на сервере на этому порту всё будет ок работать и возвращать то, что нужно? То есть, размер возвращаемой строки же не 4096 может быть, нужно скорее всего циклом в переменную передать?
Во, нашел в манах такой код. PHP: <?php $fp = fsockopen("example.host.com", 80); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { fwrite($fp, "Data sent by socket"); $content = ""; while (!feof($fp)) { $content .= fread($fp, 1024); $stream_meta_data = stream_get_meta_data($fp); //Added line if($stream_meta_data['unread_bytes'] <= 0) break; //Added line } fclose($fp); echo $content; } ?> Вот тут же посылается и принимается всё нормально, так? stream_get_meta_data используется из-за того, что цикл не всегда прекращается по какой-то причине.
ставить таймаут нужно чтобы получить какойто ответ, на том "другом" конце сокета программа должна быть расчитана на прием какогото запроса. Просто так ты любой запрос конечно можешь отправить, но в ответ придет только на рассчитанные на то команды.
Да, конечно. Это до меня дошло, ступил. Но если программа на том конце расчитана на прием/отправку данных, то код который выше логически верен? Всё запишется и считается?
unread_bytes - не рекомендуется использовать в оф. мануале, хотя оно может работать. с виду верен. надо уже по случаю смотреть что приходит.