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.
我正在尝试通过查询从 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.