Il s'agit d'une abstraction de sockets UDP hautement portable, légère et simple, sans coût, avec prise en charge IPv4/IPv6 double pile pour une mise en œuvre rapide de protocoles orientés messages. La bibliothèque est conçue pour une compatibilité multilingue avec C, C++, C# et d'autres langages. Pour l'environnement .NET, les fonctions prennent en charge les pointeurs blittables comme alternative aux types gérés pour une utilisation avec un allocateur de mémoire non géré.
La bibliothèque native peut être créée à l'aide de CMake avec GNU Make ou Visual Studio.
Un assembly managé peut être créé à l’aide de n’importe quelle plate-forme de compilation disponible prenant en charge C# 4.0 ou version ultérieure.
Vous pouvez récupérer les bibliothèques compilées dans la section des versions.
Les binaires sont fournis uniquement pour les plateformes traditionnelles : Windows, Linux et macOS (x64).
Versions du système d'exploitation prises en charge :
Avant de commencer à travailler, la bibliothèque doit être initialisée à l'aide de NanoSockets.UDP.Initialize();
fonction.
Une fois le travail terminé, désinitialisez la bibliothèque en utilisant NanoSockets.UDP.Deinitialize();
fonction.
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 ) ;
L'utilisation est quasiment la même que dans l'environnement .NET, sauf que les fonctions de la console doivent être remplacées par des fonctions fournies par Unity. Si UDP.Poll()
sera appelé dans une boucle de jeu, assurez-vous que le paramètre timeout est défini sur 0, ce qui signifie non bloquant. Gardez également Unity exécuté en arrière-plan en activant l'option appropriée dans les paramètres du lecteur.
Définitions des types de statut pour les fonctions :
OK
Error
Contient une structure blittable avec poignée à douille.
Socket.handle
une poignée de socket.
Socket.IsCreated
vérifie si un socket est créé.
Contient une structure blittable avec des données d'hôte anonymes et un numéro de port.
Address.port
un numéro de port.
UDP.Initialize()
initialise la bibliothèque native. Doit être appelé avant de commencer les travaux. Renvoie le statut avec un résultat.
UDP.Deinitialize()
désinitialise la bibliothèque native. Doit être appelé une fois les travaux terminés.
UDP.Create(int sendBufferSize, int receiveBufferSize)
crée un nouveau socket avec une taille spécifiée de tampons pour l'envoi et la réception. Renvoie la structure Socket
avec le handle.
UDP.Destroy(ref Socket socket)
détruit un socket et réinitialise le handle.
UDP.Bind(Socket socket, ref Address address)
attribue une adresse à un socket. Le paramètre d'adresse peut être défini sur IntPtr.Zero
pour permettre au système d'exploitation d'attribuer n'importe quelle adresse. Renvoie 0 en cas de succès ou != 0 en cas d'échec.
UDP.Connect(Socket socket, ref Address address)
connecte un socket à une adresse. Renvoie 0 en cas de succès ou != 0 en cas d'échec.
UDP.SetOption(Socket socket, int level, int optionName, ref int optionValue, int optionLength)
définit la valeur actuelle d'une option de socket associée à un socket. Cette fonction peut être utilisée pour définir des options spécifiques à la plate-forme qui n'ont pas été spécifiées par défaut lors de la création du socket. Renvoie le statut avec un résultat.
UDP.GetOption(Socket socket, int level, int optionName, ref int optionValue, ref int optionLength)
obtient la valeur actuelle d'une option de socket associée à un socket. La longueur d'une valeur d'option doit être initialement définie sur une taille appropriée. Renvoie le statut avec un résultat.
UDP.SetNonBlocking(Socket socket, bool shouldBlock)
définit un mode d'E/S non bloquant pour un socket. Renvoie le statut avec un résultat.
UDP.SetDontFragment(Socket socket)
définit un mode de non-fragmentation pour un socket. Renvoie le statut avec un résultat.
UDP.Poll(Socket socket, long timeout)
détermine l'état d'un socket et attend si nécessaire. Cette fonction peut être utilisée pour une réception orientée vers la disponibilité. Le paramètre timeout peut être spécifié en millisecondes pour contrôler la durée de l'interrogation. Si un délai d'attente de 0 est spécifié, cette fonction sera renvoyée immédiatement. Si le délai a expiré, il renverra 0. Si un socket est prêt à recevoir, il renverra 1. Sinon, il renverra <0 si une erreur s'est produite.
UDP.Send(Socket socket, ref Address address, byte[] buffer, int bufferLength)
envoie un message à l'adresse spécifiée d'un récepteur. Le paramètre d'adresse peut être défini sur IntPtr.Zero
si un socket est connecté à une adresse. Un pointeur IntPtr
vers un tampon natif peut être utilisé à la place d'une référence à un tableau d'octets. Renvoie le nombre total d'octets envoyés, qui peut être inférieur au nombre indiqué par la longueur du tampon. Sinon, il renverra <0 si une erreur s'est produite.
UDP.Receive(Socket socket, ref Address address, byte[] buffer, int bufferLength)
reçoit un message et obtient l'adresse d'un expéditeur. Le paramètre d'adresse peut être défini sur IntPtr.Zero
pour ignorer l'obtention de l'adresse. Un pointeur IntPtr
vers un tampon natif peut être utilisé à la place d'une référence à un tableau d'octets. Renvoie le nombre total d'octets reçus. Sinon, il renverra <0 si une erreur s'est produite.
UDP.GetAddress(Socket socket, ref Address address)
obtient une adresse à partir d'un socket lié ou connecté. Cette fonction est particulièrement utile pour déterminer l'association locale définie par le système d'exploitation. Renvoie le statut avec un résultat.
UDP.IsEqual(ref Address left, ref Address right)
compare deux adresses pour vérifier leur égalité. Renvoie le statut avec un résultat.
UDP.SetIP(ref Address address, string ip)
définit une adresse IP. Un pointeur IntPtr
peut être utilisé à la place de la chaîne immuable. Renvoie le statut avec un résultat.
UDP.GetIP(ref Address address, StringBuilder ip, int ipLength)
obtient une adresse IP. La capacité de la chaîne mutable doit être égale au champ constant UDP.hostNameSize
. Un pointeur IntPtr
peut être utilisé à la place de la chaîne mutable. Renvoie le statut avec un résultat.
UDP.SetHostName(ref Address address, string name)
définit le nom d'hôte ou une adresse IP. Un pointeur IntPtr
peut être utilisé à la place de la chaîne immuable. Renvoie le statut avec un résultat.
UDP.GetHostName(ref Address address, StringBuilder name, int nameLength)
tente d'effectuer une recherche inversée à partir de l'adresse. Un pointeur IntPtr
peut être utilisé à la place de la chaîne mutable. Renvoie le statut avec un résultat.