該儲存庫提供了由 Valve Software 創建和維護的 GameNetworkingSockets 庫的託管 C# 抽象。在開始之前,您需要建立具有所有必需依賴項的本機程式庫。
該專案正在根據本機庫的版本進行更新。
可以使用支援 C# 3.0 或更高版本的任何可用編譯平台來建立託管組件。
定義VALVESOCKETS_SPAN
以啟用 Span 的支援。請按照以下步驟操作,以實現對本機記憶體區塊的快速存取並提高效能。
在開始工作之前,應使用Valve.Sockets.Library.Initialize();
功能。
工作完成後,使用Valve.Sockets.Library.Deinitialize();
功能。
NetworkingSockets server = new NetworkingSockets();uint pollGroup = server.CreatePollGroup();StatusCallback status = (ref StatusInfo info) => {switch (info.connectionInfo.state) {case ConnectionState.None:Connectionbreak;case server.Connecting: .AcceptConnection(info.connection);server.SetConnectionPollGroup(pollGroup, info.connection);break;case ConnectionState.Connected:Console.WriteLine("客戶端已連線- ID: " + info.connection + ", IP: " + info. connectionInfo.address.GetIP());break;case ConnectionState.ClosedByPeer:case ConnectionState.ProblemDetectedLocally:server.CloseConnection(info.connection);Console.WriteLine("客戶端已斷開連接- ID: " + info. connection + ", IP: " + info.connectionInfo.address.GetIP());break;}};utils.SetStatusCallback(status);Address 位址= new Address();address.SetAddress("::0", port );uint ListenSocket = 伺服器.CreateListenSocket(ref 位址);#if VALVESOCKETS_SPANMessageCallback message = (in NetworkingMessage netMessage) => {Console.WriteLine("訊息 接收自- ID: " + netMessage.connection netMessage.channel + ",資料長度: " + netMessage.length);};#else const int maxMessages = 20;NetworkingMessage[] netMessages = new NetworkingMessage[maxMessages];#endifwhile (!Console. ); #if VALVESOCKETS_SPANserver.ReceiveMessagesOnPollGroup(pollGroup, 訊息, 20); #else int netMessagesCount = server.ReceiveMessagesOnPollGroup(pollGroup, netMessages, maxMessages);if (netMessagesCount > 0) {for (int i = 0; i < netMessagesCount; i++) {ref NetworkingMessage net.Messages =Pessages = essayessayessay5ageoo 3.MessageS. ("訊息接收自- ID: " + netMessage.connection + ", 通道ID: " + netMessage.channel + ", 資料長度: " + netMessage.length);netMessage.Destroy();}} #endif Thread.Sleep(15);}server.DestroyPollGroup(pollGroup);
NetworkingSockets 用戶端= new NetworkingSockets();uint 連線= 0;StatusCallback 狀態= (ref StatusInfo info) => {switch (info.connectionInfo.state) {case ConnectionState.None:break;case ConnectionState.Connected:Console.WriteLine(State.None:break;case ConnectionState.Connected:Console.WriteLine(State.None:break;case ConnectionState.Connected:Console.WriteLine(State.None:break)(case)ole.Write "客戶端連線到伺服器- ID: " + 連線);break;case ConnectionState.ClosedByPeer:case ConnectionState.ProblemDetectedLocally:client.CloseConnection(connection);Console.WriteLine("客戶端與伺服器斷開連線");break; }};utils. SetStatusCallback(status);Address 位址= new Address();address.SetAddress("::1", port);connection = client.Connect(ref 位址);#if VALVESOCKETS_SPANMessageCallback message = (net NetworkMessage = net ) => {Console .WriteLine("從伺服器收到的訊息- 通道ID: " + netMessage.channel + ", 資料長度: " + netMessage.length);};#else const int maxMessages = 20;NetworkingMessage[] netMessages = new NetworkingMessage[maxMessages] ;#endifwhile (!Console.KeyAvailable) {client.RunCallbacks(); #if VALVESOCKETS_SPANclient.ReceiveMessagesOnConnection(連接, 訊息, 20); #else int netMessagesCount = client.ReceiveMessagesOnConnection(connection, netMessages, maxMessages);if (netMessagesCount > 0) {for (int i = 0; i < netMessagesCount; i++) {ref NetworkingMessage net i = 0; i < netMessagesCount; i++) {ref NetworkingMessage netMessage. ("從伺服器收到的訊息- 通道ID: " + netMessage.channel + ", 資料長度: " + netMessage.length);netMessage.Destroy();}} #endif Thread.Sleep(15);}
byte[] data = new byte[64];sockets.SendMessageToConnection(連接, 資料);
byte[] buffer = new byte[1024];netMessage.CopyTo(buffer);
DebugCallback debug = (type, message) => {Console.WriteLine("Debug - Type: " + type + ", Message: " + message);};NetworkingUtils utils = new NetworkingUtils();utils.SetDebugCallback(DebugType.Everything , 偵錯);
使用方法與.NET環境下幾乎相同,只是控制台功能必須替換為Unity提供的功能。如果將在遊戲循環中呼叫NetworkingSockets.RunCallbacks()
,則透過在播放器設定中啟用適當的選項來保持 Unity 在背景運作。
NetworkingSockets.SendMessageToConnection()
函數的標誌定義:
SendFlags.Unreliable
不可靠,無法保證訊息的傳遞,訊息可能會亂序傳遞。
SendFlags.Reliable
可靠有序,目標連線必須接收訊息,並且應嘗試重新發送,直到訊息被傳遞為止。
SendFlags.NoNagle
訊息不會與計時器內的其他訊息分組。
SendFlags.NoDelay
如果訊息不能相對快速地發送,則不會緩衝該訊息。
NetworkingIdentity
結構的身份類型定義:
IdentityType.Invalid
未知或無效。
IdentityType.SteamID
Steam 識別碼。
IdentityType.IPAddress
IPv4/IPv6 位址。
ConnectionInfo.state
欄位的連線狀態定義:
ConnectionState.None
虛擬狀態,連線不存在或已關閉。
ConnectionState.Connecting
正在進行中,由NetworkingSockets.Connect()
函數啟動建立連線。
ConnectionState.FindingRoute
如果伺服器接受該連接,則此連接切換到會合狀態,但端對端的路由仍然尚未建立(透過中繼網路)。
ConnectionState.Connected
由NetworkingSockets.Connect()
函數發起的連線請求已完成。
ConnectionState.ClosedByPeer
連線已被對等方關閉,但未在本機關閉。如果入站佇列中有任何訊息,則可以檢索它們。否則,除了使用NetworkingSockets.CloseConnection()
函數關閉連線之外,無法對連線執行任何操作。從 API 角度來看,連線仍然存在,必須關閉以釋放資源。
ConnectionState.ProblemDetectedLocally
本地偵測到連線中斷。嘗試發送更多訊息將會失敗。佇列中所有剩餘的已接收訊息均可用。從 API 角度來看,連線仍然存在,必須關閉以釋放資源。
配置範圍定義:
ConfigurationScope.Global
ConfigurationScope.SocketsInterface
ConfigurationScope.ListenSocket
ConfigurationScope.Connection
配置資料類型的定義:
ConfigurationDataType.Int32
ConfigurationDataType.Int64
ConfigurationDataType.Float
ConfigurationDataType.String
ConfigurationDataType.FunctionPtr
配置值的定義:
ConfigurationValue.Invalid
ConfigurationValue.FakePacketLossSend
ConfigurationValue.FakePacketLossRecv
ConfigurationValue.FakePacketLagSend
ConfigurationValue.FakePacketLagRecv
ConfigurationValue.FakePacketReorderSend
ConfigurationValue.FakePacketReorderRecv
ConfigurationValue.FakePacketReorderTime
ConfigurationValue.FakePacketDupSend
ConfigurationValue.FakePacketDupRecv
ConfigurationValue.FakePacketDupTimeMax
ConfigurationValue.TimeoutInitial
ConfigurationValue.TimeoutConnected
ConfigurationValue.SendBufferSize
ConfigurationValue.SendRateMin
ConfigurationValue.SendRateMax
ConfigurationValue.NagleTime
ConfigurationValue.IPAllowWithoutAuth
ConfigurationValue.MTUPacketSize
ConfigurationValue.MTUDataSize
ConfigurationValue.Unencrypted
ConfigurationValue.EnumerateDevVars
ConfigurationValue.SymmetricConnect
ConfigurationValue.LocalVirtualPort
ConfigurationValue.ConnectionStatusChanged
ConfigurationValue.AuthStatusChanged
ConfigurationValue.RelayNetworkStatusChanged
ConfigurationValue.MessagesSessionRequest
ConfigurationValue.MessagesSessionFailed
ConfigurationValue.P2PSTUNServerList
ConfigurationValue.P2PTransportICEEnable
ConfigurationValue.P2PTransportICEPenalty
ConfigurationValue.P2PTransportSDRPenalty
ConfigurationValue.SDRClientConsecutitivePingTimeoutsFailInitial
ConfigurationValue.SDRClientConsecutitivePingTimeoutsFail
ConfigurationValue.SDRClientMinPingsBeforePingAccurate
ConfigurationValue.SDRClientSingleSocket
ConfigurationValue.SDRClientForceRelayCluster
ConfigurationValue.SDRClientDebugTicketAddress
ConfigurationValue.SDRClientForceProxyAddr
ConfigurationValue.SDRClientFakeClusterPing
ConfigurationValue.LogLevelAckRTT
ConfigurationValue.LogLevelPacketDecode
ConfigurationValue.LogLevelMessage
ConfigurationValue.LogLevelPacketGaps
ConfigurationValue.LogLevelP2PRendezvous
ConfigurationValue.LogLevelSDRRelayPings
配置值結果定義:
ConfigurationValueResult.BadValue
ConfigurationValueResult.BadScopeObject
ConfigurationValueResult.BufferTooSmall
ConfigurationValueResult.OK
ConfigurationValueResult.OKInherited
調試類型的定義:
DebugType.None
DebugType.Bug
DebugType.Error
DebugType.Important
DebugType.Warning
DebugType.Message
DebugType.Verbose
DebugType.Debug
DebugType.Everything
運算結果定義:
Result.OK
成功.
Result.Fail
一般失敗。
Result.NoConnection
網路連線失敗。
Result.InvalidParam
參數不正確。
Result.InvalidState
所呼叫的物件處於無效狀態。
Result.Ignored
目標正在忽略寄件者。
提供每個套接字事件。
StatusCallback(ref StatusInfo info)
在偵聽套接字上的排程機制傳回連線狀態時發出通知。應保留對委託的引用,以免被垃圾收集。
提供每個應用程式的事件。
DebugCallback(DebugType type, string message)
在出現具有所需詳細程度的偵錯資訊時發出通知。應保留對委託的引用,以免被垃圾收集。
包含帶有 IP 位址和連接埠號碼的編組資料。
Address.ip
IP 位址(以位元組為單位)。
Address.port
埠號。
Address.IsLocalHost
檢查身分是否為 localhost。
Address.GetIP()
以可列印的形式取得 IP 位址。
Address.SetLocalHost(ushort port)
將 localhost 設定為指定連接埠。
Address.SetAddress(string ip, ushort port)
設定具有指定連接埠的 IP 位址 (IPv4/IPv6)。
Address.Equals(Address other)
確定位址相等。
包含帶有配置的編組資料。
Configuration.value
是ConfigurationValue
枚舉中所描述的值的型別。
Configuration.dataType
ConfigurationDataType
列舉中所描述的資料型態。
Configuration.data
配置資料的聯合。
包含具有連線狀態的編組資料。
StatusInfo.connection
連接 ID。
StatusInfo.connectionInfo
本質上是具有編組資料的ConnectionInfo
結構。
包含連接資訊的編組資料。
ConnectionInfo.identity
端點的識別碼。
ConnectionInfo.userData
使用者提供的數據,使用NetworkingSockets.SetConnectionUserData()
函數設定。
ConnectionInfo.listenSocket
偵聽此連線的套接字。
ConnectionInfo.address
端點的遠端位址。
ConnectionInfo.state
ConnectionState
枚舉中所述的連線的進階狀態。
ConnectionInfo.endReason
連線終止或問題的基本原因。
ConnectionInfo.endDebug
以人類可讀的形式解釋連線終止或問題。這僅用於調試診斷目的,而不是向用戶顯示。它可能包含一些特定於該問題的詳細資訊。
ConnectionInfo.connectionDescription
調試描述包括連接句柄、連接類型和對等資訊。
包含具有頻繁請求的連線狀態的編組資料。
ConnectionStatus.state
ConnectionState
枚舉中所描述的連線的高階狀態。
ConnectionStatus.ping
目前 ping(以毫秒為單位)。
ConnectionStatus.connectionQualityLocal
在本地測量的連線品質(依序端對端傳送的資料包的百分比)。
ConnectionStatus.connectionQualityRemote
從遠端主機觀察到的遠端資料包傳送成功率。
ConnectionStatus.outPacketsPerSecond
最近歷史記錄中的當前出站資料包速率。
ConnectionStatus.outBytesPerSecond
最近歷史記錄中的當前出站資料速率。
ConnectionStatus.inPacketsPerSecond
最近歷史記錄中的當前入站資料包速率。
ConnectionStatus.inBytesPerSecond
最近歷史記錄中的目前入站資料速率。
ConnectionStatus.sendRateBytesPerSecond
估計資料傳送到對等點的速率。它可能明顯高於ConnectionStatus.outBytesPerSecond
,這意味著通道的容量高於發送的資料。
ConnectionStatus.pendingUnreliable
等待不可靠傳送的位元組數。這是最近請求發送但尚未實際發送的資料。
ConnectionStatus.pendingReliable
待可靠發送的位元組數。可靠的數字還包括先前在線傳輸但現在已安排重新傳輸的數據。因此,即使在檢查之間沒有呼叫發送可靠數據,也可以觀察到兩次檢查之間位元組的增加。等待 Nagle 延遲的數據將出現在這些數字中。
ConnectionStatus.sentUnackedReliable
已連接到線路但尚未收到確認,因此可能需要重新傳輸的可靠資料的位元組數。
包含網路身分的編組資料。
NetworkingIdentity.type
網路身分的描述。
NetworkingIdentity.IsInvalid
檢查身分是否具有無效型別。
NetworkingIdentity.GetSteamID()
取得 Steam ID。
NetworkingIdentity.SetSteamID(ulong steamID)
設定 Steam ID。
包含網路訊息的編組資料。
NetworkingMessage.identity
發送者的識別碼。
NetworkingMessage.connectionUserData
使用者提供的使用NetworkingSockets.SetConnectionUserData()
函數設定的連線資料。
NetworkingMessage.timeReceived
接收訊息時的本機時間戳記。
NetworkingMessage.messageNumber
發送者指派的訊息號碼。
NetworkingMessage.data
訊息的有效負載。
NetworkingMessage.length
有效負載的長度。
NetworkingMessage.connection
訊息來自的連線 ID。
NetworkingMessage.channel
接收訊息的頻道號碼。
NetworkingMessage.flags
用於發送訊息的標誌。
NetworkingMessage.CopyTo(byte[] destination)
將有效負載從訊息複製到目標陣列。
NetworkingMessage.Destroy()
銷毀訊息。僅當從套接字獲取訊息時才應呼叫。
包含指向套接字的託管指標。
NetworkingSockets.CreateListenSocket(ref Address address, Configuration[] configurations)
建立一個具有可選配置的套接字,並傳回一個套接字ID,該ID偵聽由NetworkingSockets.Connect()
函數發起的傳入連線。
NetworkingSockets.Connect(ref Address address, Configuration[] configurations)
使用選用設定啟動與外部主機的連線。返回本地連線 ID。
NetworkingSockets.AcceptConnection(Connection connection)
接受在偵聽套接字上接收的傳入連線。當收到連線嘗試時(可能在交換了一些基本的握手資料包以防止簡單的欺騙之後),將在ConnectionState.Connecting
狀態下建立連線介面對象,並呼叫StatusCallback()
。傳回Result
枚舉中所述的結果。
NetworkingSockets.CloseConnection(Connection connection, int reason, string debug, bool enableLinger)
與主機斷開連線並使連線句柄無效。連接上任何未讀的資料都將被丟棄。 Reason 參數是一個可選的使用者提供的程式碼,該程式碼將在另一端接收並記錄在後端分析中(如果可能)。如果原因代碼超出可接受的範圍,偵錯日誌記錄可能會指示錯誤。調試參數是一個可選的人類可讀的診斷字串,將在另一端接收並在後端分析中記錄(如果可能)。如果使用者希望將套接字置於延遲狀態,並嘗試刷新任何剩餘的已發送數據,則應啟用延遲參數,否則不會刷新可靠的數據。如果連線已經結束,則忽略原因代碼、偵錯字串和 linger 參數。成功時傳回 true,失敗時傳回 false。
NetworkingSockets.CloseListenSocket(ListenSocket socket, string remoteReason)
銷毀偵聽套接字以及透過在偵聽套接字上接受連線而產生的所有客戶端套接字。遠端原因決定了對被破壞的客戶端套接字執行哪些清理操作。如果請求清理且使用者已要求綁定到特定本機連接埠的監聽套接字以促進直接 IPv4 連接,則底層 UDP 套接字必須保持開啟狀態,直到所有用戶端都被清理。成功時傳回 true,失敗時傳回 false。
NetworkingSockets.SetConnectionUserData(Connection peer, long userData)
設定使用者為連線提供的資料。成功時傳回 true,失敗時傳回 false。
NetworkingSockets.GetConnectionUserData(Connection peer)
傳回使用者提供的數據,如果句柄無效或尚未設定任何數據,則傳回 -1。
NetworkingSockets.SetConnectionName(Connection peer, string name)
設定連接的名稱,主要用於偵錯。
NetworkingSockets.GetConnectionName(Connection peer, StringBuilder name, int maxLength)
將連線名稱取得到可變字串。成功時傳回 true,失敗時傳回 false。
NetworkingSockets.SendMessageToConnection(Connection connection, byte[] data, int length, SendFlags flags)
將訊息傳送到已連接套接字上的主機。長度和發送類型參數是可選的。可以一次指定多個標誌。傳回Result
枚舉中所述的結果。可以使用指向本機緩衝區的指標IntPtr
來取代對位元組陣列的參考。
NetworkingSockets.FlushMessagesOnConnection(Connection connection)
如果 Nagle 已啟用(預設啟用),則訊息將在發送前排隊 Nagle 時間,以將小訊息合併到同一個資料包中。呼叫此函數可刷新任何排隊的訊息並在下一次傳輸時立即發送它們。傳回Result
枚舉中所述的結果。
NetworkingSockets.ReceiveMessagesOnConnection(Connection connection, NetworkingMessage[] messages, int maxMessages)
從連接的套接字中取得下一則可用訊息。傳回一些訊息,如果連接句柄無效,則傳回 -1。數組中傳回的訊息的順序是相關的。可靠的訊息將按照發送的順序接收。如果獲得任何訊息,則應為每個訊息呼叫message.Destroy()
以釋放資源。
NetworkingSockets.GetConnectionInfo(Connection connection, ref ConnectionInfo info)
取得指定連線的資訊。成功時傳回 true,失敗時傳回 false。
NetworkingSockets.GetQuickConnectionStatus(Connection connection, ref ConnectionStatus status)
取得一組簡短的連線狀態,可以在遊戲中顯示給使用者。成功時傳回 true,失敗時傳回 false。
NetworkingSockets.GetDetailedConnectionStatus(Connection connection, StringBuilder status, int statusLength)
以可列印的形式取得詳細的連接統計資料。成功時傳回 0,失敗時傳回 -1,如果可變字串的容量不夠,則傳回 > 0。
NetworkingSockets.GetListenSocketAddress(ListenSocket socket, ref Address address)
取得偵聽套接字的本機 IP 和連接埠號碼。成功時傳回 true,失敗時傳回 false。
NetworkingSockets.CreateSocketPair(Connection connectionLeft, Connection connectionRight, bool useNetworkLoopback, ref NetworkingIdentity identityLeft, ref NetworkingIdentity identityRight)
建立一對相互通訊的連接,例如環回通訊。兩個連接將立即進入連接狀態,並且不會呼叫任何回調。此後,如果任一連接關閉,另一個連接將收到回調,就像它們透過網路進行通訊一樣。預設情況下,使用內部緩衝區,完全繞過網絡,將訊息切分成資料包,加密,複製有效負載等。啟用網路環回參數將導致套接字對透過臨時連接埠上的本機網路環回裝置發送封包。這種情況下支援假滯後和假遺失,並且CPU時間花費在加密和解密上。
NetworkingSockets.GetIdentity()
取得與套接字關聯的身分。
NetworkingSockets.CreatePollGroup()
為連線建立一個新的輪詢群組。傳回輪詢組句柄。
NetworkingSockets.DestroyPollGroup(PollGroup pollGroup)
銷毀輪詢組。如果輪詢群組中有任何連接,它們將從群組中刪除,並處於不屬於任何輪詢群組的狀態。如果傳遞了無效的輪詢組句柄,則傳回 false。
NetworkingSockets.SetConnectionPollGroup(PollGroup pollGroup, Connection connection)
將連線指派給輪詢群組。一個連線可能只屬於一個輪詢群組。將連線新增至輪詢群組會隱式地將其從任何其他輪詢群組中刪除。您可以將零值傳遞給輪詢群組參數以從目前輪詢群組中刪除連線。如果連線上目前有待處理的已接收訊息,則會嘗試將它們新增至輪詢群組的訊息佇列中,其順序大致與連線在該連線已是輪詢群組的一部分時所套用的順序相同。消息。如果連線句柄無效或輪詢群組句柄無效,則傳回 false。
NetworkingSockets.ReceiveMessagesOnPollGroup()
從輪詢群組中任何連線上的套接字取得下一個可用訊息。檢查NetworkingMessage.connection
以識別連線。不同連線之間的訊息傳遞順序通常與完成訊息的最後一個資料包的接收順序相符。但這並不是一個強有力的保證,特別是對於將連線分配給輪詢群組時正確接收的資料包。同一連線上的消息傳遞順序已明確定義,並且存在相同的保證。訊息不會按連線分組,因此它們不一定會連續出現在清單中,它們可能與其他連線的訊息交錯。傳回一些訊息,如果輪詢組句柄無效,則傳回 -1。
NetworkingSockets.RunCallbacks()
調度回呼(如果可用)。
NetworkingUtils.Dispose()
銷毀網路公用程式並清理非託管資源。
NetworkingUtils.Time
傳回目前本地單調時間(以微秒為單位)。當應用程式保持活動狀態時,它永遠不會重置。
NetworkingUtils.FirstConfigurationValue
取得目前環境中可用的最小編號設定值。
NetworkingUtils.SetStatusCallback(StatusCallback callback)
設定連接狀態更新的回呼。成功時傳回 true,失敗時傳回 false。
NetworkingUtils.SetDebugCallback(DebugType detailLevel, DebugCallback callback)
設定偵錯輸出的回呼。
NetworkingUtils.SetConfigurationValue(ConfigurationValue configurationValue, ConfigurationScope configurationScope, IntPtr scopeObject, ConfigurationDataType dataType, IntPtr value)
依據ConfigurationValue
、 ConfigurationScope
和ConfigurationDataType
個人列舉設定值。 value 參數應該是對實際值的參考。
NetworkingUtils.SetConfigurationValue(Configuration configuration, ConfigurationScope configurationScope, IntPtr scopeObject)
依據ConfigurationScope
枚舉使用Configuration
結構設定配置。
NetworkingUtils.GetConfigurationValue(ConfigurationValue configurationValue, ConfigurationScope configurationScope, IntPtr scopeObject, ref ConfigurationDataType dataType, ref IntPtr result, ref IntPtr resultLength)
根據ConfigurationValue
、refIntPtrresult, refIntPtrresultLength)根據ConfigurationValue 、 ConfigurationDataType
值和ConfigurationScope
。
包含常量欄位。
Library.maxCloseMessageLength
連線關閉時原因字串的最大長度(以位元組為單位)。
Library.maxMessageSize
可以發送的單一訊息的最大大小。
Library.Initialize(ref NetworkingIdentity identity, StringBuilder errorMessage)
將與套接字關聯的可選標識初始化本機庫。錯誤訊息參數是可選的,應用於確定初始化期間的錯誤。錯誤訊息的可變字串的容量必須等於Library.maxErrorMessageLength
。
Library.Deinitialize()
取消初始化本機函式庫。工作完成後應呼叫。