นี่คือการใช้งาน ENet อิสระพร้อมโปรโตคอลที่ได้รับการแก้ไขสำหรับ C, C++, C# และภาษาอื่นๆ
คุณสมบัติ:
โปรดอ่านข้อผิดพลาดทั่วไปเพื่อดูว่ามีอะไรผิดพลาดได้บ้าง
ในการสร้างไลบรารี่ดั้งเดิมจำเป็นต้องมีซอฟต์แวร์ที่เหมาะสม:
สำหรับแพลตฟอร์มเดสก์ท็อป CMake ด้วย GNU Make หรือ Visual Studio
สำหรับแพลตฟอร์มมือถือ NDK สำหรับ Android และ Xcode สำหรับ iOS ตรวจสอบให้แน่ใจว่าไลบรารีที่คอมไพล์แล้วทั้งหมดถูกกำหนดให้กับแพลตฟอร์มและสถาปัตยกรรม CPU ที่เหมาะสม
หากต้องการสร้างไลบรารีสำหรับ Nintendo Switch ให้ทำตามคำแนะนำนี้
สามารถสร้างแอสเซมบลีที่มีการจัดการได้โดยใช้แพลตฟอร์มการคอมไพล์ที่มีอยู่ซึ่งรองรับ C# 3.0 หรือสูงกว่า
คุณสามารถคว้าไลบรารีที่คอมไพล์แล้วได้จากส่วนการเผยแพร่หรือจาก NuGet:
ENet-CSharp
มีแอสเซมบลีที่คอมไพล์แล้วพร้อมไลบรารีดั้งเดิมสำหรับสภาพแวดล้อม .NET (.NET Standard 2.1)
ENet-Unity
มีสคริปต์พร้อมไลบรารีดั้งเดิมสำหรับ Unity
ขอแนะนำอย่างยิ่งให้ลบโฟลเดอร์ที่มีไบนารีแทนที่จะแทนที่เพื่ออัปเกรด
แพ็คเกจเหล่านี้มีให้สำหรับแพลตฟอร์มดั้งเดิมเท่านั้น: Windows, Linux และ macOS (x64)
เวอร์ชันระบบปฏิบัติการที่รองรับ:
ก่อนที่จะเริ่มทำงาน ควรเตรียมใช้งานไลบรารีโดยใช้ ENet.Library.Initialize();
การทำงาน.
หลังจากงานเสร็จสิ้น ให้ยกเลิกการเริ่มต้นไลบรารีโดยใช้ ENet.Library.Deinitialize();
การทำงาน.
using ( Host server = new Host ( ) ) {
Address address = new Address ( ) ;
address . Port = port ;
server . Create ( address , maxClients ) ;
Event netEvent ;
while ( ! Console . KeyAvailable ) {
bool polled = false ;
while ( ! polled ) {
if ( server . CheckEvents ( out netEvent ) <= 0 ) {
if ( server . Service ( 15 , out netEvent ) <= 0 )
break ;
polled = true ;
}
switch ( netEvent . Type ) {
case EventType . None :
break ;
case EventType . Connect :
Console . WriteLine ( "Client connected - ID: " + netEvent . Peer . ID + ", IP: " + netEvent . Peer . IP ) ;
break ;
case EventType . Disconnect :
Console . WriteLine ( "Client disconnected - ID: " + netEvent . Peer . ID + ", IP: " + netEvent . Peer . IP ) ;
break ;
case EventType . Timeout :
Console . WriteLine ( "Client timeout - ID: " + netEvent . Peer . ID + ", IP: " + netEvent . Peer . IP ) ;
break ;
case EventType . Receive :
Console . WriteLine ( "Packet received from - ID: " + netEvent . Peer . ID + ", IP: " + netEvent . Peer . IP + ", Channel ID: " + netEvent . ChannelID + ", Data length: " + netEvent . Packet . Length ) ;
netEvent . Packet . Dispose ( ) ;
break ;
}
}
}
server . Flush ( ) ;
}
using ( Host client = new Host ( ) ) {
Address address = new Address ( ) ;
address . SetHost ( ip ) ;
address . Port = port ;
client . Create ( ) ;
Peer peer = client . Connect ( address ) ;
Event netEvent ;
while ( ! Console . KeyAvailable ) {
bool polled = false ;
while ( ! polled ) {
if ( client . CheckEvents ( out netEvent ) <= 0 ) {
if ( client . Service ( 15 , out netEvent ) <= 0 )
break ;
polled = true ;
}
switch ( netEvent . Type ) {
case EventType . None :
break ;
case EventType . Connect :
Console . WriteLine ( "Client connected to server" ) ;
break ;
case EventType . Disconnect :
Console . WriteLine ( "Client disconnected from server" ) ;
break ;
case EventType . Timeout :
Console . WriteLine ( "Client connection timeout" ) ;
break ;
case EventType . Receive :
Console . WriteLine ( "Packet received from server - Channel ID: " + netEvent . ChannelID + ", Data length: " + netEvent . Packet . Length ) ;
netEvent . Packet . Dispose ( ) ;
break ;
}
}
}
client . Flush ( ) ;
}
Packet packet = default ( Packet ) ;
byte [ ] data = new byte [ 64 ] ;
packet . Create ( data ) ;
peer . Send ( channelID , ref packet ) ;
byte [ ] buffer = new byte [ 1024 ] ;
netEvent . Packet . CopyTo ( buffer ) ;
AllocCallback OnMemoryAllocate = ( size ) => {
return Marshal . AllocHGlobal ( size ) ;
} ;
FreeCallback OnMemoryFree = ( memory ) => {
Marshal . FreeHGlobal ( memory ) ;
} ;
NoMemoryCallback OnNoMemory = ( ) => {
throw new OutOfMemoryException ( ) ;
} ;
Callbacks callbacks = new Callbacks ( OnMemoryAllocate , OnMemoryFree , OnNoMemory ) ;
if ( ENet . Library . Initialize ( callbacks ) )
Console . WriteLine ( "ENet successfully initialized using a custom memory allocator" ) ;
การใช้งานเกือบจะเหมือนกับในสภาพแวดล้อม .NET ยกเว้นว่าฟังก์ชันคอนโซลจะต้องถูกแทนที่ด้วยฟังก์ชันที่ Unity มอบให้ หาก Host.Service()
จะถูกเรียกใน Game Loop ให้ตรวจสอบให้แน่ใจว่าพารามิเตอร์การหมดเวลาตั้งค่าเป็น 0 ซึ่งหมายถึงไม่มีการบล็อก นอกจากนี้ ให้ Unity ทำงานในพื้นหลังโดยเปิดใช้งานตัวเลือกที่เหมาะสมในการตั้งค่าเครื่องเล่น
กลยุทธ์ที่รู้จักกันดีที่สุดคือการใช้ ENet ในเธรด I/O อิสระ และใช้เทคนิคการส่งข้อความระหว่างเธรดสำหรับการถ่ายโอนข้อมูลข้ามเธรด/งานโดยไม่มีการล็อค/mutexes ใด ๆ คิวที่ไม่ปิดกั้นเช่น Ring Buffer ได้รับการออกแบบมาเพื่อวัตถุประสงค์ดังกล่าว นามธรรมและตรรกะระดับสูงสามารถขนานกันโดยใช้ผู้ปฏิบัติงาน จากนั้นสื่อสารกับเธรด I/O และจัดคิว/ยกเลิกคิวข้อความเพื่อส่ง/รับข้อมูลผ่านเครือข่าย
โดยทั่วไป ENet ไม่ปลอดภัยต่อเธรด แต่ฟังก์ชันบางอย่างสามารถใช้งานได้อย่างปลอดภัยหากผู้ใช้ระมัดระวังเพียงพอ:
โครงสร้าง Packet
และฟังก์ชันจะปลอดภัยจนกว่าแพ็กเก็ตจะเคลื่อนที่ข้ามเธรดตามค่าเท่านั้น และไม่ได้ใช้การจัดสรรหน่วยความจำแบบกำหนดเอง
Peer.ID
ทันทีที่ได้รับตัวชี้ไปยังเพียร์จากฝั่งดั้งเดิม ID จะถูกแคชไว้ในโครงสร้าง Peer
เพื่อดำเนินการเพิ่มเติมกับออบเจ็กต์ที่กำหนดให้กับ ID นั้น โครงสร้าง Peer
สามารถย้ายข้ามเธรดได้ตามค่า แต่ฟังก์ชันของโครงสร้างนั้นไม่ปลอดภัยสำหรับเธรดเนื่องจากข้อมูลในหน่วยความจำอาจเปลี่ยนแปลงโดยบริการในเธรดอื่น
Library.Time
ใช้อะตอมมิกดั้งเดิมภายในเพื่อจัดการเวลาโมโนโทนิกในท้องถิ่น
คำจำกัดความของค่าสถานะสำหรับฟังก์ชัน Peer.Send()
:
PacketFlags.None
ไม่มีลำดับที่ไม่น่าเชื่อถือ ไม่รับประกันการส่งแพ็กเก็ต
PacketFlags.Reliable
ลำดับที่เชื่อถือได้ที่เชื่อถือได้ แพ็กเก็ตจะต้องได้รับจากเพียร์เป้าหมาย และควรพยายามส่งอีกครั้งจนกว่าแพ็กเก็ตจะถูกส่ง
PacketFlags.Unsequenced
แพ็กเก็ตที่ไม่เรียงลำดับจะไม่ถูกเรียงลำดับกับแพ็กเก็ตอื่น และอาจถูกจัดส่งผิดลำดับ การตั้งค่าสถานะนี้ทำให้การจัดส่งไม่น่าเชื่อถือ
PacketFlags.NoAllocate
แพ็กเก็ตจะไม่จัดสรรข้อมูล และผู้ใช้ต้องจัดหาข้อมูลให้แทน ควรติดตามอายุการใช้งานของแพ็คเก็ตโดยใช้การโทรกลับ PacketFreeCallback
PacketFlags.UnreliableFragmented
แพ็กเก็ตจะถูกแยกส่วนอย่างไม่น่าเชื่อถือหากเกิน MTU ตามค่าเริ่มต้น แพ็กเก็ตที่ไม่น่าเชื่อถือซึ่งเกิน MTU จะถูกแยกส่วนและส่งอย่างน่าเชื่อถือ ควรใช้แฟล็กนี้เพื่อระบุแพ็กเก็ตที่ไม่ควรเชื่อถือได้อย่างชัดเจน
PacketFlags.Instant
แพ็กเก็ตทันทีจะไม่รวมกับแพ็กเก็ตอื่นในการวนซ้ำบริการครั้งถัดไปและส่งทันทีแทน ประเภทการนำส่งนี้จะซื้อขายประสิทธิภาพมัลติเพล็กซ์โดยอาศัยเวลาแฝง ไม่สามารถใช้แพ็กเก็ตเดียวกันสำหรับการโทรแบบ Peer.Send()
หลายครั้ง
PacketFlags.Unthrottled
แพ็กเก็ตที่ไม่ได้ควบคุมปริมาณที่ถูกจัดคิวไว้สำหรับการส่งที่ไม่น่าเชื่อถือไม่ควรถูกทิ้งเนื่องจากการควบคุมปริมาณ และส่งหากเป็นไปได้
PacketFlags.Sent
แพ็กเก็ตถูกส่งจากคิวทั้งหมดที่ป้อน
คำจำกัดความของประเภทเหตุการณ์สำหรับคุณสมบัติ Event.Type
:
EventType.None
ไม่มีเหตุการณ์ใดเกิดขึ้นภายในระยะเวลาที่กำหนด
EventType.Connect
คำขอเชื่อมต่อที่เริ่มต้นโดยฟังก์ชัน Peer.Connect()
เสร็จสมบูรณ์แล้ว Event.Peer
ส่งคืนเพียร์ที่เชื่อมต่อสำเร็จ Event.Data
ส่งคืนข้อมูลที่ผู้ใช้ระบุซึ่งอธิบายการเชื่อมต่อหรือ 0 หากไม่มี
EventType.Disconnect
เพียร์ถูกตัดการเชื่อมต่อ เหตุการณ์นี้สร้างขึ้นเมื่อการตัดการเชื่อมต่อที่เริ่มต้นโดยฟังก์ชัน Peer.Disconnect()
เสร็จสมบูรณ์ Event.Peer
ส่งคืนเพียร์ที่ถูกตัดการเชื่อมต่อ Event.Data
ส่งคืนข้อมูลที่ผู้ใช้ระบุซึ่งอธิบายการตัดการเชื่อมต่อหรือ 0 หากไม่มี
EventType.Receive
แพ็กเก็ตที่ได้รับจากเพียร์ Event.Peer
ส่งคืนเพียร์ที่ส่งแพ็กเก็ต Event.ChannelID
ระบุหมายเลขช่องสัญญาณที่ได้รับแพ็กเก็ต Event.Packet
ส่งคืนแพ็กเก็ตที่ได้รับ และแพ็กเก็ตนี้จะต้องถูกทำลายโดยใช้ฟังก์ชัน Event.Packet.Dispose()
หลังการใช้งาน
EventType.Timeout
เพียร์หมดเวลาแล้ว เหตุการณ์นี้จะเกิดขึ้นหากเพียร์หมดเวลาหรือหากคำขอการเชื่อมต่อที่เตรียมใช้งานโดย Peer.Connect()
หมดเวลา Event.Peer
ส่งคืนเพียร์ที่หมดเวลา
คำจำกัดความของสถานะเพียร์สำหรับทรัพย์สิน Peer.State
:
PeerState.Uninitialized
ค่าเริ่มต้นให้กับเพียร์ที่ไม่ได้เตรียมใช้งาน
PeerState.Disconnected
เพียร์ตัดการเชื่อมต่อหรือหมดเวลา
PeerState.Connecting
การเชื่อมต่อแบบเพียร์
PeerState.Connected
ต่อเพียร์ที่เชื่อมต่อสำเร็จแล้ว
PeerState.Disconnecting
การเชื่อมต่อการเชื่อมต่อแบบเพียร์ที่กำลังดำเนินการ
PeerState.Zombie
เพียร์ไม่ได้ตัดการเชื่อมต่ออย่างถูกต้อง
จัดให้มีเหตุการณ์ต่อแอปพลิเคชัน
AllocCallback(IntPtr size)
แจ้งเตือนเมื่อมีการร้องขอหน่วยความจำสำหรับการจัดสรร คาดว่าตัวชี้ไปยังหน่วยความจำที่จัดสรรใหม่ การอ้างอิงถึงผู้รับมอบสิทธิ์ควรเก็บไว้ไม่ให้ถูกรวบรวมขยะ
FreeCallback(IntPtr memory)
แจ้งเตือนเมื่อสามารถปล่อยหน่วยความจำได้ การอ้างอิงถึงผู้รับมอบสิทธิ์ควรเก็บไว้ไม่ให้ถูกรวบรวมขยะ
NoMemoryCallback()
แจ้งเตือนเมื่อหน่วยความจำไม่เพียงพอ การอ้างอิงถึงผู้รับมอบสิทธิ์ควรเก็บไว้ไม่ให้ถูกรวบรวมขยะ
จัดเตรียมเหตุการณ์ต่อแพ็กเก็ต
PacketFreeCallback(Packet packet)
แจ้งเตือนเมื่อแพ็คเก็ตถูกทำลาย บ่งชี้ว่าแพ็กเก็ตที่เชื่อถือได้ได้รับการยอมรับหรือไม่ การอ้างอิงถึงผู้รับมอบสิทธิ์ควรเก็บไว้ไม่ให้ถูกรวบรวมขยะ
จัดให้มีเหตุการณ์ต่อเจ้าภาพ
InterceptCallback(ref Event @event, ref Address address, IntPtr receivedData, int receivedDataLength)
แจ้งเตือนเมื่อแพ็กเก็ต UDP แบบดิบถูกดักจับ รหัสสถานะที่ส่งคืนจากการโทรกลับนี้จะแนะนำ ENet ว่าควรจัดการเหตุการณ์ที่ตั้งค่าไว้อย่างไร การส่งคืน 1 หมายถึงการจัดส่งเหตุการณ์ที่ตั้งไว้โดยบริการ การส่งคืน 0 บ่งชี้ว่าระบบย่อย ENet ควรจัดการข้อมูลที่ได้รับ การส่งคืน -1 บ่งชี้ว่ามีข้อผิดพลาด การอ้างอิงถึงผู้รับมอบสิทธิ์ควรเก็บไว้ไม่ให้ถูกรวบรวมขยะ
ChecksumCallback(IntPtr buffers, int bufferCount)
แจ้งเตือนเมื่อควรคำนวณเช็คซัมสำหรับบัฟเฟอร์ในการส่งและรับ ค่าที่ส่งคืนจากการเรียกกลับนี้คือเช็คซัม 64 บิต ENet จะจัดการการตรวจสอบความสมบูรณ์ของแพ็กเก็ตโดยอัตโนมัติ หากเปิดใช้งานกลไกการตรวจสอบที่ปลายทั้งสองข้าง สามารถใช้ได้กับฟังก์ชัน ENet.Library.CRC64()
การอ้างอิงถึงผู้รับมอบสิทธิ์ควรเก็บไว้ไม่ให้ถูกรวบรวมขยะ
ประกอบด้วยโครงสร้างที่มีข้อมูลโฮสต์ที่ไม่ระบุชื่อและหมายเลขพอร์ต
Address.Port
รับหรือตั้งค่าหมายเลขพอร์ต
Address.GetIP()
ได้รับที่อยู่ IP
Address.SetIP(string ip)
ตั้งค่าที่อยู่ IP หากต้องการใช้การออกอากาศ IPv4 ในเครือข่ายท้องถิ่น คุณสามารถตั้งค่าที่อยู่เป็น 255.255.255.255 สำหรับไคลเอนต์ได้ ENet จะตอบสนองต่อการออกอากาศโดยอัตโนมัติและอัปเดตที่อยู่เป็น IP ที่แท้จริงของเซิร์ฟเวอร์
Address.GetHost()
พยายามค้นหาแบบย้อนกลับจากที่อยู่ ส่งกลับสตริงที่มีชื่อที่ได้รับการแก้ไขหรือที่อยู่ IP
Address.SetHost(string hostName)
ตั้งชื่อโฮสต์หรือที่อยู่ IP ควรใช้สำหรับการเชื่อมโยงกับอินเทอร์เฟซเครือข่ายหรือการเชื่อมต่อกับโฮสต์ภายนอก คืนค่าจริงเมื่อสำเร็จหรือคืนค่าเท็จเมื่อล้มเหลว
ประกอบด้วยโครงสร้างที่มีประเภทเหตุการณ์ ตัวชี้ที่ได้รับการจัดการไปยังเพียร์ รหัสช่อง ข้อมูลที่ผู้ใช้ระบุ และตัวชี้ที่ได้รับการจัดการไปยังแพ็กเก็ต
Event.Type
ส่งคืนประเภทของเหตุการณ์
Event.Peer
ส่งคืนเพียร์ที่สร้างเหตุการณ์การเชื่อมต่อ ยกเลิกการเชื่อมต่อ รับ หรือหมดเวลา
Event.ChannelID
ส่งคืน ID ช่องบนเพียร์ที่สร้างเหตุการณ์ ตามความเหมาะสม
Event.Data
ส่งคืนข้อมูลที่ผู้ใช้ระบุ หากเหมาะสม
Event.Packet
ส่งคืนแพ็กเก็ตที่เกี่ยวข้องกับเหตุการณ์ หากเหมาะสม
มีตัวชี้ที่ได้รับการจัดการไปยังแพ็กเก็ต
Packet.Dispose()
ทำลายแพ็กเก็ต ควรเรียกเฉพาะเมื่อได้รับแพ็กเก็ตจากเหตุการณ์ EventType.Receive
Packet.IsSet
ส่งกลับสถานะของตัวชี้ที่ได้รับการจัดการ
Packet.Data
ส่งคืนตัวชี้ที่ได้รับการจัดการไปยังข้อมูลแพ็คเก็ต
Packet.UserData
รับหรือตั้งค่าข้อมูลที่ผู้ใช้ระบุ
Packet.Length
ส่งคืนความยาวของเพย์โหลดในแพ็กเก็ต
Packet.HasReferences
ตรวจสอบการอ้างอิงไปยังแพ็กเก็ต
Packet.SetFreeCallback(PacketFreeCallback callback)
ตั้งค่าการโทรกลับเพื่อแจ้งเตือนเมื่อแพ็กเก็ตที่เหมาะสมถูกทำลาย สามารถใช้ตัวชี้ IntPtr
ไปยังการโทรกลับแทนการอ้างอิงถึงผู้รับมอบสิทธิ์ได้
Packet.Create(byte[] data, int offset, int length, PacketFlags flags)
สร้างแพ็กเก็ตที่อาจถูกส่งไปยังเพียร์ พารามิเตอร์ออฟเซ็ตระบุจุดเริ่มต้นของข้อมูลในอาร์เรย์ ความยาวคือจุดสิ้นสุดของข้อมูลในอาร์เรย์ พารามิเตอร์ทั้งหมดเป็นทางเลือก สามารถระบุแฟล็กแพ็กเก็ตหลายรายการพร้อมกันได้ สามารถใช้ตัวชี้ IntPtr
ไปยังบัฟเฟอร์ดั้งเดิมแทนการอ้างอิงถึงอาร์เรย์ไบต์ได้
Packet.CopyTo(byte[] destination)
คัดลอกเพย์โหลดจากแพ็กเก็ตไปยังอาร์เรย์ปลายทาง
ประกอบด้วยตัวชี้ที่ได้รับการจัดการไปยังเพียร์และ ID ที่แคชไว้
Peer.IsSet
ส่งกลับสถานะของตัวชี้ที่ได้รับการจัดการ
Peer.ID
ส่งคืน ID เพียร์ ฝั่งไคลเอ็นต์จะเป็นศูนย์เสมอ
Peer.IP
ส่งคืนที่อยู่ IP ในรูปแบบที่สามารถพิมพ์ได้
Peer.Port
ส่งกลับหมายเลขพอร์ต
Peer.MTU
ส่งคืน MTU
Peer.State
ส่งคืนสถานะเพียร์ที่อธิบายในการแจงนับ PeerState
Peer.RoundTripTime
ส่งคืนเวลาไปกลับในหน่วยมิลลิวินาที
Peer.LastRoundTripTime
ส่งคืนเวลาไปกลับนับตั้งแต่การตอบรับครั้งล่าสุดในหน่วยมิลลิวินาที
Peer.LastSendTime
ส่งคืนเวลาส่งแพ็กเก็ตล่าสุดในหน่วยมิลลิวินาที
Peer.LastReceiveTime
ส่งคืนเวลารับแพ็กเก็ตล่าสุดในหน่วยมิลลิวินาที
Peer.PacketsSent
ส่งคืนจำนวนแพ็กเก็ตทั้งหมดที่ส่งระหว่างการเชื่อมต่อ
Peer.PacketsLost
ส่งคืนจำนวนแพ็กเก็ตทั้งหมดที่ถือว่าสูญหายระหว่างการเชื่อมต่อโดยอิงตามตรรกะการส่งสัญญาณใหม่
Peer.PacketsThrottle
ส่งกลับอัตราส่วนของเค้นแพ็กเก็ตขึ้นอยู่กับเงื่อนไขของการเชื่อมต่อกับเพียร์
Peer.BytesSent
ส่งคืนจำนวนไบต์ทั้งหมดที่ส่งระหว่างการเชื่อมต่อ
Peer.BytesReceived
ส่งคืนจำนวนไบต์ทั้งหมดที่ได้รับระหว่างการเชื่อมต่อ
Peer.Data
รับหรือตั้งค่าข้อมูลที่ผู้ใช้ระบุ ควรใช้กับนักแสดงที่ชัดเจนเพื่อให้ได้ประเภทข้อมูลที่เหมาะสม
Peer.ConfigureThrottle(uint interval, uint acceleration, uint deceleration, uint threshold)
กำหนดค่าพารามิเตอร์คันเร่งสำหรับเพียร์ แพ็กเก็ตที่ไม่น่าเชื่อถือจะถูกทิ้งโดย ENet เพื่อตอบสนองต่อเงื่อนไขที่แตกต่างกันของการเชื่อมต่อกับเพียร์ คันเร่งแสดงถึงความน่าจะเป็นที่แพ็กเก็ตที่ไม่น่าเชื่อถือไม่ควรถูกทิ้ง ดังนั้นจึงส่งโดย ENet ไปยังเพียร์ เวลาไปกลับเฉลี่ยต่ำสุดตั้งแต่การส่งแพ็กเก็ตที่เชื่อถือได้ไปจนถึงการตอบรับจะถูกวัดตามระยะเวลาที่ระบุโดยพารามิเตอร์ช่วงเวลาในหน่วยมิลลิวินาที หากเวลาไปกลับที่วัดได้น้อยกว่าเวลาไปกลับเฉลี่ยที่วัดในช่วงเวลาดังกล่าวอย่างมีนัยสำคัญ ความน่าจะเป็นของคันเร่งจะเพิ่มขึ้นเพื่อให้รับส่งข้อมูลได้มากขึ้นตามจำนวนที่ระบุในพารามิเตอร์การเร่งความเร็ว ซึ่งเป็นอัตราส่วนต่อ Library.throttleScale
คงที่ หากเวลาไปกลับที่วัดได้มากกว่าเวลาไปกลับเฉลี่ยที่วัดในช่วงเวลาดังกล่าวอย่างมีนัยสำคัญ ความน่าจะเป็นของคันเร่งจะลดลงเพื่อจำกัดการรับส่งข้อมูลตามจำนวนที่ระบุในพารามิเตอร์การชะลอตัว ซึ่งเป็นอัตราส่วนต่อ Library.throttleScale
คงที่ เมื่อคันเร่งมีค่าเป็น Library.throttleScale
ENet จะไม่ทิ้งแพ็กเก็ตที่ไม่น่าเชื่อถือ ดังนั้น 100% ของแพ็กเก็ตที่ไม่น่าเชื่อถือทั้งหมดจะถูกส่งไป เมื่อคันเร่งมีค่าเป็น 0 ENet จะทิ้งแพ็กเก็ตที่ไม่น่าเชื่อถือทั้งหมด ดังนั้น 0% ของแพ็กเก็ตที่ไม่น่าเชื่อถือทั้งหมดจะถูกส่งไป ค่ากลางสำหรับคันเร่งแสดงถึงความน่าจะเป็นระดับกลางระหว่าง 0% ถึง 100% ของแพ็กเก็ตที่ไม่น่าเชื่อถือที่ถูกส่ง ขีดจำกัดแบนด์วิธของโฮสต์ในประเทศและต่างประเทศจะถูกนำมาพิจารณาเพื่อกำหนดขีดจำกัดที่เหมาะสมสำหรับความน่าจะเป็นของคันเร่ง ซึ่งไม่ควรเพิ่มขึ้นแม้ในสภาวะที่ดีที่สุด หากต้องการปิดใช้งานการควบคุมปริมาณ ควรตั้งค่าพารามิเตอร์การชะลอความเร็วเป็นศูนย์ พารามิเตอร์ขีดจำกัดสามารถใช้เพื่อลดการควบคุมปริมาณแพ็กเก็ตโดยสัมพันธ์กับเวลาไปกลับที่วัดได้ในสภาพแวดล้อมเครือข่ายที่ไม่เสถียรโดยมีค่าความกระวนกระวายใจสูงและเวลาแฝงเฉลี่ยต่ำ ซึ่งเป็นเงื่อนไขทั่วไปสำหรับเครือข่าย Wi-Fi ในสถานที่ที่มีผู้คนหนาแน่น ตามค่าเริ่มต้น พารามิเตอร์ขีดจำกัดจะตั้งค่าเป็น Library.throttleThreshold
ในหน่วยมิลลิวินาที
Peer.Send(byte channelID, ref Packet packet)
จัดคิวแพ็คเก็ตที่จะส่ง คืนค่าจริงเมื่อสำเร็จหรือคืนค่าเท็จเมื่อล้มเหลว
Peer.Receive(out byte channelID, out Packet packet)
พยายามแยกคิวแพ็กเก็ตที่อยู่ในคิวขาเข้าใด ๆ คืนค่าเป็นจริงหากแพ็กเก็ตถูกแยกออกจากคิว หรือคืนค่าเป็นเท็จหากไม่มีแพ็กเก็ตที่พร้อมใช้งาน
Peer.Ping()
ส่งคำขอ ping ไปยังเพียร์ ENet จะส่ง Ping ไปยังเพียร์ที่เชื่อมต่อทั้งหมดโดยอัตโนมัติในช่วงเวลาปกติ อย่างไรก็ตาม ฟังก์ชันนี้อาจถูกเรียกใช้เพื่อให้แน่ใจว่าคำขอ Ping บ่อยขึ้น
Peer.PingInterval(uint interval)
กำหนดช่วงเวลาที่จะส่ง Ping ไปยังเพียร์ Ping ใช้ทั้งเพื่อตรวจสอบความมีชีวิตชีวาของการเชื่อมต่อและเพื่อปรับคันเร่งแบบไดนามิกในช่วงที่มีการรับส่งข้อมูลต่ำ เพื่อให้คันเร่งมีการตอบสนองที่สมเหตุสมผลในช่วงที่มีการจราจรหนาแน่น
Peer.Timeout(uint timeoutLimit, uint timeoutMinimum, uint timeoutMaximum)
ตั้งค่าพารามิเตอร์การหมดเวลาสำหรับเพียร์ พารามิเตอร์การหมดเวลาจะควบคุมวิธีการและเวลาที่เพียร์จะหมดเวลาจากความล้มเหลวในการยอมรับการรับส่งข้อมูลที่เชื่อถือได้ ค่าการหมดเวลาที่ใช้ในกลไกกึ่งเชิงเส้น โดยที่หากแพ็กเก็ตที่เชื่อถือได้ไม่ได้รับการยอมรับภายในเวลาไปกลับโดยเฉลี่ย บวกด้วยค่าเผื่อความแปรปรวนจนกว่าการหมดเวลาจะถึงขีดจำกัดที่ตั้งไว้ หากการหมดเวลาอยู่ที่ขีดจำกัดนี้และมีการส่งแพ็กเก็ตที่เชื่อถือได้แต่ไม่ได้รับการยอมรับภายในระยะเวลาขั้นต่ำที่กำหนด เพียร์จะถูกตัดการเชื่อมต่อ อีกทางหนึ่ง หากมีการส่งแพ็กเก็ตที่เชื่อถือได้แต่ไม่ได้รับการยอมรับในช่วงเวลาสูงสุดที่กำหนด เพียร์จะถูกตัดการเชื่อมต่อโดยไม่คำนึงถึงค่าขีดจำกัดการหมดเวลาปัจจุบัน
Peer.Disconnect(uint data)
ร้องขอการตัดการเชื่อมต่อจากเพียร์
Peer.DisconnectNow(uint data)
บังคับให้ตัดการเชื่อมต่อจากเพียร์ทันที
Peer.DisconnectLater(uint data)
ร้องขอการตัดการเชื่อมต่อจากเพียร์ แต่หลังจากส่งแพ็กเก็ตขาออกที่อยู่ในคิวทั้งหมดแล้วเท่านั้น
Peer.Reset()
ตัดการเชื่อมต่อเพียร์อย่างแข็งขัน โฮสต์ภายนอกที่เพียร์เป็นตัวแทนจะไม่ได้รับแจ้งถึงการตัดการเชื่อมต่อ และจะหมดเวลาในการเชื่อมต่อกับโฮสต์ภายในเครื่อง
ประกอบด้วยตัวชี้ที่ได้รับการจัดการไปยังโฮสต์
Host.Dispose()
ทำลายโฮสต์
Host.IsSet
ส่งกลับสถานะของตัวชี้ที่ได้รับการจัดการ
Host.PeersCount
ส่งคืนเพียร์ที่เชื่อมต่อจำนวนหนึ่ง
Host.PacketsSent
ส่งคืนจำนวนแพ็กเก็ตทั้งหมดที่ส่งระหว่างเซสชัน
Host.PacketsReceived
ส่งคืนจำนวนแพ็กเก็ตทั้งหมดที่ได้รับระหว่างเซสชัน
Host.BytesSent
ส่งคืนจำนวนไบต์ทั้งหมดที่ส่งระหว่างเซสชัน
Host.BytesReceived
ส่งคืนจำนวนไบต์ทั้งหมดที่ได้รับระหว่างเซสชัน
Host.Create(Address? address, int peerLimit, int channelLimit, uint incomingBandwidth, uint outgoingBandwidth, int bufferSize)
สร้างโฮสต์สำหรับการสื่อสารกับเพื่อน พารามิเตอร์แบนด์วิธจะกำหนดขนาดหน้าต่างของการเชื่อมต่อซึ่งจะจำกัดจำนวนแพ็กเก็ตที่เชื่อถือได้ซึ่งอาจอยู่ระหว่างการส่งผ่านในเวลาใดก็ตาม ENet จะวางแพ็กเก็ตอย่างมีกลยุทธ์ในด้านเฉพาะของการเชื่อมต่อระหว่างโฮสต์เพื่อให้แน่ใจว่าแบนด์วิธของโฮสต์จะไม่ถูกครอบงำ พารามิเตอร์ขนาดบัฟเฟอร์ใช้เพื่อตั้งค่าขนาดบัฟเฟอร์ของซ็อกเก็ตสำหรับการส่งและรับดาตาแกรม พารามิเตอร์ทั้งหมดเป็นทางเลือก ยกเว้นที่อยู่และขีดจำกัดเพียร์ ในกรณีที่ใช้ฟังก์ชันเพื่อสร้างโฮสต์ซึ่งจะรับฟังการเชื่อมต่อขาเข้า
Host.PreventConnections(bool state)
ป้องกันการเข้าถึงโฮสต์สำหรับการเชื่อมต่อขาเข้าใหม่ ฟังก์ชันนี้ทำให้โฮสต์มองไม่เห็นโดยสิ้นเชิงในเครือข่าย เพียร์ใด ๆ ที่พยายามเชื่อมต่อจะถูกหมดเวลา
Host.Broadcast(byte channelID, ref Packet packet, Peer[] peers)
จัดคิวแพ็กเก็ตที่จะส่งไปยังช่วงของเพียร์หรือเพียร์ทั้งหมดที่เกี่ยวข้องกับโฮสต์ หากไม่ได้ใช้พารามิเตอร์เพียร์เสริม โครงสร้าง Peer
ที่เป็นศูนย์ใดๆ ในอาร์เรย์จะถูกแยกออกจากการออกอากาศ แทนที่จะเป็นอาร์เรย์ Peer
เดียวสามารถส่งผ่านไปยังฟังก์ชันซึ่งจะถูกแยกออกจากการออกอากาศ
Host.CheckEvents(out Event @event)
ตรวจสอบเหตุการณ์ที่อยู่ในคิวบนโฮสต์และจัดส่งหนึ่งรายการหากมี ส่งคืน > 0 หากมีการจัดส่งเหตุการณ์, 0 หากไม่มีเหตุการณ์ที่พร้อมใช้งาน, < 0 เมื่อล้มเหลว
Host.Connect(Address address, int channelLimit, uint data)
เริ่มต้นการเชื่อมต่อกับโฮสต์ต่างประเทศ ส่งคืนเพียร์ที่เป็นตัวแทนของโฮสต์ภายนอกเมื่อสำเร็จหรือส่งข้อยกเว้นเมื่อล้มเหลว เพียร์ที่ส่งคืนจะไม่ทำการเชื่อมต่อให้เสร็จสิ้นจนกว่า Host.Service()
จะแจ้งเตือนถึงเหตุการณ์ EventType.Connect
ขีดจำกัดช่องสัญญาณและพารามิเตอร์ข้อมูลที่ผู้ใช้ระบุเป็นทางเลือก
Host.Service(int timeout, out Event @event)
รอเหตุการณ์บนโฮสต์ที่ระบุและแพ็กเก็ตรถรับส่งระหว่างโฮสต์และเพียร์ ENet ใช้แบบจำลองเหตุการณ์ที่สำรวจเพื่อแจ้งให้ผู้ใช้ทราบถึงเหตุการณ์สำคัญ โฮสต์ ENet จะถูกสำรวจสำหรับเหตุการณ์ที่มีฟังก์ชันนี้ โดยที่ค่าการหมดเวลาเพิ่มเติมในหน่วยมิลลิวินาทีอาจถูกระบุเพื่อควบคุมระยะเวลาที่ ENet จะสำรวจ หากระบุการหมดเวลาเป็น 0 ฟังก์ชันนี้จะกลับมาทันทีหากไม่มีเหตุการณ์ที่จะจัดส่ง มิฉะนั้น จะส่งคืนค่า 1 หากกิจกรรมถูกส่งภายในระยะหมดเวลาที่ระบุ ควรเรียกใช้ฟังก์ชันนี้เป็นประจำเพื่อให้แน่ใจว่ามีการส่งและรับแพ็กเก็ต ไม่เช่นนั้นปริมาณการรับส่งข้อมูลจะเกิดขึ้นอย่างรวดเร็วจนนำไปสู่เวลาแฝงที่เพิ่มขึ้น พารามิเตอร์การหมดเวลาที่ตั้งไว้เป็น 0 หมายถึงการไม่บล็อกซึ่งจำเป็นสำหรับกรณีที่เรียกใช้ฟังก์ชันใน Game Loop
Host.SetBandwidthLimit(uint incomingBandwidth, uint outgoingBandwidth)
ปรับขีดจำกัดแบนด์วิดท์ของโฮสต์เป็นไบต์ต่อวินาที
Host.SetChannelLimit(int channelLimit)
จำกัดช่องสัญญาณสูงสุดที่อนุญาตสำหรับการเชื่อมต่อขาเข้าในอนาคต
Host.SetMaxDuplicatePeers(ushort number)
จำกัดเพียร์ที่ซ้ำกันสูงสุดที่อนุญาตจากโฮสต์เดียวกัน และป้องกันการเชื่อมต่อหากเกิน ตามค่าเริ่มต้นที่ตั้งค่าเป็น Library.maxPeers
ต้องไม่น้อยกว่าหนึ่ง
Host.SetInterceptCallback(InterceptCallback callback)
ตั้งค่าการโทรกลับเพื่อแจ้งเตือนเมื่อมีการดักจับแพ็กเก็ต UDP แบบดิบ สามารถใช้ตัวชี้ IntPtr
ไปยังการโทรกลับแทนการอ้างอิงถึงผู้รับมอบสิทธิ์ได้
Host.SetChecksumCallback(ChecksumCallback callback)
ตั้งค่าการโทรกลับเพื่อแจ้งเตือนเมื่อควรคำนวณเช็คซัม สามารถใช้ตัวชี้ IntPtr
ไปยังการโทรกลับแทนการอ้างอิงถึงผู้รับมอบสิทธิ์ได้
Host.Flush()
จะส่งแพ็กเก็ตที่อยู่ในคิวบนโฮสต์ที่ระบุไปยังเพียร์ที่กำหนด
ประกอบด้วยเขตข้อมูลคงที่
Library.maxChannelCount
จำนวนช่องสัญญาณสูงสุดที่เป็นไปได้
Library.maxPeers
จำนวนเพียร์สูงสุดที่เป็นไปได้
Library.maxPacketSize
ขนาดสูงสุดของแพ็กเก็ต
Library.version
เวอร์ชันความเข้ากันได้ปัจจุบันสัมพันธ์กับไลบรารีดั้งเดิม
Library.Time
ส่งคืนเวลาโมโนโทนิกท้องถิ่นปัจจุบันในหน่วยมิลลิวินาที มันจะไม่รีเซ็ตในขณะที่แอปพลิเคชันยังมีชีวิตอยู่
Library.Initialize(Callbacks callbacks)
เริ่มต้นไลบรารีดั้งเดิม พารามิเตอร์ Callbacks เป็นทางเลือก และควรใช้กับการจัดสรรหน่วยความจำแบบกำหนดเองเท่านั้น ควรโทรแจ้งก่อนเริ่มงาน คืนค่าจริงเมื่อสำเร็จหรือคืนค่าเท็จเมื่อล้มเหลว
Library.Deinitialize()
deinitializes ไลบรารีดั้งเดิม ควรเรียกหลังเลิกงาน
Library.CRC64(IntPtr buffers, int bufferCount)
คำนวณผลรวมสำหรับบัฟเฟอร์ที่ไม่มีการจัดการ
โครงการนี้ได้รับการสนับสนุนโดย:
กระรอกบินบันเทิง
สแควร์รูทสตูดิโอ
เกมส์วงแปลก