技術說明
Last updated
Last updated
不建議使用 3rd party 的網絡引擎,但只提供使用 ProudNet 穿孔功能的機會。
由此,ProudNet可以獲得客戶端/服務器之間或P2P之間完成的打孔信息,以此爲基礎,可以用與ProudNet分開準備的UDP插座進行通信。
從 ProudNet 獲取的穿孔信息是路由器針對 Client 所擁有的 UDP 套接字映射的信息, 因此必須關閉此 UDP 套接字 。 爲此,必須調用 Proud.CNetClient.Disconnect 或優先調用 Client 對象破壞 。 然後在3rd party中重新使用Client的UDP插座地址。
如果不經過此過程而重複生成UDP插座,則 ProudNet 和 3rd party 的 UDP插座都將異常運行。
主要程序如下。
首先,爲了獲取打孔信息,使用Proud.CNetClient.GetDirectP2PInfo。
卸載 ProudNet 佔用的 UDP 套接字 。 Proud.CNetClient.InvalidateUdpSocket 關閉 Client 所擁有的 UDP 套接字 。 此時路由器的打孔狀態保持不變。 Proud.CNetClient.InvalidateUdpSocket中返回的值可用於單獨模塊中的通信。
調用Proud.CNetClient.InvalidateUdpSocket後,使用Proud.CNetClient.RestoreUdpSocket新建UDP套接字,恢復服務器與接口之間的UDP通信。
有些路由器即使是打孔的,在幾十秒到幾分鐘後,打孔圖可能會被任意改變或蒸發。 ProudNet通過自身的relay fallback功能自行解決該問題。 但是,如果使用3rd party UDP socket,這個問題必須由開發者或3rd party引擎直接解決,否則P2P通信可能會失敗。
C++ 函數 | C# 函數 | 註釋 |
---|---|---|
上述方法不是正常的使用方法。 因此,對於use_alternative_p2p引發的問題,ProudNet不負責。
使用 ProudNet 作爲 static library, 但如果要用於 DLL 項目, 您必須調用 DllMain 函數中的 process detach case 中的 Proud.Thread.NotifyDllProcessDetached 。 否則程序退出時可能會發生崩潰現象。
爲了方便開發遊戲服務器,使用web application server (WAS),但缺點是很難快速處理實時多人在服務器上處理遊戲,服務器負荷過大。
爲了彌補這一點,將像ProudNet這樣的插座服務器和WAS混合使用的方法如下。
雖然直觀、簡單,但缺點是處理量集中在數據庫上,處理超過數據共享,WAS無法向套接字服務器發送請求和接收響應。
爲此,有將Microsoft REST SDK等用於套接字服務器的方法。
WAS向插件發送命令,插件接收命令後發送到套接字服務器。 對於 ProudNet,可以使用 NetClient 或 LanClient。
PHP: CGI or FastCGI ASP.NET: C# class library node.js: C plugin Java: JNI
用阻止中途UDP通信的方法模仿惡劣的網絡環境。 通過調用 Proud.CNetClient.TEST_FallbackUdpToTcp,可以暫時或永久地阻止 UDP 通信。
TCP基本上內置了延遲發送功能,這可以在WAN網絡通信時有效地維持通信量。 但是需要發送的數據稍微延遲後發送給對方。
延遲發送功能也被稱爲Nagle算法。 Nagle算法會延遲0.01~0.7秒的發送,因此可能不適合網絡遊戲,因此ProudNet提供關閉功能。 Nagle算法關閉時,Delayed Send最長爲0.01秒,以防止Silly Window Syndrome。
如何控制Nagle算法,請參考以下內容。
由於Apple的策略,連接服務器時不能使用以下格式的地址。
相反,您必須使用 FQDN 格式的主機名。
雖然要儘快應對Apple的政策,但是如果沒有時間立即對所有服務器分配FQDN名稱的話,可以使用ProudNet提供的迂迴解決的方法。
除了想要連接的服務器地址外,在[1]和[2]中放入不同的FQDN即可。
注意
[1]和[2]必須是不同的域名。
[1]科 [2] 不應該具有 IPv6 地址。
NetClient 不會實際訪問 [1] 和 [2] 的服務器。 但是[1]和[2]必須是有效主機。
本迂迴策略不是根本的解決方法,並不能保證所有NetServer的正常連接。 爲了從根本上解決這一問題,必須按照Apple的建議使用FQDN格式的主機名稱。
參考
ProudNet使用Unicode,因此建議開發時使用Unicode,但即使是不使用Unicode的程序,也可以使用ProudNet。
無法使用Unicode時(現有製作的程序已不是Unicode基礎等),將輸入到ProudNet的字符串轉換爲Unicode的過程和輸出的字符串轉換爲多字節代碼MBCS。
此作用的類別是 Proud::StringA2W, Proud::StringW2A 。
Proud::StringA2W類負責將MBCS轉化爲Unicode,而Proud::StringW2A則反過來將Unicode轉化爲MBCS。
C++ 函數 | 註釋 |
---|---|
Proud.CNetClient.GetDirectP2PInfo
Nettention.Proud.NetClient.GetDirectP2PInfo
獲取打孔信息以與其他peer通信。
Proud.CNetClient.InvalidateUdpSocket
Nettention.Proud.NativeNetClient.InvalidateUdpSocket
關閉內部擁有的UDP插座後,強制將服務器與P2P通信轉換爲旁路狀態。
Proud.CNetClient.RestoreUdpSocket
Nettention.Proud.NativeNetClient.RestoreUdpSocket
重新創建已移除的 UDP 套接字, 並重新啓動與相對 peer 的 UDP 孔打孔 。
Proud.CNetClient.Disconnect
Nettention.Proud.NetClient.Disconnect
關閉服務器連接,退出所有P2P組。
Proud.CStartServerParameter.m_enableNagleAlgorithm
啓用或禁用 TCP 延遲傳輸和 Nagle 算法 。
Proud.CStartLanServerParameter.m_enableNagleAlgorithm
-