сокеты — отправка командного сообщения через UDP с использованием переполнения стека

Отправить командное сообщение через UDP в PHP

Постановка задачи:
Я должен отправить запрос командного сообщения через UDP. У меня нет опыта в этом. У меня есть документ интерфейса, как это.

  • Отправляет командное сообщение на порт UDP 52005. Если устройство активно, вы получите ответ по локальному UDP.
    порт 52085.

1) Запрос блокировки входа

    SOURCE PORT = 52085
DESTINATION PORT = 52005
Message Data Structure
COUNT = 1 byte message padding length 0x09
TOKEN = 1 byte random value
SESSION = 2 bytes random value
COMMAND = 3 bytes command 0x43 0x00 0x00
PADDING = 9 bytes random data

2) Ответ блокировки входа

    SOURCE PORT = 52005
DESTINATION PORT = 52085
Message Data Structure
COUNT = 1 byte
TOKEN = 1 bytes save and use for next command
SESSION = 2 bytes
TYPE = 1 byte response type 0x63
INDEX = 1 byte site receiver number
STATUS = 1 byte receiver status
BIT0 = network outage
BIT1 = ping fail
BIT2 = DTU activity
BIT3 = host ok
LOGIN = 1250 bytes login block
each bit indicates a logged in account 0000 to 9999
PADDING = 11 bytes random data`enter code here`

Что я сделал, это:

а. Протестировал соединение UDP на тестировании IP с этим кодом, и это хорошо.

<?php
set_error_handler('my_error_handler');
function my_error_handler($errno, $errstr, $errfile, $errline) {}
function checkUDP($host,$port=80){
//look no suppression
$fp = fsockopen("udp://".$host, $port, $errno, $errstr,1.0);
if (!$fp) {
return false;
} else {
fclose($fp);
return true;
}
}

$good = '10.10.2.252';
if(checkUDP($good,52005)){
echo $good.' Good';
}else{
echo $good.' Bad';
}

?>

б. Создал php файл для получения ответа на порт 52005

<?php

//Reduce errors
error_reporting(~E_WARNING);

//Create a UDP socket
if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0)))
{
$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, "0.0.0.0" , 52085) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

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

echo "Socket bind OK \n";

//Do some communication, this loop can handle multiple clients
while(1)
{
echo "Waiting for data ... \n";

//Receive some data
$r = socket_recvfrom($sock, $buf, 512, 0, $remote_ip, $remote_port);
echo "$remote_ip : $remote_port -- " . $buf;

//Send back the data to the client
socket_sendto($sock, "OK " . $buf , 100 , 0 , $remote_ip , $remote_port);
}

socket_close($sock);

с. Создан php файл для отправки сообщения.

<?php
error_reporting(~E_WARNING);

$server = '10.10.2.252';
$port = 52005;

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

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

echo "Socket created \n";

//Communication loop
while(1)
{
//Take some input to send
echo 'Enter a message to send : ';
$input = fgets(STDIN);

//Send the message to the server
if( ! socket_sendto($sock, $input , strlen($input) , 0 , $server , $port))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);

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

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

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

echo "Reply : $reply";
}

Но когда я отправлял какое-либо сообщение, я не получал никакого ответа. Также я не знаю, как проверить, правильно ли я поступаю или нет.
Пожалуйста, помогите мне. Любая маленькая информация может помочь.
Благодарю.

1

Решение

Задача ещё не решена.

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

Других решений пока нет …

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