Нужен пример клиента UDP

у меня есть Парусный таймер который передает данные через UDP через сеть WiFi, созданную оборудованием лопастей ветра. Система работает нормально, и я могу читать данные через Стороннее ПО для навигации INavX. Но я хочу иметь возможность читать поток UDP напрямую через PHP для тестирования, и я не могу запустить свой скрипт. У меня нет опыта работы с UDP.

Я знаю, что оборудование и сеть работают правильно, потому что вышеупомянутое программное обеспечение работает нормально. Также я вижу сетевой трафик в wireshark. Я пытался обратиться к поставщику за помощью, но они сказали, что постепенно выводят мою модель из строя, они не помогут мне с моделью, которая у меня есть, и я должен купить новую. Но парень, который написал навигационное программное обеспечение, сказал, что это простое сетевое соединение без каких-либо строк инициации или чего-то еще: «Просто подключитесь к порту, и вы должны увидеть данные».

Чем это отличается от других примеров UDP, которые я видел, по сути, это «только прослушивание» (это то, что такое широковещание?). Если я пытаюсь записать данные в сокет, я получаю сообщение об ошибке «Отказано в доступе», поэтому я указываю ip и порт в функции socket_recvfrom.

Вот мой клиентский код на PHP:

<?php

# based on from http://www.binarytides.com/udp-socket-programming-in-php/

/*
Simple php udp socket client
*/

//Reduce errors
error_reporting(~E_WARNING);

// network settings for the wind vane
$server = '255.255.255.255';
$port = 55554;
if( isset($argv[1]) ) $server = $argv[1];
if( isset($argv[2]) ) $port   = $argv[2];

if(!($sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

die("Couldn't create socket: [$errorcode] $errormsg \n");
}



echo "Socket created \n";

// Bind the source address
if( !socket_bind($sock, "127.0.0.1" , 55554) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

die("Could not bind socket : [$errorcode] $errormsg \n");
}


//Communication loop
while(1)
{

//Now receive reply from server and print it
if( ($bytesRead = socket_recvfrom ( $sock , $reply , 2045 , 0 , $server, $port )) === FALSE)
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

if( ! in_array($errorcode, array(35) ) )
die("Could not receive data: [$errorcode] $errormsg \n");
}

if( $bytesRead > 0 ) {
echo "Reply : $reply";
}
usleep(500000);
}

1

Решение

Попробуйте это:

//Create socket.
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if (!$socket) { die("socket_create failed.\n"); }

//Set socket options.
socket_set_nonblock($socket);
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
if (defined('SO_REUSEPORT'))
socket_set_option($socket, SOL_SOCKET, SO_REUSEPORT, 1);

//Bind to any address & port 55554.
if(!socket_bind($socket, '0.0.0.0', 55554))
die("socket_bind failed.\n");

//Wait for data.
$read = array($socket); $write = NULL; $except = NULL;
while(socket_select($read, $write, $except, NULL)) {

//Read received packets with a maximum size of 5120 bytes.
while(is_string($data = socket_read($socket, 5120))) {
echo $data;
}

}
2

Другие решения

Вышеупомянутые сценарии не работали для меня, всегда приходили с неверным протоколом, какая-то ошибка:

Хотя это работало нормально:

C ++ приемник:

unlink("/tmp/mysock");
socklen_t address_length = sizeof(struct sockaddr_un);
int_socket_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
if(_socket_fd<=0){
perror("socket error socket()");
return false;
}
struct sockaddr_un server_address = {0};
server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, "/tmp/mysock");
if(bind(_socket_fd, (const struct sockaddr *) &server_address,
sizeof(server_address)) < 0)
{
perror("bind ()");
close(_socket_fd);
_socket_fd=0;
return false;
}
system("chmod 777 /tmp/mysock");

PHP: отправитель

$sock = socket_create (AF_UNIX, SOCK_DGRAM, 0 );//
if($sock!=null)
{
socket_sendto($sock, "ls\n", 3, 0, "/tmpmysock", 0);
fclose($sock);
}
0

По вопросам рекламы [email protected]