ProudNet.Cn
WebsiteProud ConsoleLanguage
  • 🌐ProudNet
    • ProudNet 簡介
    • 下載並安裝
      • ProudNet授權認證方法
      • AMI
    • 項目設定
      • C++
      • C#
      • Mac Xcode
      • Linux
      • Unity3D
        • iOS 建置
      • Unreal Engine 4
      • 運行 PIDL 編譯器
    • 使用 ProudNet
      • 伺服器和客戶端
        • 如何使用伺服器
        • 如何使用客戶端
      • RMI
        • 如何使用RMI
      • PIDL
        • 如何使用PIDL
      • 事件處理
      • 通訊訊息
      • P2P 通訊
        • 如何使用P2P通訊
    • 活用 ProudNet
      • 如何使用它
      • 性能小貼士
    • 在 ProudNet 中使用 DB
      • DB Cache System ver.2
        • DB Cache 理論和理解
        • DB Cache 安裝和網絡設置
        • DB Cache 伺服器和用戶端
        • DB Cache 使用與活用
          • DB Cache 活用法
      • ADO API
      • ODBC API
    • ProudNet 實用程式
  • ProudNet note
    • 技術說明
      • 對主循環的理解
      • 配置服務器防火牆
      • 加密和解密
      • 發生錯誤時的應對事項
      • 錯誤信息列表
      • 同步角色位置
      • 客戶端與服務器通信
      • MiniDump (Error Dump System)
      • [1.6 版本] 服務器間 LAN 通訊器
    • 詞彙表
    • Sample 例題
  • 🌐ProudChat
    • 介紹及使用指南
    • 下載 SDK
      • C++
      • C#
      • Unity3D
      • Unreal Engine 4
Powered by GitBook
On this page
  • 在沒有 ProudNet 的情況下, 用單獨的 UDP 套接字進行通信
  • 在 DLL 項目中使用 ProudNet
  • 將 ProudNet 附加到基於 Web 服務器的遊戲服務器
  • (1) 如何在套接字服務器和WAS之間建立數據庫,實現數據共享
  • (2) 套接字服務器具有處理HTTP請求應答的功能,WAS向套接字服務器發送HTTP請求的方法
  • (3) 如何在 WAS 和套接字服務器之間進行非 HTTP 的套接字通信
  • 創建不良網絡環境
  • TCP 延遲傳輸功能和 Nagle 算法
  • Apple的IPv6策略迂迴策略
  • Unicode-多字節相互轉換
  1. ProudNet note

技術說明

PreviousProudNet 實用程式Next對主循環的理解

Last updated 1 year ago

在沒有 ProudNet 的情況下, 用單獨的 UDP 套接字進行通信

不建議使用 3rd party 的網絡引擎,但只提供使用 ProudNet 功能的機會。

由此,ProudNet可以獲得客戶端/服務器之間或P2P之間完成的打孔信息,以此爲基礎,可以用與ProudNet分開準備的UDP插座進行通信。

從 ProudNet 獲取的穿孔信息是路由器針對 Client 所擁有的 UDP 套接字映射的信息, 因此必須關閉此 UDP 套接字 。 爲此,必須調用 Proud.CNetClient.Disconnect 或優先調用 Client 對象破壞 。 然後在3rd party中重新使用Client的UDP插座地址。

如果不經過此過程而重複生成UDP插座,則 ProudNet 和 3rd party 的 UDP插座都將異常運行。

主要程序如下。

  1. 首先,爲了獲取打孔信息,使用Proud.CNetClient.GetDirectP2PInfo。

  2. 卸載 ProudNet 佔用的 UDP 套接字 。 Proud.CNetClient.InvalidateUdpSocket 關閉 Client 所擁有的 UDP 套接字 。 此時路由器的打孔狀態保持不變。 Proud.CNetClient.InvalidateUdpSocket中返回的值可用於單獨模塊中的通信。

  3. 調用Proud.CNetClient.InvalidateUdpSocket後,使用Proud.CNetClient.RestoreUdpSocket新建UDP套接字,恢復服務器與接口之間的UDP通信。

  4. 有些路由器即使是打孔的,在幾十秒到幾分鐘後,打孔圖可能會被任意改變或蒸發。 ProudNet通過自身的relay fallback功能自行解決該問題。 但是,如果使用3rd party UDP socket,這個問題必須由開發者或3rd party引擎直接解決,否則P2P通信可能會失敗。

C++ 函數
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組。

上述方法不是正常的使用方法。 因此,對於use_alternative_p2p引發的問題,ProudNet不負責。

在 DLL 項目中使用 ProudNet

