Это очень портативная, легкая и простая абстракция сокетов UDP с нулевой стоимостью и поддержкой двойного стека IPv4/IPv6 для быстрой реализации протоколов, ориентированных на сообщения. Библиотека предназначена для межъязыковой совместимости с C, C++, C# и другими языками. В среде .NET функции поддерживают преобразуемые указатели в качестве альтернативы управляемым типам для использования с неуправляемым распределителем памяти.
Собственную библиотеку можно собрать с помощью CMake с GNU Make или Visual Studio.
Управляемую сборку можно собрать с использованием любой доступной платформы компиляции, поддерживающей C# 4.0 или более поздней версии.
Вы можете получить скомпилированные библиотеки из раздела релизов.
Бинарные файлы предоставляются только для традиционных платформ: Windows, Linux и macOS (x64).
Поддерживаемые версии ОС:
Перед началом работы библиотеку следует инициализировать с помощью 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
проверяет, создан ли сокет.
Содержит преобразуемую структуру с анонимными данными хоста и номером порта.
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)
устанавливает неблокирующий режим ввода-вывода для сокета. Возвращает статус с результатом.
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)
сравнивает два адреса на предмет равенства. Возвращает статус с результатом.
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
. Возвращает статус с результатом.