これは、移植性が高く、軽量で簡単な、メッセージ指向プロトコルの迅速な実装のためのデュアルスタック IPv4/IPv6 サポートを備えた、ゼロコストの UDP ソケットの抽象化です。このライブラリは、C、C++、C#、およびその他の言語との言語間の互換性を考慮して設計されています。 .NET 環境の場合、関数は、アンマネージ メモリ アロケーターで使用するためのマネージ型の代替として blittable ポインターをサポートします。
ネイティブ ライブラリは、GNU Make または Visual Studio で CMake を使用して構築できます。
マネージド アセンブリは、C# 4.0 以降をサポートする利用可能なコンパイル プラットフォームを使用してビルドできます。
コンパイルされたライブラリはリリース セクションから入手できます。
バイナリは、Windows、Linux、macOS (x64) などの従来のプラットフォームに対してのみ提供されます。
サポートされている OS バージョン:
作業を開始する前に、 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
ソケットハンドルを備えたブリッタブル構造が含まれています。
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 を返します。ソケットが受信準備ができている場合は 1 を返します。それ以外の場合、エラーが発生した場合は < 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)
2 つのアドレスが等しいかどうかを比較します。結果とともにステータスを返します。
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
使用できます。結果とともにステータスを返します。