UDP запросы на php

Andey

Новичок
Добрый день
Подскажите такой вопрос.
На удаленном компьютере есть программа (не БД) которая слушает udp порт 11000
как при помощи php передать запрос на данный порт?

После того как погуглил получается что реализация идет через socket?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Скоро май,
Дремлет седой самурай,
Дипломов пора.
 

Andey

Новичок
написал такой мини код для проверки отклика от сокета

if (false !== ($bytes = socket_recv($sock, $buf, 2048, MSG_WAITALL))) {
echo "readed $bytes bytes from socket_recv(). close...";
} else {
echo "Dont can read becouse " . socket_strerror(socket_last_error($sock)) . "\n" ;
}
socket_close($sock);


Получил такой вот такой странный результат

"Dont can read becouse Операция успешно завершена."

т.е. сработала ветка с не выполненным условием однако результат (ошибка) пишет что все успешно завершено

может кто то подсказать где у меня ошибка?

и еще один вопрос можно как то настроить кодировку отдельно взятой строки? (сайт на utf 8 а отклик с сокета пришел в windows 1251)
 

Andey

Новичок
Выложил только кусок кода socket_create() прописывал выше и в сообщение не включал.

полный код

<?php

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

$address ="192.168.0.120";
$service_port = "11000";

$result = socket_connect($sock, $address, $service_port);
if ($result === false) {
echo "Не получилось выполнить функцию socket_connect().\nПричина: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
echo "OK.\n";
}

//результат OK

$msg = unpack("H*", '192.168.1.204 9 0 09760372 m203read ks');
$sda = $msg[1];
echo "<br>";

$len = strlen($sda);

socket_sendto($sock, $sda, $len, 0, '192.168.0.1', 11000);

$buf = 'This my buff';
if (false !== ($bytes = socket_recv($sock, $buf, 2048, MSG_WAITALL))) {
echo "readed $bytes bytes from socket_recv(). close...";
} else {
echo "Dont can read becouse " . socket_strerror(socket_last_error($sock)) . "\n";
}

//результат: Dont can read becouse Операция успешно завершена.

// вот эта операция успешно завершена и вводит в ступор. Получается что запрос на адрес все таки прошел, но к примеру не был обработан (не тот формат данных к примеру)???

$bytes = socket_recv($sock, $buf, 2048, MSG_DONTWAIT);
print_r($bytes);

socket_close($sock);


Про soket bind спасибо. Можете посоветовать какой нибудь учебник где есть главы о работе с сокетами?
php.net листаю регулярно, но как показал данный случай нужно иметь более общее представление что вообще требуется для работы а не только отдельные функции.
 

Andey

Новичок
ошибся
socket_sendto($sock, $sda, $len, 0, '192.168.0.120', 11000);


но результат все равно тот же самый
 

Andey

Новичок
Разобрался.
поменял MSG_WAITALL на MSG_DONTWAIT
получил ответ по первому варианту if
Всем спасибо
 

AnrDaemon

Продвинутый новичок
Дело не в клиент-сервер, дело в том, что мне пофигу, с какого адреса пойдёт запрос.
Bind нужен, когда не пофигу…
 
Сверху