我正在嘗試為簡單的 Unity 游戲實作 UDP 資料報的 NAT 打孔。我有一個公共服務器(example.com),它在埠 8995 上同時監聽 TCP 和 UDP。
演算法思路如下:
- 客戶端在 TCP/8995 上連接并指定它要托管的游戲的詳細資訊
- 服務器用令牌回復
UdpClient客戶端通過C# 中的類啟動 UDP 套接字- 客戶端使用令牌從這個套接字向服務器發送 UDP 資料報。服務器獲知客戶端的NAT Ip/Port
- 當另一個客戶端想要連接時,它會向服務器詢問它想要連接的客戶端的 Ip/Port
我遇到的問題是第 4 步。我在 NAT 后面的 PC(192.168.1.1 埠 9589)上設定了一個客戶端,并將我的 UDP 資料包發送到服務器。我通過以下方式收到它:
_listener = new UdpClient(_settings.EndPoint);
IPEndPoint source = new IPEndPoint(IPAddress.Any, 0);
var datagram = _listener.Receive(ref source);
_logger.LogDebug("Recevied UDP handshake from {EndPoint}", source);
我在這里得到的日志是Recevied UDP handshake from x.x.x.x:9589xxxx 是我正確的客戶端公共 IP。
顯然,我在日志中獲取的埠不是 NAT 上的臨時埠,而是 NAT 后面客戶端的本地埠。所以 Peer 必須遍歷 NAT 才能了解這一點(也許是通過 UPnP?)。有沒有辦法在服務器上禁用該行為,以便我可以了解 NAT 上的臨時埠?
我正在使用 Net Core 6 和 Ubuntu 服務器
uj5u.com熱心網友回復:
顯然,我在日志中獲取的埠不是 NAT 上的臨時埠,而是 NAT 后面客戶端的本地埠。
您獲得的是 NAT 分配的埠,而不是 LAN 上客戶端使用的埠。這些埠可以是相同的,因為許多 NAT 實作盡可能嘗試保留埠。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/529643.html
標籤:C#插座联网UDP纳特
