局域网开房
局域网开房
同一条网线也能开房: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),超出丢弃 |
| 与大厅的关系 | 二选一:局域网模式不经过大厅与匹配 |