Skip to Content
CrossingNet
局域网开房

局域网开房

同一条网线也能开房:UDP 广播与组播发现、OFFER/QUERY/BYE、TTL 与 HostId 去重,以及开房、发现、加入的命令行路径。

不是每个对局都需要大厅。局域网模式下,一台机器当房主,同网段的机器能看见它,点一下进房。 发现走 UDP,协议版本 CRSLAN/1,默认端口 57350。

协议

包谁发内容
OFFER房主,每 LANAnnounceInterval 秒房间名、游戏端口、地图、人数、容量、HostId、TTL
QUERY客户端,想立刻刷新时空包,请求房主立即回 OFFER
BYE房主关房时HostId,让它立刻从列表消失
  • 默认组播到 239.255.42.99,LANUseMulticast=False 时只发子网广播
  • 接收方按 HostId 去重;同一房间重复包只更新不新增
  • LANRoomTTL(默认 6 秒)没再收到就移出列表

只认来源

包里的地址不被信任:房间 IP 一律取 UDP 包的源地址。另外还会校验:

  • 包版本与长度
  • 字段范围(端口、人数、TTL)
  • 源地址必须是私有网段(LANRequirePrivateAddress)
  • 接收侧节流 LANMinPacketInterval(默认 0.05 秒),防止有人刷爆列表

配置

[/Script/CrossingNet.CrossingNetSettings]
bEnableLANDiscovery=True
LANDiscoveryPort=57350
LANMulticastAddress=239.255.42.99
LANUseMulticast=True
LANAnnounceInterval=1.5
LANRoomTTL=6.0
LANMaxRooms=64
LANRequirePrivateAddress=True
LANMinPacketInterval=0.05
LANGamePortRange=(X=57100,Y=57150)

开房

UCrossingLANSubsystem* LAN = GetGameInstance()->GetSubsystem<UCrossingLANSubsystem>();

FCrossingLANHostSettings Settings;
Settings.RoomName = TEXT("我的房间");
Settings.MaxPlayers = 8;

FString Error;
if (!LAN->StartHost(Settings, TEXT("我"), Error))
{
    // Error 里是具体原因(端口占用、找不到网卡……)
}

StartHost 监听游戏端口并开始广播;IsHosting()、GetHostGamePort()、GetHostId() 可查。 端口从 LANGamePortRange 顺延,被占用就取下一个。

发现与加入

LAN->StartDiscovery(Error);                     // 开始收 OFFER
const TArray<FCrossingLANRoomInfo>& Rooms = LAN->GetRooms();
LAN->RefreshRooms();                            // 发 QUERY
LAN->JoinRoom(Rooms[0], TEXT(""), Error);       // 有密码就传密码
LAN->JoinDirect(TEXT("192.168.1.23:57100"), Error);

加入就是一次普通客户端旅行,只是地址来自发现列表。密码校验在房主侧做,错了回 3004 BadPassword。

控制台

CrossingNet.LANHost [roomName] [map] [gamePort]
CrossingNet.LANAdvertise [roomName] [map] [gamePort]
CrossingNet.LANDiscover
CrossingNet.LANList
CrossingNet.LANJoin <ip:port>
CrossingNet.LANStop
CrossingNet.LANInfo

两台机器联调:

A: CrossingNet.LANHost 我的房间 /Game/Maps/Arena 57100
B: CrossingNet.LANDiscover
B: CrossingNet.LANList
B: CrossingNet.LANJoin 192.168.1.23:57100

边界

项现状
认证只有房间密码,没有账号体系
加密无;明文 UDP 广播
跨网段不可用,发现靠广播
组播被拦关掉 LANUseMulticast 只发广播
最大房间数LANMaxRooms(默认 64),超出丢弃
与大厅的关系二选一:局域网模式不经过大厅与匹配

上一页:身份与档案 · 下一页:设备与封禁。

On this page