【问题标题】:Send packets to Source Dedicated Server将数据包发送到源专用服务器
【发布时间】:2018-07-30 11:27:17
【问题描述】:

我正在尝试在 dart 中编写一个 RCON 客户端,但我现在卡住了:

服务器接收到数据包,但似乎无法正确读取它作为我收到的回复:

Rcon auth 从 rcon 白名单地址 2.xxx.xxx.169:52672 失败

即使密码也是正确的:

"rcon_password" = "foo" ( def. "" ) - 远程控制台密码。

我在代码 cmets 中提供了指向 valve's wiki 的链接。

这是我现在的代码:

Socket socket;
int _id = 1;

const int SERVERDATA_AUTH = 3;
const int SERVERDATA_AUTH_RESPONSE = 2;
const int SERVERDATA_EXECCOMMAND = 2;
const int SERVERDATA_RESPONSE_VALUE = 0;

void main() async {
    socket = await Socket.connect('hexah.net', 27015);
    await socket.listen(onSocketData, onError: onError, onDone: onDone);
    await _write(SERVERDATA_AUTH, 'foo');
}


void _write(int type, String body) async {

    var bodyASCII = ascii.encode(body); //Get ASCII string with Null terminator

    // Should I use this or the other way? ??
    var size = bodyASCII.length + 14;
    var buffer = new Int8List(size).buffer;
    var bdata = new ByteData.view(buffer);

    bdata.setInt32(0, size - 4, Endian.little); //Byte requests length (32bit le signed int).
    bdata.setInt32(4, _id, Endian.little); //Any integer (32bit le signed int).
    bdata.setInt32(8, type, Endian.little); //Valid values: SERVERDATA_* (32bit le signed int).
    int writepos = 12;
    await bodyASCII.forEach((element) {
        bdata.setInt8(writepos, element);
        writepos +=1;
    });
    bdata.setInt16(size-2, 0, Endian.little); //Write the null terminators
    await socket.write(bdata);
    _id++;
}

void onSocketData(var data){
    print(data);
}

void onError(var data, StackTrace stack){
    print(stack);
}

void onDone(){
    print('Connection terminated');
}

这里还有一个nodejs的小例子:

var size   = Buffer.byteLength(body) + 14,
buffer = new Buffer(size);

buffer.writeInt32LE(size - 4, 0);
buffer.writeInt32LE(id,       4);
buffer.writeInt32LE(type,     8);
buffer.write(body, 12, size - 2, "ascii");
buffer.writeInt16LE(0, size - 2);

你有什么想法吗? 尤其是关于获得正确的长度。

packet payload 应该是这样的

使用RawSocket 我得到这个回复:

RawSocketEvent.write

RawSocketEvent.readClosed

编辑:

我看到从 nodejs 发送的相同数据包导致身份验证成功,但 Dart 失败,任何想法为什么会发生这种情况? (将 nodejs 和 dart 中的数据包转换为数组,结果相同)

【问题讨论】:

    标签: node.js sockets dart packet steam


    【解决方案1】:

    解决了! 问题是我必须使用 RawSocket 并编写如下内容:

    var packet = bdata.buffer.asInt8List();
    await socket.write(packet, 0, packet.length);
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2010-12-29
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 2023-03-19
      • 2018-05-06
      相关资源
      最近更新 更多