Dabei handelt es sich um eine äußerst portable, leichte und unkomplizierte, kostengünstige Abstraktion von UDP-Sockets mit Dual-Stack-IPv4/IPv6-Unterstützung für die schnelle Implementierung nachrichtenorientierter Protokolle. Die Bibliothek ist auf sprachübergreifende Kompatibilität mit C, C++, C# und anderen Sprachen ausgelegt. Für die .NET-Umgebung unterstützen Funktionen Blittable-Zeiger als Alternative zu verwalteten Typen für die Verwendung mit nicht verwaltetem Speicherzuweiser.
Die native Bibliothek kann mit CMake mit GNU Make oder Visual Studio erstellt werden.
Eine verwaltete Assembly kann mit jeder verfügbaren Kompilierungsplattform erstellt werden, die C# 4.0 oder höher unterstützt.
Sie können kompilierte Bibliotheken im Release-Bereich herunterladen.
Binärdateien werden nur für herkömmliche Plattformen bereitgestellt: Windows, Linux und macOS (x64).
Unterstützte Betriebssystemversionen:
Bevor mit der Arbeit begonnen wird, sollte die Bibliothek mit NanoSockets.UDP.Initialize();
Funktion.
Nachdem die Arbeit erledigt ist, deinitialisieren Sie die Bibliothek mit NanoSockets.UDP.Deinitialize();
Funktion.
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 ) ;
Die Nutzung ist fast die gleiche wie in der .NET-Umgebung, außer dass die Konsolenfunktionen durch von Unity bereitgestellte Funktionen ersetzt werden müssen. Wenn UDP.Poll()
in einer Spielschleife aufgerufen wird, stellen Sie sicher, dass der Timeout-Parameter auf 0 gesetzt ist, was bedeutet, dass es nicht blockiert. Lassen Sie Unity außerdem im Hintergrund laufen, indem Sie die entsprechende Option in den Player-Einstellungen aktivieren.
Definitionen von Statustypen für Funktionen:
OK
Error
Enthält eine brennbare Struktur mit Sockelgriff.
Socket.handle
ein Socket-Handle.
Socket.IsCreated
prüft, ob ein Socket erstellt wird.
Enthält eine blitbare Struktur mit anonymen Hostdaten und Portnummer.
Address.port
eine Portnummer.
UDP.Initialize()
initialisiert die native Bibliothek. Vor Beginn der Arbeiten anzurufen. Gibt den Status mit einem Ergebnis zurück.
UDP.Deinitialize()
deinitialisiert die native Bibliothek. Sollte nach getaner Arbeit angerufen werden.
UDP.Create(int sendBufferSize, int receiveBufferSize)
erstellt einen neuen Socket mit einer angegebenen Puffergröße zum Senden und Empfangen. Gibt die Socket
-Struktur mit dem Handle zurück.
UDP.Destroy(ref Socket socket)
zerstört einen Socket und setzt das Handle zurück.
UDP.Bind(Socket socket, ref Address address)
weist einem Socket eine Adresse zu. Der Adressparameter kann auf IntPtr.Zero
gesetzt werden, damit das Betriebssystem eine beliebige Adresse zuweisen kann. Gibt 0 bei Erfolg oder != 0 bei Fehler zurück.
UDP.Connect(Socket socket, ref Address address)
verbindet einen Socket mit einer Adresse. Gibt 0 bei Erfolg oder != 0 bei Fehler zurück.
UDP.SetOption(Socket socket, int level, int optionName, ref int optionValue, int optionLength)
legt den aktuellen Wert für eine Socket-Option fest, die einem Socket zugeordnet ist. Mit dieser Funktion können plattformspezifische Optionen festgelegt werden, die bei der Socket-Erstellung nicht standardmäßig angegeben wurden. Gibt den Status mit einem Ergebnis zurück.
UDP.GetOption(Socket socket, int level, int optionName, ref int optionValue, ref int optionLength)
ruft den aktuellen Wert für eine Socket-Option ab, die einem Socket zugeordnet ist. Die Länge eines Optionswerts sollte zunächst auf eine geeignete Größe eingestellt werden. Gibt den Status mit einem Ergebnis zurück.
UDP.SetNonBlocking(Socket socket, bool shouldBlock)
legt einen nicht blockierenden E/A-Modus für einen Socket fest. Gibt den Status mit einem Ergebnis zurück.
UDP.SetDontFragment(Socket socket)
legt einen Nicht-Fragment-Modus für einen Socket fest. Gibt den Status mit einem Ergebnis zurück.
UDP.Poll(Socket socket, long timeout)
ermittelt den Status eines Sockets und wartet bei Bedarf. Diese Funktion kann zum bereitschaftsorientierten Empfangen genutzt werden. Der Timeout-Parameter kann in Millisekunden angegeben werden, um die Abfragedauer zu steuern. Wenn ein Timeout von 0 angegeben ist, kehrt diese Funktion sofort zurück. Wenn das Zeitlimit abgelaufen ist, wird 0 zurückgegeben. Wenn ein Socket zum Empfang bereit ist, wird 1 zurückgegeben. Andernfalls wird < 0 zurückgegeben, wenn ein Fehler aufgetreten ist.
UDP.Send(Socket socket, ref Address address, byte[] buffer, int bufferLength)
sendet eine Nachricht an die angegebene Adresse eines Empfängers. Der Adressparameter kann auf IntPtr.Zero
gesetzt werden, wenn ein Socket mit einer Adresse verbunden ist. Anstelle eines Verweises auf ein Byte-Array kann ein Zeiger IntPtr
auf einen nativen Puffer verwendet werden. Gibt die Gesamtzahl der gesendeten Bytes zurück, die kleiner sein kann als die durch die Pufferlänge angegebene Zahl. Andernfalls wird < 0 zurückgegeben, wenn ein Fehler aufgetreten ist.
UDP.Receive(Socket socket, ref Address address, byte[] buffer, int bufferLength)
empfängt eine Nachricht und erhält die Adresse eines Absenders. Der Adressparameter kann auf IntPtr.Zero
gesetzt werden, um den Adressabruf zu überspringen. Anstelle eines Verweises auf ein Byte-Array kann ein Zeiger IntPtr
auf einen nativen Puffer verwendet werden. Gibt die Gesamtzahl der empfangenen Bytes zurück. Andernfalls wird < 0 zurückgegeben, wenn ein Fehler aufgetreten ist.
UDP.GetAddress(Socket socket, ref Address address)
ruft eine Adresse von einem gebundenen oder verbundenen Socket ab. Diese Funktion ist besonders nützlich, um die vom Betriebssystem festgelegte lokale Zuordnung zu ermitteln. Gibt den Status mit einem Ergebnis zurück.
UDP.IsEqual(ref Address left, ref Address right)
vergleicht zwei Adressen auf Gleichheit. Gibt den Status mit einem Ergebnis zurück.
UDP.SetIP(ref Address address, string ip)
legt eine IP-Adresse fest. Anstelle der unveränderlichen Zeichenfolge kann ein Zeiger IntPtr
verwendet werden. Gibt den Status mit einem Ergebnis zurück.
UDP.GetIP(ref Address address, StringBuilder ip, int ipLength)
ruft eine IP-Adresse ab. Die Kapazität der veränderlichen Zeichenfolge sollte dem Konstantenfeld UDP.hostNameSize
entsprechen. Anstelle des veränderlichen Strings kann ein Zeiger IntPtr
verwendet werden. Gibt den Status mit einem Ergebnis zurück.
UDP.SetHostName(ref Address address, string name)
legt den Hostnamen oder eine IP-Adresse fest. Anstelle der unveränderlichen Zeichenfolge kann ein Zeiger IntPtr
verwendet werden. Gibt den Status mit einem Ergebnis zurück.
UDP.GetHostName(ref Address address, StringBuilder name, int nameLength)
versucht, eine umgekehrte Suche von der Adresse durchzuführen. Anstelle des veränderlichen Strings kann ein Zeiger IntPtr
verwendet werden. Gibt den Status mit einem Ergebnis zurück.