dart 查询 Steam 大师服务器

dart query Steam Master Server

我正在尝试通过查询从 Steam 主服务器获取服务器 IP,然后查询游戏服务器。 https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol#

有很多不同编程语言的示例,但不是 dart。 https://gist.github.com/koenbollen/645947/09241258c0d2dd8d5a4e647865730ab83955f68b#file-mastersteam-py-L18

我的问题是:我什至不明白为什么地址 "hl2master.steampowered.com" 是无效的互联网地址。它在官方阀门主服务器查询(post 顶部的link)上是这样说的。

这是我尝试 运行 代码时遇到的错误: [错误:flutter/lib/ui/ui_dart_state.cc(148)] 未处理的异常:无效参数:无效的互联网地址 hl2master.steampowered.com

import 'dart:io';
import 'dart:convert';

// Master server:
const GOLD_SRC = "hl1master.steampowered.com";
const GOLD_SRC_PORT = 27010;

const SOURCE = "hl2master.steampowered.com";
const SOURCE_PORT = 27011;

// Regions:
const US_EAST_COAST = 0x00;
const US_WEST_COAST = 0x01;
const SOUTH_AMERICA = 0x02;
const EUROPE        = 0x03;
const ASIA          = 0x04;
const AUSTRALIA     = 0x05;
const MIDDLE_EAST   = 0x06;
const AFRICA        = 0x07;
const ALL           = 0xFF;



class MasterServerQuery {
  connectSocket01() async {
    var message = "31 FF 30 2E 30 2E 30 2E";
    InternetAddress master = InternetAddress(SOURCE);
    var masterPort = SOURCE_PORT;
    RawDatagramSocket.bind(InternetAddress.anyIPv4, 4096).then((
        RawDatagramSocket socket) {
      print('UDP Echo ready to receive');
      print('${socket.address.address}:${socket.port}');
      socket.listen((RawSocketEvent e) {
        Datagram d = socket.receive();
        if (d == null) return;

        String message = "31 FF 30 2E 30 2E 30 2E";
        print(
            'Datagram from ${d.address.address}:${d.port}: ${message.trim()}');

        socket.send(message.codeUnits, master, masterPort);
      });
    });
  }
}

地址无效,因为它需要有效的 IP 地址而不是主机名,您可以提供 IP 地址或使用 InternetAddress.lookup.

你的代码在传递消息的方式上也是错误的,你不应该传递 codeUnits 而应该传递字节:

  final byteData = ByteData(8);
  byteData.setUint8(0, 0x31);
  byteData.setUint8(1, 0xFF);
  byteData.setUint8(2, 0x30);
  byteData.setUint8(3, 0x2E);
  byteData.setUint8(4, 0x30);
  byteData.setUint8(5, 0x2E);
  byteData.setUint8(6, 0x30);
  byteData.setUint8(7, 0x2E);
  byteData.buffer.asUint8List() //Pass this.