Ini adalah abstraksi soket UDP yang sangat portabel, ringan dan lugas, tanpa biaya dengan dukungan dual-stack IPv4/IPv6 untuk implementasi cepat protokol berorientasi pesan. Pustaka ini dirancang untuk kompatibilitas lintas bahasa dengan C, C++, C#, dan bahasa lainnya. Untuk lingkungan .NET, fungsi mendukung pointer blittable sebagai alternatif tipe terkelola untuk penggunaan dengan pengalokasi memori tidak terkelola.
Perpustakaan asli dapat dibangun menggunakan CMake dengan GNU Make atau Visual Studio.
Rakitan terkelola dapat dibuat menggunakan platform kompilasi apa pun yang tersedia yang mendukung C# 4.0 atau lebih tinggi.
Anda dapat mengambil perpustakaan yang dikompilasi dari bagian rilis.
Biner hanya disediakan untuk platform tradisional: Windows, Linux, dan macOS (x64).
Versi OS yang didukung:
Sebelum mulai bekerja, perpustakaan harus diinisialisasi menggunakan NanoSockets.UDP.Initialize();
fungsi.
Setelah pekerjaan selesai, deinisialisasi perpustakaan menggunakan NanoSockets.UDP.Deinitialize();
fungsi.
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 ) ;
Penggunaannya hampir sama dengan di lingkungan .NET, hanya saja fungsi konsol harus diganti dengan fungsi yang disediakan oleh Unity. Jika UDP.Poll()
akan dipanggil dalam game loop, pastikan parameter batas waktu disetel ke 0 yang berarti non-pemblokiran. Selain itu, tetap jalankan Unity di latar belakang dengan mengaktifkan opsi yang sesuai di pengaturan pemutar.
Definisi tipe status untuk fungsi:
OK
Error
Berisi struktur blittable dengan pegangan soket.
Socket.handle
pegangan soket.
Socket.IsCreated
memeriksa apakah soket telah dibuat.
Berisi struktur blittable dengan data host anonim dan nomor port.
Address.port
nomor port.
UDP.Initialize()
menginisialisasi perpustakaan asli. Harus dipanggil sebelum memulai pekerjaan. Mengembalikan status dengan hasil.
UDP.Deinitialize()
mendeinisialisasi perpustakaan asli. Harus dipanggil setelah pekerjaan selesai.
UDP.Create(int sendBufferSize, int receiveBufferSize)
membuat soket baru dengan ukuran buffer tertentu untuk mengirim dan menerima. Mengembalikan struktur Socket
dengan pegangan.
UDP.Destroy(ref Socket socket)
menghancurkan soket dan mengatur ulang pegangannya.
UDP.Bind(Socket socket, ref Address address)
memberikan alamat ke soket. Parameter alamat dapat diatur ke IntPtr.Zero
agar sistem operasi dapat menetapkan alamat apa pun. Mengembalikan 0 jika berhasil atau != 0 jika gagal.
UDP.Connect(Socket socket, ref Address address)
menghubungkan soket ke suatu alamat. Mengembalikan 0 jika berhasil atau != 0 jika gagal.
UDP.SetOption(Socket socket, int level, int optionName, ref int optionValue, int optionLength)
menetapkan nilai saat ini untuk opsi soket yang terkait dengan soket. Fungsi ini dapat digunakan untuk mengatur opsi spesifik platform yang tidak ditentukan saat pembuatan soket secara default. Mengembalikan status dengan hasil.
UDP.GetOption(Socket socket, int level, int optionName, ref int optionValue, ref int optionLength)
mendapatkan nilai saat ini untuk opsi soket yang terkait dengan soket. Panjang nilai opsi pada awalnya harus ditetapkan ke ukuran yang sesuai. Mengembalikan status dengan hasil.
UDP.SetNonBlocking(Socket socket, bool shouldBlock)
menyetel mode I/O non-pemblokiran untuk sebuah soket. Mengembalikan status dengan hasil.
UDP.SetDontFragment(Socket socket)
menyetel mode jangan fragmentasi untuk soket. Mengembalikan status dengan hasil.
UDP.Poll(Socket socket, long timeout)
menentukan status soket dan menunggu jika perlu. Fungsi ini dapat digunakan untuk penerimaan yang berorientasi pada kesiapan. Parameter batas waktu dapat ditentukan dalam milidetik untuk mengontrol durasi pemungutan suara. Jika batas waktu 0 ditentukan, fungsi ini akan segera kembali. Jika batas waktu habis maka akan kembali 0. Jika soket siap menerima maka akan kembali 1. Jika tidak, maka akan kembali <0 jika terjadi kesalahan.
UDP.Send(Socket socket, ref Address address, byte[] buffer, int bufferLength)
mengirimkan pesan ke alamat penerima yang ditentukan. Parameter alamat dapat diatur ke IntPtr.Zero
jika soket terhubung ke suatu alamat. Pointer IntPtr
ke buffer asli dapat digunakan sebagai pengganti referensi ke array byte. Mengembalikan jumlah total byte yang dikirim, yang bisa kurang dari jumlah yang ditunjukkan oleh panjang buffer. Jika tidak, ia akan mengembalikan <0 jika terjadi kesalahan.
UDP.Receive(Socket socket, ref Address address, byte[] buffer, int bufferLength)
menerima pesan dan mendapatkan alamat pengirim. Parameter alamat dapat diatur ke IntPtr.Zero
untuk melewati perolehan alamat. Pointer IntPtr
ke buffer asli dapat digunakan sebagai pengganti referensi ke array byte. Mengembalikan jumlah total byte yang diterima. Jika tidak, ia akan mengembalikan <0 jika terjadi kesalahan.
UDP.GetAddress(Socket socket, ref Address address)
mendapat alamat dari soket yang terikat atau terhubung. Fungsi ini sangat berguna untuk menentukan asosiasi lokal yang telah ditetapkan oleh sistem operasi. Mengembalikan status dengan hasil.
UDP.IsEqual(ref Address left, ref Address right)
membandingkan dua alamat untuk kesetaraan. Mengembalikan status dengan hasil.
UDP.SetIP(ref Address address, string ip)
menetapkan alamat IP. Pointer IntPtr
dapat digunakan sebagai pengganti string yang tidak dapat diubah. Mengembalikan status dengan hasil.
UDP.GetIP(ref Address address, StringBuilder ip, int ipLength)
mendapat alamat IP. Kapasitas string yang dapat diubah harus sama dengan bidang konstan UDP.hostNameSize
. Pointer IntPtr
dapat digunakan sebagai pengganti string yang bisa diubah. Mengembalikan status dengan hasil.
UDP.SetHostName(ref Address address, string name)
menetapkan nama host atau alamat IP. Pointer IntPtr
dapat digunakan sebagai pengganti string yang tidak dapat diubah. Mengembalikan status dengan hasil.
UDP.GetHostName(ref Address address, StringBuilder name, int nameLength)
mencoba melakukan pencarian terbalik dari alamat tersebut. Pointer IntPtr
dapat digunakan sebagai pengganti string yang bisa diubah. Mengembalikan status dengan hasil.