Esta é uma abstração de soquetes UDP altamente portátil, leve e direta, de custo zero, com suporte IPv4/IPv6 de pilha dupla para implementação rápida de protocolos orientados a mensagens. A biblioteca foi projetada para compatibilidade entre linguagens com C, C++, C# e outras linguagens. Para ambiente .NET, as funções suportam ponteiros blittable como uma alternativa aos tipos gerenciados para uso com alocador de memória não gerenciado.
A biblioteca nativa pode ser construída usando CMake com GNU Make ou Visual Studio.
Um assembly gerenciado pode ser criado usando qualquer plataforma de compilação disponível que suporte C# 4.0 ou superior.
Você pode obter bibliotecas compiladas na seção de lançamento.
Os binários são fornecidos apenas para plataformas tradicionais: Windows, Linux e macOS (x64).
Versões de sistema operacional suportadas:
Antes de começar a trabalhar, a biblioteca deve ser inicializada usando NanoSockets.UDP.Initialize();
função.
Após a conclusão do trabalho, desinicialize a biblioteca usando NanoSockets.UDP.Deinitialize();
função.
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 ) ;
O uso é quase o mesmo do ambiente .NET, exceto que as funções do console devem ser substituídas por funções fornecidas pelo Unity. Se UDP.Poll()
for chamado em um loop de jogo, certifique-se de que o parâmetro timeout esteja definido como 0, o que significa não bloqueio. Além disso, mantenha o Unity rodando em segundo plano ativando a opção apropriada nas configurações do player.
Definições de tipos de status para funções:
OK
Error
Contém uma estrutura que pode ser quebrada com alça de soquete.
Socket.handle
um identificador de soquete.
Socket.IsCreated
verifica se um soquete foi criado.
Contém uma estrutura blittable com dados de host anônimos e número de porta.
Address.port
um número de porta.
UDP.Initialize()
inicializa a biblioteca nativa. Deve ser chamado antes de iniciar o trabalho. Retorna o status com um resultado.
UDP.Deinitialize()
desinicializa a biblioteca nativa. Deve ser chamado após a conclusão do trabalho.
UDP.Create(int sendBufferSize, int receiveBufferSize)
cria um novo soquete com um tamanho especificado de buffers para envio e recebimento. Retorna a estrutura Socket
com o identificador.
UDP.Destroy(ref Socket socket)
destrói um soquete e redefine o identificador.
UDP.Bind(Socket socket, ref Address address)
atribui um endereço a um soquete. O parâmetro de endereço pode ser definido como IntPtr.Zero
para permitir que o sistema operacional atribua qualquer endereço. Retorna 0 em caso de sucesso ou! = 0 em caso de falha.
UDP.Connect(Socket socket, ref Address address)
conecta um soquete a um endereço. Retorna 0 em caso de sucesso ou! = 0 em caso de falha.
UDP.SetOption(Socket socket, int level, int optionName, ref int optionValue, int optionLength)
define o valor atual para uma opção de soquete associada a um soquete. Esta função pode ser usada para definir opções específicas da plataforma que não foram especificadas na criação do soquete por padrão. Retorna o status com um resultado.
UDP.GetOption(Socket socket, int level, int optionName, ref int optionValue, ref int optionLength)
obtém o valor atual para uma opção de soquete associada a um soquete. O comprimento de um valor de opção deve ser inicialmente definido para um tamanho apropriado. Retorna o status com um resultado.
UDP.SetNonBlocking(Socket socket, bool shouldBlock)
define um modo de E/S sem bloqueio para um soquete. Retorna o status com um resultado.
UDP.SetDontFragment(Socket socket)
define um modo de não fragmentação para um soquete. Retorna o status com um resultado.
UDP.Poll(Socket socket, long timeout)
determina o status de um soquete e aguarda, se necessário. Esta função pode ser usada para recepção orientada para prontidão. O parâmetro timeout pode ser especificado em milissegundos para controlar a duração da pesquisa. Se um tempo limite 0 for especificado, esta função retornará imediatamente. Se o limite de tempo expirou, retornará 0. Se um soquete estiver pronto para receber, retornará 1. Caso contrário, retornará <0 se ocorrer um erro.
UDP.Send(Socket socket, ref Address address, byte[] buffer, int bufferLength)
envia uma mensagem para o endereço especificado de um receptor. O parâmetro address pode ser definido como IntPtr.Zero
se um soquete estiver conectado a um endereço. Um ponteiro IntPtr
para um buffer nativo pode ser usado em vez de uma referência a uma matriz de bytes. Retorna o número total de bytes enviados, que pode ser menor que o número indicado pelo comprimento do buffer. Caso contrário, retornará <0 se ocorrer um erro.
UDP.Receive(Socket socket, ref Address address, byte[] buffer, int bufferLength)
recebe uma mensagem e obtém o endereço de um remetente. O parâmetro address pode ser definido como IntPtr.Zero
para ignorar a obtenção do endereço. Um ponteiro IntPtr
para um buffer nativo pode ser usado em vez de uma referência a uma matriz de bytes. Retorna o número total de bytes recebidos. Caso contrário, retornará <0 se ocorrer um erro.
UDP.GetAddress(Socket socket, ref Address address)
obtém um endereço de um soquete vinculado ou conectado. Esta função é especialmente útil para determinar a associação local definida pelo sistema operacional. Retorna o status com um resultado.
UDP.IsEqual(ref Address left, ref Address right)
compara dois endereços quanto à igualdade. Retorna o status com um resultado.
UDP.SetIP(ref Address address, string ip)
define um endereço IP. Um ponteiro IntPtr
pode ser usado em vez da string imutável. Retorna o status com um resultado.
UDP.GetIP(ref Address address, StringBuilder ip, int ipLength)
obtém um endereço IP. A capacidade da string mutável deve ser igual ao campo constante UDP.hostNameSize
. Um ponteiro IntPtr
pode ser usado em vez da string mutável. Retorna o status com um resultado.
UDP.SetHostName(ref Address address, string name)
define o nome do host ou um endereço IP. Um ponteiro IntPtr
pode ser usado em vez da string imutável. Retorna o status com um resultado.
UDP.GetHostName(ref Address address, StringBuilder name, int nameLength)
tenta fazer uma pesquisa reversa a partir do endereço. Um ponteiro IntPtr
pode ser usado em vez da string mutável. Retorna o status com um resultado.