Se trata de una abstracción de sockets UDP altamente portátil, liviana, sencilla y de costo cero con soporte IPv4/IPv6 de doble pila para una implementación rápida de protocolos orientados a mensajes. La biblioteca está diseñada para ofrecer compatibilidad entre idiomas con C, C++, C# y otros lenguajes. Para el entorno .NET, las funciones admiten punteros que se pueden borrar como alternativa a los tipos administrados para su uso con un asignador de memoria no administrado.
La biblioteca nativa se puede crear usando CMake con GNU Make o Visual Studio.
Se puede crear un ensamblado administrado utilizando cualquier plataforma de compilación disponible que admita C# 4.0 o superior.
Puede obtener bibliotecas compiladas desde la sección de lanzamiento.
Los binarios se proporcionan únicamente para plataformas tradicionales: Windows, Linux y macOS (x64).
Versiones de sistema operativo compatibles:
Antes de comenzar a trabajar, la biblioteca debe inicializarse usando NanoSockets.UDP.Initialize();
función.
Una vez finalizado el trabajo, desinicialice la biblioteca utilizando NanoSockets.UDP.Deinitialize();
función.
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 ) ;
El uso es casi el mismo que en el entorno .NET, excepto que las funciones de la consola deben reemplazarse con funciones proporcionadas por Unity. Si se llamará a UDP.Poll()
en un bucle de juego, asegúrese de que el parámetro de tiempo de espera esté establecido en 0, lo que significa que no es bloqueo. Además, mantenga Unity ejecutándose en segundo plano habilitando la opción adecuada en la configuración del reproductor.
Definiciones de tipos de estado para funciones:
OK
Error
Contiene una estructura plegable con mango de encaje.
Socket.handle
un mango de enchufe.
Socket.IsCreated
comprueba si se crea un socket.
Contiene una estructura que se puede borrar con datos de host anónimos y número de puerto.
Address.port
un número de puerto.
UDP.Initialize()
inicializa la biblioteca nativa. Se debe llamar antes de iniciar el trabajo. Devuelve el estado con un resultado.
UDP.Deinitialize()
desinicializa la biblioteca nativa. Se debe llamar una vez finalizado el trabajo.
UDP.Create(int sendBufferSize, int receiveBufferSize)
crea un nuevo socket con un tamaño específico de búfer para enviar y recibir. Devuelve la estructura Socket
con el identificador.
UDP.Destroy(ref Socket socket)
destruye un socket y restablece el mango.
UDP.Bind(Socket socket, ref Address address)
asigna una dirección a un socket. El parámetro de dirección se puede configurar en IntPtr.Zero
para permitir que el sistema operativo asigne cualquier dirección. Devuelve 0 en caso de éxito o != 0 en caso de error.
UDP.Connect(Socket socket, ref Address address)
conecta un socket a una dirección. Devuelve 0 en caso de éxito o != 0 en caso de error.
UDP.SetOption(Socket socket, int level, int optionName, ref int optionValue, int optionLength)
establece el valor actual para una opción de socket asociada con un socket. Esta función se puede utilizar para configurar opciones específicas de la plataforma que no se especificaron de forma predeterminada en la creación del socket. Devuelve el estado con un resultado.
UDP.GetOption(Socket socket, int level, int optionName, ref int optionValue, ref int optionLength)
obtiene el valor actual de una opción de socket asociada con un socket. La longitud de un valor de opción debe establecerse inicialmente en un tamaño apropiado. Devuelve el estado con un resultado.
UDP.SetNonBlocking(Socket socket, bool shouldBlock)
establece un modo de E/S sin bloqueo para un socket. Devuelve el estado con un resultado.
UDP.SetDontFragment(Socket socket)
establece un modo de no fragmentar para un socket. Devuelve el estado con un resultado.
UDP.Poll(Socket socket, long timeout)
determina el estado de un socket y espera si es necesario. Esta función se puede utilizar para la recepción orientada a la preparación. El parámetro de tiempo de espera se puede especificar en milisegundos para controlar la duración del sondeo. Si se especifica un tiempo de espera de 0, esta función volverá inmediatamente. Si el límite de tiempo expiró, devolverá 0. Si un socket está listo para recibir, devolverá 1. De lo contrario, devolverá <0 si se produjo un error.
UDP.Send(Socket socket, ref Address address, byte[] buffer, int bufferLength)
envía un mensaje a la dirección especificada de un receptor. El parámetro de dirección se puede configurar en IntPtr.Zero
si un socket está conectado a una dirección. Se puede utilizar un puntero IntPtr
a un búfer nativo en lugar de una referencia a una matriz de bytes. Devuelve el número total de bytes enviados, que puede ser menor que el número indicado por la longitud del búfer. De lo contrario, devolverá <0 si se produjo un error.
UDP.Receive(Socket socket, ref Address address, byte[] buffer, int bufferLength)
recibe un mensaje y obtiene la dirección de un remitente. El parámetro de dirección se puede configurar en IntPtr.Zero
para omitir la obtención de la dirección. Se puede utilizar un puntero IntPtr
a un búfer nativo en lugar de una referencia a una matriz de bytes. Devuelve el número total de bytes recibidos. De lo contrario, devolverá <0 si se produjo un error.
UDP.GetAddress(Socket socket, ref Address address)
obtiene una dirección de un socket vinculado o conectado. Esta función es especialmente útil para determinar la asociación local que ha establecido el sistema operativo. Devuelve el estado con un resultado.
UDP.IsEqual(ref Address left, ref Address right)
compara dos direcciones para determinar la igualdad. Devuelve el estado con un resultado.
UDP.SetIP(ref Address address, string ip)
establece una dirección IP. Se puede utilizar un puntero IntPtr
en lugar de la cadena inmutable. Devuelve el estado con un resultado.
UDP.GetIP(ref Address address, StringBuilder ip, int ipLength)
obtiene una dirección IP. La capacidad de la cadena mutable debe ser igual al campo constante UDP.hostNameSize
. Se puede utilizar un puntero IntPtr
en lugar de la cadena mutable. Devuelve el estado con un resultado.
UDP.SetHostName(ref Address address, string name)
establece el nombre de host o una dirección IP. Se puede utilizar un puntero IntPtr
en lugar de la cadena inmutable. Devuelve el estado con un resultado.
UDP.GetHostName(ref Address address, StringBuilder name, int nameLength)
intenta realizar una búsqueda inversa desde la dirección. Se puede utilizar un puntero IntPtr
en lugar de la cadena mutable. Devuelve el estado con un resultado.