Я пытаюсь «перенести» некоторый код из PHP в Node и пытаюсь выяснить, как заставить его работать. Я пытаюсь подключиться к серверу RCON через UDP.
Вот упрощенная версия версии PHP, которая работает:
$address = '1.2.3.4:1234';
$password = 'password';
$socket = stream_socket_client('udp://' . $address, $errno, $errstr);
stream_set_blocking($socket, 0);
$loginRequest = chr(0x45) . $password;
stream_socket_sendto($socket, $loginRequest, 0, $address);
echo 'RCON Login Request Sent' . PHP_EOL;
echo $loginRequest . PHP_EOL;
echo PHP_EOL;
do {
$data = stream_socket_recvfrom($socket, 127, 0, $address);
} while (!$data);
echo 'RCON Received Response' . PHP_EOL;
echo $data . PHP_EOL;
Вот что у меня есть в Node, который, похоже, ничего не делает. Я даже не получаю никакого подтверждения соединения с сервера.
var address = '1.2.3.4';
var port = '1234';
var password = 'password';
var socket = require('dgram').createSocket('udp4');
socket.on('message', function (msg, from) {
console.log(msg);
});
socket.on('listening', function () {
var loginPacket = new Buffer(String.fromCharCode(0xff) + password);
socket.send(loginPacket, 0, loginPacket.length, port, address, function (err, bytes) {
console.log('packet sent');
});
});
socket.on('error', function (err) {
console.log('ERROR: ', err);
});
socket.bind(0);
Любая помощь с этим была бы великолепна! maca134
Кодировка по умолчанию для передачи строки в Buffer
конструктор не binary
так что вам нужно передать двоичный код в качестве кодировки: new Buffer('\xFF' + password, 'binary')
, Первый байт 0xFF вызывает проблемы со значением по умолчанию utf8
кодирование. Кроме того, еще одно отличие заключается в том, что вы используете 0xFF
в узле, тогда как вы используете 0x45
в PHP.
socket.bind
занимает порт и необязательный хост. Вы поставляете порт 0.
Я не уверен, какой порт вы хотите слушать, но для примера я буду использовать 888.
socket.bind(888);