นี่เป็นนามธรรมของซ็อกเก็ต UDP แบบพกพา น้ำหนักเบา และตรงไปตรงมา ไม่มีค่าใช้จ่าย พร้อมการสนับสนุน IPv4/IPv6 แบบสแต็กคู่สำหรับการนำโปรโตคอลที่เน้นข้อความไปใช้อย่างรวดเร็ว ไลบรารีนี้ได้รับการออกแบบเพื่อให้เข้ากันได้กับภาษา C, C++, C# และภาษาอื่นๆ ข้ามภาษา สำหรับสภาพแวดล้อม .NET ฟังก์ชันรองรับพอยน์เตอร์แบบ blittable เป็นทางเลือกแทนประเภทที่ได้รับการจัดการสำหรับการใช้งานกับการจัดสรรหน่วยความจำที่ไม่มีการจัดการ
ไลบรารีดั้งเดิมสามารถสร้างขึ้นได้โดยใช้ 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()
จะถูกเรียกใน Game Loop ให้ตรวจสอบให้แน่ใจว่าพารามิเตอร์การหมดเวลาตั้งค่าเป็น 0 ซึ่งหมายถึงไม่มีการบล็อก นอกจากนี้ ให้ Unity ทำงานในพื้นหลังโดยเปิดใช้งานตัวเลือกที่เหมาะสมในการตั้งค่าเครื่องเล่น
คำจำกัดความของประเภทสถานะสำหรับฟังก์ชัน:
OK
Error
ประกอบด้วยโครงสร้างแบบ blittable พร้อมที่จับซ็อกเก็ต
Socket.handle
มือจับซ็อกเก็ต
Socket.IsCreated
ตรวจสอบว่ามีการสร้างซ็อกเก็ตหรือไม่
ประกอบด้วยโครงสร้างแบบ blittable พร้อมข้อมูลโฮสต์ที่ไม่ระบุชื่อและหมายเลขพอร์ต
Address.port
หมายเลขพอร์ต
UDP.Initialize()
เตรียมใช้งานไลบรารีดั้งเดิม ควรโทรแจ้งก่อนเริ่มงาน คืนสถานะพร้อมผลลัพธ์
UDP.Deinitialize()
deinitializes ไลบรารีดั้งเดิม ควรเรียกหลังเลิกงาน
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)
กำหนดสถานะของซ็อกเก็ตและรอหากจำเป็น ฟังก์ชันนี้สามารถใช้สำหรับการรับแบบเน้นความพร้อม พารามิเตอร์การหมดเวลาอาจระบุเป็นมิลลิวินาทีเพื่อควบคุมระยะเวลาการโพล หากระบุระยะหมดเวลาเป็น 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
สามารถใช้แทนสตริงที่ไม่แน่นอนได้ คืนสถานะพร้อมผลลัพธ์