이는 메시지 지향 프로토콜의 신속한 구현을 위한 듀얼 스택 IPv4/IPv6 지원을 갖춘 이식성이 뛰어나고 가볍고 간단하며 비용이 들지 않는 UDP 소켓 추상화입니다. 이 라이브러리는 C, C++, C# 및 기타 언어와의 언어 간 호환성을 위해 설계되었습니다. .NET 환경의 경우 함수는 관리되지 않는 메모리 할당자와 함께 사용하기 위해 관리되는 유형 대신 blittable 포인터를 지원합니다.
네이티브 라이브러리는 GNU Make 또는 Visual Studio와 함께 CMake를 사용하여 구축할 수 있습니다.
관리되는 어셈블리는 C# 4.0 이상을 지원하는 사용 가능한 컴파일 플랫폼을 사용하여 빌드할 수 있습니다.
릴리스 섹션에서 컴파일된 라이브러리를 가져올 수 있습니다.
바이너리는 Windows, Linux 및 macOS(x64)와 같은 기존 플랫폼에만 제공됩니다.
지원되는 OS 버전:
작업을 시작하기 전에 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 ) ;
콘솔 기능을 Unity에서 제공하는 기능으로 대체해야 한다는 점을 제외하면 사용법은 .NET 환경과 거의 동일합니다. UDP.Poll()
이 게임 루프에서 호출되는 경우 제한 시간 매개변수가 비차단을 의미하는 0으로 설정되어 있는지 확인하세요. 또한 플레이어 설정에서 적절한 옵션을 활성화하여 Unity를 백그라운드에서 계속 실행하세요.
기능의 상태 유형 정의:
OK
Error
소켓 핸들이 있는 blittable 구조를 포함합니다.
Socket.handle
소켓 핸들입니다.
Socket.IsCreated
소켓이 생성되었는지 확인합니다.
익명의 호스트 데이터와 포트 번호가 포함된 blittable 구조를 포함합니다.
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)
소켓에 대한 비차단 I/O 모드를 설정합니다. 결과와 함께 상태를 반환합니다.
UDP.SetDontFragment(Socket socket)
소켓에 대해 조각화 안 함 모드를 설정합니다. 결과와 함께 상태를 반환합니다.
UDP.Poll(Socket socket, long timeout)
소켓 상태를 결정하고 필요한 경우 대기합니다. 이 기능은 준비 지향 수신에 사용될 수 있습니다. 폴링 기간을 제어하기 위해 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
사용할 수 있습니다. 결과와 함께 상태를 반환합니다.