Dart查询Steam Master Server

问题描述 投票:0回答:1

我试图通过查询从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”是无效的互联网地址。它在官方Valve主服务器查询上是这样说的(文章顶部的链接)。

这是我尝试运行代码的错误:[错误: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);
      });
    });
  }
}
dart server udp steam
1个回答
0
投票

该地址无效,因为它需要有效的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.
© www.soinside.com 2019 - 2024. All rights reserved.