這是一種高度可移植、輕量級、簡單、零成本的 UDP 套接字抽象,具有雙堆疊 IPv4/IPv6 支持,可快速實現面向訊息的協定。該程式庫專為與 C、C++、C# 和其他語言的跨語言相容性而設計。對於 .NET 環境,函數支援 blittable 指標作為託管類型的替代方案,以便與非託管記憶體分配器一起使用。
可以使用 CMake 和 GNU Make 或 Visual Studio 來建立本機程式庫。
可以使用任何支援 C# 4.0 或更高版本的可用編譯平台來建立託管組件。
您可以從發布部分取得已編譯的函式庫。
僅針對傳統平台提供二進位檔案:Windows、Linux 和 macOS (x64)。
支援的作業系統版本:
在開始工作之前,應使用NanoSockets.UDP.Initialize();
功能。
工作完成後,使用NanoSockets.UDP.Deinitialize();
功能。
Socket server = UDP . Create ( 256 * 1024 , 256 * 1024 ) ;
Address listenAddress = new Address ( ) ;
listenAddress . port = port ;
if ( UDP . SetIP ( ref listenAddress , "::0" ) == Status . OK )
Console . WriteLine ( "Address set!" ) ;
if ( UDP . Bind ( server , ref listenAddress ) == 0 )
Console . WriteLine ( "Socket bound!" ) ;
if ( UDP . SetDontFragment ( server ) != Status . OK )
Console . WriteLine ( "Don't fragment option error!" ) ;
if ( UDP . SetNonBlocking ( server ) != Status . OK )
Console . WriteLine ( "Non-blocking option error!" ) ;
StringBuilder ip = new StringBuilder ( UDP . hostNameSize ) ;
Address address = new Address ( ) ;
byte [ ] buffer = new byte [ 1024 ] ;
while ( ! Console . KeyAvailable ) {
if ( UDP . Poll ( server , 15 ) > 0 ) {
int dataLength = 0 ;
while ( ( dataLength = UDP . Receive ( server , ref address , buffer , buffer . Length ) ) > 0 ) {
UDP . GetIP ( ref address , ip , ip . Capacity ) ;
Console . WriteLine ( "Message received from - IP: " + ip + ", Data length: " + dataLength ) ;
UDP . Send ( server , ref address , buffer , buffer . Length ) ;
}
}
}
UDP . Destroy ( ref server ) ;
Socket client = UDP . Create ( 256 * 1024 , 256 * 1024 ) ;
Address connectionAddress = new Address ( ) ;
connectionAddress . port = port ;
if ( UDP . SetIP ( ref connectionAddress , "::1" ) == Status . OK )
Console . WriteLine ( "Address set!" ) ;
if ( UDP . Connect ( client , ref connectionAddress ) == 0 )
Console . WriteLine ( "Socket connected!" ) ;
if ( UDP . SetDontFragment ( client ) != Status . OK )
Console . WriteLine ( "Don't fragment option error!" ) ;
if ( UDP . SetNonBlocking ( client ) != Status . OK )
Console . WriteLine ( "Non-blocking option error!" ) ;
byte [ ] buffer = new byte [ 1024 ] ;
UDP . Send ( client , IntPtr . Zero , buffer , buffer . Length ) ;
while ( ! Console . KeyAvailable ) {
if ( UDP . Poll ( client , 15 ) > 0 ) {
int dataLength = 0 ;
while ( ( dataLength = UDP . Receive ( client , IntPtr . Zero , buffer , buffer . Length ) ) > 0 ) {
Console . WriteLine ( "Message received from server - Data length: " + dataLength ) ;
UDP . Send ( client , IntPtr . Zero , buffer , buffer . Length ) ;
}
}
}
UDP . Destroy ( ref client ) ;
使用方法與.NET環境下幾乎相同,只是控制台功能必須替換為Unity提供的功能。如果將在遊戲循環中呼叫UDP.Poll()
,請確保逾時參數設為 0,這表示非阻塞。此外,透過在播放器設定中啟用適當的選項,使 Unity 在背景運行。
函數狀態類型的定義:
OK
Error
包含帶有套接字句柄的 blittable 結構。
Socket.handle
一個套接字句柄。
Socket.IsCreated
檢查套接字是否已建立。
包含具有匿名主機資料和連接埠號碼的 blittable 結構。
Address.port
連接埠號碼。
UDP.Initialize()
初始化本機函式庫。應在開始工作之前調用。返回狀態和結果。
UDP.Deinitialize()
取消初始化本機程式庫。工作完成後應呼叫。
UDP.Create(int sendBufferSize, int receiveBufferSize)
建立一個具有指定大小的緩衝區用於發送和接收的新套接字。傳回帶有句柄的Socket
結構。
UDP.Destroy(ref Socket socket)
銷毀套接字並重置句柄。
UDP.Bind(Socket socket, ref Address address)
為套接字分配一個位址。位址參數可以設定為IntPtr.Zero
讓作業系統分配任意位址。成功時回傳 0,失敗時回傳 != 0。
UDP.Connect(Socket socket, ref Address address)
將套接字連接到某個位址。成功時回傳 0,失敗時回傳 != 0。
UDP.SetOption(Socket socket, int level, int optionName, ref int optionValue, int optionLength)
設定與套接字關聯的套接字選項的目前值。此函數可用於設定預設情況下在建立套接字時未指定的特定於平台的選項。返回狀態和結果。
UDP.GetOption(Socket socket, int level, int optionName, ref int optionValue, ref int optionLength)
取得與套接字關聯的套接字選項的目前值。選項值的長度應初始設定為適當的大小。返回狀態和結果。
UDP.SetNonBlocking(Socket socket, bool shouldBlock)
為套接字設定非阻塞 I/O 模式。返回狀態和結果。
UDP.SetDontFragment(Socket socket)
設定套接字的不分段模式。返回狀態和結果。
UDP.Poll(Socket socket, long timeout)
決定套接字的狀態並在必要時等待。此功能可用於面向準備的接收。逾時參數可以以毫秒為單位指定,以控制輪詢持續時間。如果指定逾時為 0,函數將立即傳回。如果超過時間限制,它將傳回 0。
UDP.Send(Socket socket, ref Address address, byte[] buffer, int bufferLength)
將訊息傳送到接收方的指定位址。如果套接字連接到某個位址,則可以將位址參數設定為IntPtr.Zero
。可以使用指向本機緩衝區的指標IntPtr
來取代對位元組陣列的參考。傳回傳送的位元組總數,該總數可以小於緩衝區長度指示的數字。否則,如果發生錯誤,它將返回 < 0。
UDP.Receive(Socket socket, ref Address address, byte[] buffer, int bufferLength)
接收訊息並取得發送者的地址。地址參數可以設定為IntPtr.Zero
以跳過地址獲取。可以使用指向本機緩衝區的指標IntPtr
來取代對位元組陣列的參考。傳回接收到的位元組總數。否則,如果發生錯誤,它將返回 < 0。
UDP.GetAddress(Socket socket, ref Address address)
從綁定或連接的套接字取得位址。此函數對於確定作業系統已設定的本機關聯特別有用。返回狀態和結果。
UDP.IsEqual(ref Address left, ref Address right)
比較兩個位址是否相等。返回狀態和結果。
UDP.SetIP(ref Address address, string ip)
設定 IP 位址。可以使用指標IntPtr
來代替不可變字串。返回狀態和結果。
UDP.GetIP(ref Address address, StringBuilder ip, int ipLength)
取得 IP 位址。可變字串的容量應等於UDP.hostNameSize
常數欄位。可以使用指標IntPtr
來代替可變字串。返回狀態和結果。
UDP.SetHostName(ref Address address, string name)
設定主機名稱或 IP 位址。可以使用指標IntPtr
來代替不可變字串。返回狀態和結果。
UDP.GetHostName(ref Address address, StringBuilder name, int nameLength)
嘗試從地址進行反向查找。可以使用指標IntPtr
來代替可變字串。返回狀態和結果。