使用 ProudNet 作爲 static library, 但如果要用於 DLL 項目, 您必須調用 DllMain 函數中的 process detach case 中的 Proud.Thread.NotifyDllProcessDetached 。 否則程序退出時可能會發生崩潰現象。

BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    break;
    case DLL_PROCESS_DETACH:
    {
        Thread::NotifyDllProcessDetached();
    }
    break;
    }
    return TRUE;
}

將 ProudNet 附加到基於 Web 服務器的遊戲服務器

爲了方便開發遊戲服務器,使用web application server (WAS),但缺點是很難快速處理實時多人在服務器上處理遊戲,服務器負荷過大。

爲了彌補這一點,將像ProudNet這樣的插座服務器和WAS混合使用的方法如下。

(1) 如何在套接字服務器和WAS之間建立數據庫,實現數據共享

雖然直觀、簡單,但缺點是處理量集中在數據庫上,處理超過數據共享,WAS無法向套接字服務器發送請求和接收響應。

(2) 套接字服務器具有處理HTTP請求應答的功能,WAS向套接字服務器發送HTTP請求的方法

爲此,有將Microsoft REST SDK等用於套接字服務器的方法。

(3) 如何在 WAS 和套接字服務器之間進行非 HTTP 的套接字通信

WAS向插件發送命令,插件接收命令後發送到套接字服務器。 對於 ProudNet,可以使用 NetClient 或 LanClient。

WAS 的插件編程方法

PHP: CGI or FastCGI ASP.NET: C# class library node.js: C plugin Java: JNI

創建不良網絡環境

用阻止中途UDP通信的方法模仿惡劣的網絡環境。 通過調用 Proud.CNetClient.TEST_FallbackUdpToTcp,可以暫時或永久地阻止 UDP 通信。

TCP 延遲傳輸功能和 Nagle 算法

TCP基本上內置了延遲發送功能,這可以在WAN網絡通信時有效地維持通信量。 但是需要發送的數據稍微延遲後發送給對方。

延遲發送功能也被稱爲Nagle算法。 Nagle算法會延遲0.01~0.7秒的發送,因此可能不適合網絡遊戲,因此ProudNet提供關閉功能。 Nagle算法關閉時,Delayed Send最長爲0.01秒,以防止Silly Window Syndrome。

如何控制Nagle算法,請參考以下內容。

C++ 函數
註釋

Proud.CStartServerParameter.m_enableNagleAlgorithm

啓用或禁用 TCP 延遲傳輸和 Nagle 算法 。

Proud.CStartLanServerParameter.m_enableNagleAlgorithm

-

Apple的IPv6策略迂迴策略

由於Apple的策略,連接服務器時不能使用以下格式的地址。

11.22.33.44
1122:3344:5566:7788:1122:3344:5566:7788

相反,您必須使用 FQDN 格式的主機名。

myserver1.mygame.com

雖然要儘快應對Apple的政策,但是如果沒有時間立即對所有服務器分配FQDN名稱的話,可以使用ProudNet提供的迂迴解決的方法。

除了想要連接的服務器地址外,在[1]和[2]中放入不同的FQDN即可。

CNetClient* nc = CNetClient::Create();
p.m_serverIP = "11.22.33.44";
p.m_publicDomainName1 = "www.nettention.com"; // [1]
p.m_publicDomainName2 = "www.nts.go.kr";  // [2]
nc->Connect(p);

注意

  • [1]和[2]必須是不同的域名。

  • [1]科 [2] 不應該具有 IPv6 地址。

  • NetClient 不會實際訪問 [1] 和 [2] 的服務器。 但是[1]和[2]必須是有效主機。

本迂迴策略不是根本的解決方法,並不能保證所有NetServer的正常連接。 爲了從根本上解決這一問題,必須按照Apple的建議使用FQDN格式的主機名稱。

參考

Unicode-多字節相互轉換

ProudNet使用Unicode,因此建議開發時使用Unicode,但即使是不使用Unicode的程序,也可以使用ProudNet。

無法使用Unicode時(現有製作的程序已不是Unicode基礎等),將輸入到ProudNet的字符串轉換爲Unicode的過程和輸出的字符串轉換爲多字節代碼MBCS。

此作用的類別是 Proud::StringA2W, Proud::StringW2A 。

Proud::StringA2W類負責將MBCS轉化爲Unicode,而Proud::StringW2A則反過來將Unicode轉化爲MBCS。

void Foo()
{
    // 從 Unicode 轉換爲 MBCS
    Proud::String a=L"ABC";
    const char* b = Proud::StringW2A(a);
    
    // 將 MBCS 轉換為 Unicode
    Proud::String c = Proud::StringA2W(b);
}

IPv4 分配結束
穿孔