Dies ist eine unabhängige ENet-Implementierung mit einem modifizierten Protokoll für C, C++, C# und andere Sprachen.
Merkmale:
Bitte lesen Sie die häufigsten Fehler, um eine Vorstellung davon zu bekommen, was schief gehen kann.
Zum Erstellen der nativen Bibliothek ist entsprechende Software erforderlich:
Für Desktop-Plattformen CMake mit GNU Make oder Visual Studio.
Für mobile Plattformen NDK für Android und Xcode für iOS. Stellen Sie sicher, dass alle kompilierten Bibliotheken den entsprechenden Plattformen und CPU-Architekturen zugeordnet sind.
Befolgen Sie diese Anleitung, um die Bibliothek für Nintendo Switch zu erstellen.
Eine verwaltete Assembly kann mit jeder verfügbaren Kompilierungsplattform erstellt werden, die C# 3.0 oder höher unterstützt.
Sie können kompilierte Bibliotheken aus dem Release-Bereich oder von NuGet herunterladen:
ENet-CSharp
enthält eine kompilierte Assembly mit nativen Bibliotheken für die .NET-Umgebung (.NET Standard 2.1).
ENet-Unity
enthält Skripte mit nativen Bibliotheken für Unity.
Es wird dringend empfohlen, einen Ordner mit Binärdateien zu löschen, anstatt ihn für ein Upgrade zu ersetzen.
Diese Pakete werden nur für herkömmliche Plattformen bereitgestellt: Windows, Linux und macOS (x64).
Unterstützte Betriebssystemversionen:
Bevor mit der Arbeit begonnen wird, sollte die Bibliothek mit ENet.Library.Initialize();
Funktion.
Nachdem die Arbeit erledigt ist, deinitialisieren Sie die Bibliothek mit ENet.Library.Deinitialize();
Funktion.
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" ) ;
Die Nutzung ist fast die gleiche wie in der .NET-Umgebung, außer dass die Konsolenfunktionen durch von Unity bereitgestellte Funktionen ersetzt werden müssen. Wenn Host.Service()
in einer Spielschleife aufgerufen wird, stellen Sie sicher, dass der Timeout-Parameter auf 0 gesetzt ist, was bedeutet, dass er nicht blockiert. Lassen Sie Unity außerdem im Hintergrund laufen, indem Sie die entsprechende Option in den Player-Einstellungen aktivieren.
Die bekannteste Strategie besteht darin, ENet in einem unabhängigen I/O-Thread zu verwenden und Inter-Thread-Messaging-Techniken zu nutzen, um Daten über Threads/Aufgaben hinweg ohne Sperren/Mutexe zu übertragen. Für solche Zwecke wurden nicht blockierende Warteschlangen wie Ring Buffer entwickelt. Abstraktionen und Logik auf hoher Ebene können mithilfe von Workern parallelisiert werden, dann mit dem I/O-Thread kommunizieren und Nachrichten in die Warteschlange ein-/aus der Warteschlange stellen, um Daten über das Netzwerk zu senden/empfangen.
Im Allgemeinen ist ENet nicht threadsicher, einige seiner Funktionen können jedoch sicher verwendet werden, wenn der Benutzer vorsichtig genug ist:
Die Packet
und ihre Funktionen sind sicher, bis sich ein Paket nur nach Wert über Threads bewegt und kein benutzerdefinierter Speicherzuweiser verwendet wird.
Peer.ID
Sobald ein Zeiger auf einen Peer von der nativen Seite erhalten wurde, wird die ID in Peer
Struktur für weitere Aktionen mit Objekten, die dieser ID zugewiesen sind, zwischengespeichert. Peer
-Struktur kann nach Wert über Threads verschoben werden, ihre Funktionen sind jedoch nicht Thread-sicher, da sich Daten im Speicher durch den Dienst in einem anderen Thread ändern können.
Library.Time
verwendet intern atomare Grundelemente zur Verwaltung der lokalen monotonen Zeit.
Definitionen eines Flags für Peer.Send()
-Funktion:
PacketFlags.None
unzuverlässig sequenziert, die Zustellung des Pakets ist nicht garantiert.
PacketFlags.Reliable
ist zuverlässig sequenziert, ein Paket muss vom Ziel-Peer empfangen werden und es sollten erneute Sendeversuche unternommen werden, bis das Paket zugestellt wird.
PacketFlags.Unsequenced
Ein Paket wird nicht mit anderen Paketen sequenziert und möglicherweise in der falschen Reihenfolge zugestellt. Dieses Flag macht die Zustellung unzuverlässig.
PacketFlags.NoAllocate
weist einem Paket keine Daten zu, und der Benutzer muss diese stattdessen bereitstellen. Die Paketlebensdauer sollte mithilfe des PacketFreeCallback
-Rückrufs verfolgt werden.
PacketFlags.UnreliableFragmented
Ein Paket wird unzuverlässig fragmentiert, wenn es die MTU überschreitet. Standardmäßig werden unzuverlässige Pakete, die die MTU überschreiten, fragmentiert und zuverlässig übertragen. Dieses Flag sollte verwendet werden, um explizit auf Pakete hinzuweisen, die unzuverlässig bleiben sollen.
PacketFlags.Instant
Ein Paket wird bei einer nächsten Dienstiteration nicht mit anderen Paketen gebündelt und stattdessen sofort gesendet. Bei dieser Bereitstellungsart wird die Multiplex-Effizienz zugunsten der Latenz geopfert. Das gleiche Paket kann nicht für mehrere Peer.Send()
-Aufrufe verwendet werden.
PacketFlags.Unthrottled
Ein Paket, das zum unzuverlässigen Senden in die Warteschlange gestellt wurde, sollte aufgrund der Drosselung nicht verworfen und nach Möglichkeit gesendet werden.
PacketFlags.Sent
Ein Paket wurde aus allen Warteschlangen gesendet, in die es eingetreten ist.
Definitionen von Ereignistypen für Event.Type
Eigenschaft:
EventType.None
Innerhalb des angegebenen Zeitlimits ist kein Ereignis aufgetreten.
EventType.Connect
Eine von Peer.Connect()
Funktion initiierte Verbindungsanforderung wurde abgeschlossen. Event.Peer
gibt einen Peer zurück, der erfolgreich eine Verbindung hergestellt hat. Event.Data
gibt die vom Benutzer bereitgestellten Daten zurück, die die Verbindung beschreiben, oder 0, wenn keine verfügbar sind.
EventType.Disconnect
Ein Peer hat die Verbindung getrennt. Dieses Ereignis wird bei erfolgreichem Abschluss einer durch die Funktion Peer.Disconnect()
initiierten Trennung generiert. Event.Peer
gibt einen Peer zurück, der die Verbindung getrennt hat. Event.Data
gibt die vom Benutzer bereitgestellten Daten zurück, die die Trennung beschreiben, oder 0, wenn keine verfügbar sind.
EventType.Receive
Ein Paket wurde von einem Peer empfangen. Event.Peer
gibt einen Peer zurück, der das Paket gesendet hat. Event.ChannelID
gibt die Kanalnummer an, auf der das Paket empfangen wurde. Event.Packet
gibt ein empfangenes Paket zurück, und dieses Paket muss nach der Verwendung mit der Funktion Event.Packet.Dispose()
zerstört werden.
EventType.Timeout
Bei einem Peer ist eine Zeitüberschreitung aufgetreten. Dieses Ereignis tritt auf, wenn bei einem Peer eine Zeitüberschreitung aufgetreten ist oder wenn eine durch Peer.Connect()
initialisierte Verbindungsanforderung abgelaufen ist. Event.Peer
gibt einen Peer zurück, bei dem eine Zeitüberschreitung aufgetreten ist.
Definitionen von Peer-Zuständen für Peer.State
-Eigenschaft:
PeerState.Uninitialized
ein nicht initialisierter Peer.
PeerState.Disconnected
Ein Peer wurde getrennt oder es kam zu einer Zeitüberschreitung.
PeerState.Connecting
. Es wird gerade eine Peer-Verbindung hergestellt.
PeerState.Connected
Ein Peer wurde erfolgreich verbunden.
PeerState.Disconnecting
eine Peer-Trennung wird ausgeführt.
PeerState.Zombie
ist ein Peer, der nicht ordnungsgemäß getrennt wurde.
Stellt Ereignisse pro Anwendung bereit.
AllocCallback(IntPtr size)
benachrichtigt, wenn ein Speicher zur Zuweisung angefordert wird. Erwartet einen Zeiger auf den neu zugewiesenen Speicher. Ein Verweis auf den Delegaten sollte vor der Müllsammlung geschützt werden.
FreeCallback(IntPtr memory)
benachrichtigt, wenn der Speicher freigegeben werden kann. Ein Verweis auf den Delegaten sollte vor der Müllsammlung geschützt werden.
NoMemoryCallback()
benachrichtigt, wenn der Speicher nicht ausreicht. Ein Verweis auf den Delegaten sollte vor der Müllsammlung geschützt werden.
Stellt Ereignisse pro Paket bereit.
PacketFreeCallback(Packet packet)
benachrichtigt, wenn ein Paket zerstört wird. Zeigt an, ob ein zuverlässiges Paket bestätigt wurde. Ein Verweis auf den Delegaten sollte vor der Müllsammlung geschützt werden.
Stellt Ereignisse pro Host bereit.
InterceptCallback(ref Event @event, ref Address address, IntPtr receivedData, int receivedDataLength)
benachrichtigt, wenn ein unformatiertes UDP-Paket abgefangen wird. Der von diesem Rückruf zurückgegebene Statuscode weist ENet an, wie das Set-Ereignis behandelt werden soll. Die Rückgabe von 1 zeigt die Auslösung des festgelegten Ereignisses durch den Dienst an. Die Rückgabe von 0 gibt an, dass ENet-Subsysteme empfangene Daten verarbeiten sollen. Die Rückgabe von -1 weist auf einen Fehler hin. Ein Verweis auf den Delegaten sollte vor der Müllsammlung geschützt werden.
ChecksumCallback(IntPtr buffers, int bufferCount)
benachrichtigt, wenn beim Senden und Empfangen eine Prüfsumme für Puffer berechnet werden soll. Ein von diesem Rückruf zurückgegebener Wert ist eine 64-Bit-Prüfsumme. ENet übernimmt automatisch die Integritätsprüfung von Paketen, wenn auf beiden Seiten ein Prüfsummenmechanismus aktiviert ist. Kann mit der Funktion ENet.Library.CRC64()
verwendet werden. Ein Verweis auf den Delegaten sollte vor der Müllsammlung geschützt werden.
Enthält eine Struktur mit anonymen Hostdaten und Portnummer.
Address.Port
ruft eine Portnummer ab oder legt sie fest.
Address.GetIP()
ruft eine IP-Adresse ab.
Address.SetIP(string ip)
legt eine IP-Adresse fest. Um IPv4-Broadcast im lokalen Netzwerk zu nutzen, kann die Adresse für einen Client auf 255.255.255.255 eingestellt werden. ENet antwortet automatisch auf die Übertragung und aktualisiert die Adresse auf die tatsächliche IP eines Servers.
Address.GetHost()
versucht, eine umgekehrte Suche anhand der Adresse durchzuführen. Gibt eine Zeichenfolge mit einem aufgelösten Namen oder einer IP-Adresse zurück.
Address.SetHost(string hostName)
legt den Hostnamen oder eine IP-Adresse fest. Sollte zur Bindung an eine Netzwerkschnittstelle oder zur Verbindung mit einem fremden Host verwendet werden. Gibt bei Erfolg „true“ und bei einem Fehler „false“ zurück.
Enthält eine Struktur mit dem Ereignistyp, dem verwalteten Zeiger auf den Peer, der Kanal-ID, den vom Benutzer bereitgestellten Daten und dem verwalteten Zeiger auf das Paket.
Event.Type
gibt einen Typ des Ereignisses zurück.
Event.Peer
gibt einen Peer zurück, der ein Verbindungs-, Trennungs-, Empfangs- oder Timeout-Ereignis generiert hat.
Event.ChannelID
gibt gegebenenfalls eine Kanal-ID auf dem Peer zurück, der das Ereignis generiert hat.
Event.Data
gibt gegebenenfalls die vom Benutzer bereitgestellten Daten zurück.
Event.Packet
gibt gegebenenfalls ein mit dem Ereignis verknüpftes Paket zurück.
Enthält einen verwalteten Zeiger auf das Paket.
Packet.Dispose()
zerstört das Paket. Sollte nur aufgerufen werden, wenn das Paket vom EventType.Receive
Ereignis abgerufen wurde.
Packet.IsSet
gibt einen Status des verwalteten Zeigers zurück.
Packet.Data
gibt einen verwalteten Zeiger auf die Paketdaten zurück.
Packet.UserData
ruft die vom Benutzer bereitgestellten Daten ab oder legt diese fest.
Packet.Length
gibt die Länge der Nutzlast im Paket zurück.
Packet.HasReferences
prüft Referenzen auf das Paket.
Packet.SetFreeCallback(PacketFreeCallback callback)
legt den Callback fest, um zu benachrichtigen, wenn ein entsprechendes Paket zerstört wird. Anstelle eines Verweises auf einen Delegaten kann ein Zeiger IntPtr
auf einen Rückruf verwendet werden.
Packet.Create(byte[] data, int offset, int length, PacketFlags flags)
erstellt ein Paket, das an einen Peer gesendet werden kann. Der Offset-Parameter gibt den Startpunkt der Daten in einem Array an, die Länge ist der Endpunkt der Daten in einem Array. Alle Parameter sind optional. Es können mehrere Paketflags gleichzeitig angegeben werden. Anstelle eines Verweises auf ein Byte-Array kann ein Zeiger IntPtr
auf einen nativen Puffer verwendet werden.
Packet.CopyTo(byte[] destination)
kopiert die Nutzlast aus dem Paket in das Zielarray.
Enthält einen verwalteten Zeiger auf den Peer und die zwischengespeicherte ID.
Peer.IsSet
gibt einen Status des verwalteten Zeigers zurück.
Peer.ID
gibt eine Peer-ID zurück. Auf der Clientseite ist es immer Null.
Peer.IP
gibt eine IP-Adresse in druckbarer Form zurück.
Peer.Port
gibt eine Portnummer zurück.
Peer.MTU
gibt eine MTU zurück.
Peer.State
gibt einen Peer-Status zurück, der in der PeerState
Enumeration beschrieben wird.
Peer.RoundTripTime
gibt eine Roundtrip-Zeit in Millisekunden zurück.
Peer.LastRoundTripTime
gibt eine Roundtrip-Zeit seit der letzten Bestätigung in Millisekunden zurück.
Peer.LastSendTime
gibt die Sendezeit des letzten Pakets in Millisekunden zurück.
Peer.LastReceiveTime
gibt die Empfangszeit des letzten Pakets in Millisekunden zurück.
Peer.PacketsSent
gibt die Gesamtzahl der während der Verbindung gesendeten Pakete zurück.
Peer.PacketsLost
gibt die Gesamtzahl der Pakete zurück, die während der Verbindung basierend auf der Neuübertragungslogik als verloren galten.
Peer.PacketsThrottle
gibt ein Verhältnis der Paketdrosselung abhängig von den Bedingungen der Verbindung zum Peer zurück.
Peer.BytesSent
gibt die Gesamtzahl der während der Verbindung gesendeten Bytes zurück.
Peer.BytesReceived
gibt die Gesamtzahl der während der Verbindung empfangenen Bytes zurück.
Peer.Data
ruft die vom Benutzer bereitgestellten Daten ab oder legt sie fest. Sollte mit einer expliziten Umwandlung in den entsprechenden Datentyp verwendet werden.
Peer.ConfigureThrottle(uint interval, uint acceleration, uint deceleration, uint threshold)
konfiguriert den Drosselungsparameter für einen Peer. Unzuverlässige Pakete werden von ENet als Reaktion auf die unterschiedlichen Bedingungen der Verbindung zum Peer verworfen. Die Drosselung stellt eine Wahrscheinlichkeit dar, dass ein unzuverlässiges Paket nicht verworfen und somit von ENet an den Peer gesendet werden sollte. Die niedrigste mittlere Umlaufzeit vom Senden eines zuverlässigen Pakets bis zum Empfang seiner Bestätigung wird über einen Zeitraum gemessen, der durch den Intervallparameter in Millisekunden angegeben wird. Wenn eine gemessene Umlaufzeit erheblich kürzer ist als die mittlere Umlaufzeit, die über das Intervall gemessen wurde, wird die Drosselungswahrscheinlichkeit um einen im Beschleunigungsparameter angegebenen Betrag erhöht, um mehr Verkehr zuzulassen. Dies ist ein Verhältnis zur Library.throttleScale
Konstante. Wenn eine gemessene Umlaufzeit erheblich größer ist als die über das Intervall gemessene mittlere Umlaufzeit, wird die Drosselungswahrscheinlichkeit verringert, um den Verkehr um einen im Verzögerungsparameter angegebenen Betrag zu begrenzen, der ein Verhältnis zur Library.throttleScale
Konstante. Wenn die Drosselung den Wert Library.throttleScale
hat, werden keine unzuverlässigen Pakete von ENet verworfen, sodass 100 % aller unzuverlässigen Pakete gesendet werden. Wenn die Drosselung einen Wert von 0 hat, werden alle unzuverlässigen Pakete von ENet verworfen, sodass 0 % aller unzuverlässigen Pakete gesendet werden. Zwischenwerte für die Drosselung stellen mittlere Wahrscheinlichkeiten zwischen 0 % und 100 % dar, dass unzuverlässige Pakete gesendet werden. Die Bandbreitengrenzen der lokalen und fremden Hosts werden berücksichtigt, um eine sinnvolle Grenze für die Drosselungswahrscheinlichkeit zu bestimmen, über die sie selbst unter den besten Bedingungen nicht hinausgehen sollte. Um die Drosselung zu deaktivieren, sollte der Verzögerungsparameter auf Null gesetzt werden. Der Schwellenwertparameter kann verwendet werden, um die Paketdrosselung im Verhältnis zur gemessenen Umlaufzeit in instabilen Netzwerkumgebungen mit hohem Jitter und geringer durchschnittlicher Latenz zu reduzieren, was eine häufige Bedingung für Wi-Fi-Netzwerke an überfüllten Orten ist. Standardmäßig ist der Schwellenwertparameter in Millisekunden auf Library.throttleThreshold
eingestellt.
Peer.Send(byte channelID, ref Packet packet)
stellt ein zu sendendes Paket in die Warteschlange. Gibt bei Erfolg „true“ und bei einem Fehler „false“ zurück.
Peer.Receive(out byte channelID, out Packet packet)
versucht, alle eingehenden Pakete in der Warteschlange aus der Warteschlange zu entfernen. Gibt true zurück, wenn ein Paket aus der Warteschlange entfernt wurde, oder false, wenn keine Pakete verfügbar sind.
Peer.Ping()
sendet eine Ping-Anfrage an einen Peer. ENet pingt in regelmäßigen Abständen automatisch alle verbundenen Peers an. Diese Funktion kann jedoch aufgerufen werden, um häufigere Ping-Anfragen sicherzustellen.
Peer.PingInterval(uint interval)
legt ein Intervall fest, in dem Pings an einen Peer gesendet werden. Pings werden sowohl zur Überwachung der Verfügbarkeit der Verbindung als auch zur dynamischen Anpassung der Drosselung in Zeiten mit geringem Datenverkehr verwendet, sodass die Drosselung bei Verkehrsspitzen angemessen reagiert.
Peer.Timeout(uint timeoutLimit, uint timeoutMinimum, uint timeoutMaximum)
legt einen Timeout-Parameter für einen Peer fest. Die Zeitüberschreitungsparameter steuern, wie und wann ein Peer eine Zeitüberschreitung erleidet, wenn zuverlässiger Datenverkehr nicht bestätigt wird. Timeout-Werte, die im semilinearen Mechanismus verwendet werden, wenn ein zuverlässiges Paket nicht innerhalb einer durchschnittlichen Umlaufzeit plus einer Varianztoleranz bestätigt wird, bis das Timeout einen festgelegten Grenzwert erreicht. Liegt die Zeitüberschreitung somit an dieser Grenze und wurden zuverlässige Pakete gesendet, aber nicht innerhalb einer bestimmten Mindestzeitspanne bestätigt, wird die Verbindung zum Peer getrennt. Wenn alternativ zuverlässige Pakete gesendet, aber für einen bestimmten maximalen Zeitraum nicht bestätigt wurden, wird die Verbindung zum Peer unabhängig vom aktuellen Timeout-Grenzwert getrennt.
Peer.Disconnect(uint data)
fordert eine Trennung von einem Peer an.
Peer.DisconnectNow(uint data)
erzwingt eine sofortige Trennung der Verbindung zu einem Peer.
Peer.DisconnectLater(uint data)
fordert eine Trennung der Verbindung von einem Peer an, jedoch erst, nachdem alle in der Warteschlange befindlichen ausgehenden Pakete gesendet wurden.
Peer.Reset()
trennt einen Peer zwangsweise. Der durch den Peer repräsentierte fremde Host wird über die Trennung nicht benachrichtigt und es kommt zu einer Zeitüberschreitung seiner Verbindung zum lokalen Host.
Enthält einen verwalteten Zeiger auf den Host.
Host.Dispose()
zerstört den Host.
Host.IsSet
gibt einen Status des verwalteten Zeigers zurück.
Host.PeersCount
gibt eine Anzahl verbundener Peers zurück.
Host.PacketsSent
gibt die Gesamtzahl der während der Sitzung gesendeten Pakete zurück.
Host.PacketsReceived
gibt die Gesamtzahl der während der Sitzung empfangenen Pakete zurück.
Host.BytesSent
gibt die Gesamtzahl der während der Sitzung gesendeten Bytes zurück.
Host.BytesReceived
gibt die Gesamtzahl der während der Sitzung empfangenen Bytes zurück.
Host.Create(Address? address, int peerLimit, int channelLimit, uint incomingBandwidth, uint outgoingBandwidth, int bufferSize)
erstellt einen Host für die Kommunikation mit Peers. Die Bandbreitenparameter bestimmen die Fenstergröße einer Verbindung, wodurch die Anzahl der zuverlässigen Pakete begrenzt wird, die zu einem bestimmten Zeitpunkt übertragen werden können. ENet verwirft Pakete gezielt auf bestimmten Seiten einer Verbindung zwischen Hosts, um sicherzustellen, dass die Bandbreite des Hosts nicht überlastet wird. Der Puffergrößenparameter wird verwendet, um die Socket-Puffergröße zum Senden und Empfangen von Datagrammen festzulegen. Alle Parameter sind optional, mit Ausnahme der Adresse und des Peer-Limits in Fällen, in denen die Funktion zum Erstellen eines Hosts verwendet wird, der auf eingehende Verbindungen wartet.
Host.PreventConnections(bool state)
verhindert den Zugriff auf den Host für neue eingehende Verbindungen. Diese Funktion macht den Host im Netzwerk völlig unsichtbar. Jeder Peer, der versucht, eine Verbindung zu ihm herzustellen, wird abgelaufen.
Host.Broadcast(byte channelID, ref Packet packet, Peer[] peers)
stellt ein Paket in die Warteschlange, um es an eine Reihe von Peers oder an alle mit dem Host verbundenen Peers zu senden, wenn der optionale Peers-Parameter nicht verwendet wird. Jede auf Null gesetzte Peer
Struktur in einem Array wird von der Übertragung ausgeschlossen. Anstelle eines Arrays kann auch ein einzelner Peer
an eine Funktion übergeben werden, die von der Übertragung ausgeschlossen wird.
Host.CheckEvents(out Event @event)
sucht nach Ereignissen in der Warteschlange auf dem Host und löst eines aus, falls verfügbar. Gibt > 0 zurück, wenn ein Ereignis ausgelöst wurde, 0, wenn keine Ereignisse verfügbar sind, < 0 bei einem Fehler.
Host.Connect(Address address, int channelLimit, uint data)
initiiert eine Verbindung zu einem fremden Host. Gibt bei Erfolg einen Peer zurück, der den fremden Host darstellt, oder löst bei einem Fehler eine Ausnahme aus. Der zurückgegebene Peer hat die Verbindung erst dann abgeschlossen, wenn Host.Service()
über ein EventType.Connect
-Ereignis benachrichtigt. Das Kanallimit und die vom Benutzer bereitgestellten Datenparameter sind optional.
Host.Service(int timeout, out Event @event)
wartet auf Ereignisse auf dem angegebenen Host und überträgt Pakete zwischen dem Host und seinen Peers. ENet verwendet ein abgefragtes Ereignismodell, um den Benutzer über wichtige Ereignisse zu informieren. ENet-Hosts werden mit dieser Funktion nach Ereignissen abgefragt, wobei ein optionaler Timeout-Wert in Millisekunden angegeben werden kann, um zu steuern, wie lange ENet abfragt. Wenn ein Timeout von 0 angegeben ist, kehrt diese Funktion sofort zurück, wenn keine Ereignisse auszulösen sind. Andernfalls wird 1 zurückgegeben, wenn ein Ereignis innerhalb des angegebenen Timeouts ausgelöst wurde. Diese Funktion sollte regelmäßig aufgerufen werden, um sicherzustellen, dass Pakete gesendet und empfangen werden. Andernfalls kommt es zu Verkehrsspitzen, die zu einer erhöhten Latenz führen. Der auf 0 gesetzte Timeout-Parameter bedeutet Nichtblockierung, was in Fällen erforderlich ist, in denen die Funktion in einer Spielschleife aufgerufen wird.
Host.SetBandwidthLimit(uint incomingBandwidth, uint outgoingBandwidth)
passt die Bandbreitengrenzen eines Hosts in Bytes pro Sekunde an.
Host.SetChannelLimit(int channelLimit)
begrenzt die maximal zulässigen Kanäle zukünftiger eingehender Verbindungen.
Host.SetMaxDuplicatePeers(ushort number)
begrenzt die maximal zulässigen doppelten Peers vom selben Host und verhindert bei Überschreitung die Verbindung. Standardmäßig auf Library.maxPeers
eingestellt, darf nicht kleiner als eins sein.
Host.SetInterceptCallback(InterceptCallback callback)
legt den Rückruf fest, um zu benachrichtigen, wenn ein unformatiertes UDP-Paket abgefangen wird. Anstelle eines Verweises auf einen Delegaten kann ein Zeiger IntPtr
auf einen Rückruf verwendet werden.
Host.SetChecksumCallback(ChecksumCallback callback)
legt den Rückruf fest, um zu benachrichtigen, wann eine Prüfsumme berechnet werden soll. Anstelle eines Verweises auf einen Delegaten kann ein Zeiger IntPtr
auf einen Rückruf verwendet werden.
Host.Flush()
sendet alle in der Warteschlange befindlichen Pakete auf dem angegebenen Host an die dafür vorgesehenen Peers.
Enthält konstante Felder.
Library.maxChannelCount
die maximal mögliche Anzahl von Kanälen.
Library.maxPeers
die maximal mögliche Anzahl von Peers.
Library.maxPacketSize
ist die maximale Größe eines Pakets.
Library.version
ist die aktuelle Kompatibilitätsversion relativ zur nativen Bibliothek.
Library.Time
gibt eine aktuelle lokale monotone Zeit in Millisekunden zurück. Es wird nie zurückgesetzt, solange die Anwendung aktiv bleibt.
Library.Initialize(Callbacks callbacks)
initialisiert die native Bibliothek. Der Callbacks-Parameter ist optional und sollte nur mit einer benutzerdefinierten Speicherzuweisung verwendet werden. Vor Beginn der Arbeiten anzurufen. Gibt bei Erfolg „true“ und bei einem Fehler „false“ zurück.
Library.Deinitialize()
deinitialisiert die native Bibliothek. Sollte nach getaner Arbeit angerufen werden.
Library.CRC64(IntPtr buffers, int bufferCount)
berechnet eine Prüfsumme für nicht verwaltete Puffer.
Dieses Projekt wird gefördert von:
Flughörnchen-Unterhaltung
Square Root Studios
Seltsame Loop-Spiele