【发布时间】:2015-01-05 16:27:23
【问题描述】:
我正在尝试将一些代码从 PHP 中“移植”到 Node 中,并且我正在努力寻找如何让它工作。我也尝试通过 UDP 连接到 RCON 服务器。 这是 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);
对此的任何帮助都会很棒!玛咖134
【问题讨论】:
-
吹毛求疵:UDP 不是面向连接的,并且在 TCP 是流的意义上不是流。
-
将字符串传递给
Buffer构造函数的默认编码不是binary,因此您需要传递binary作为编码:new Buffer('\xFF' + password, 'binary')。第一个0xFF字节会导致默认utf8编码出现问题。此外,另一个区别是您在节点中使用0xFF而在 PHP 中使用0x45。 -
我很快更换了缓冲区,我还有一些其他代码来创建要发送的数据包。
-
@mscdex:非常感谢,我遇到了同样的问题,并将“二进制”作为编码传递给我的
Buffer对象修复了它。如果您想将此作为答案发布,我会很乐意尽可能多地投票! (即一次:))