Last active
March 19, 2020 06:33
-
-
Save Vincenz099/dc2ebd56a211a1c7ff4c9d382dbea0c1 to your computer and use it in GitHub Desktop.
enet thread example sniplet
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| private volatile bool isRunning = true; | |
| private Thread serverThread; | |
| private void ServerThread() | |
| { | |
| enetHost = new Host(); | |
| enetAddress = new Address(); | |
| enetAddress.Port = enetPort; | |
| enetHost.Create(enetAddress, maxClients, 8); | |
| ENet.Event netEvent; | |
| EnetServerPacketCommand serverPacketCommand; | |
| EnetServerBroadcastPacketCommand packetCommand; | |
| while (isRunning) | |
| { | |
| while (EnetServerBroadcastPacketCommandQueue.TryDequeue(out packetCommand)) | |
| { | |
| enetHost.Broadcast(packetCommand.Channel, ref packetCommand.Packet); | |
| } | |
| bool polled = false; | |
| while (!polled) | |
| { | |
| if (enetHost.CheckEvents(out netEvent) <= 0) | |
| { | |
| if (enetHost.Service(15, out netEvent) <= 0) | |
| break; | |
| polled = true; | |
| } | |
| switch (netEvent.Type) | |
| { | |
| case ENet.EventType.None: | |
| break; | |
| case ENet.EventType.Connect: | |
| var peer = netEvent.Peer; | |
| var connevent = new EnetServerConnEvent | |
| { | |
| PeerID = peer.ID, | |
| IP = peer.IP | |
| }; | |
| EnetServerConnEventQueue.Enqueue(connevent); | |
| break; | |
| case ENet.EventType.Disconnect: | |
| var peerdis = netEvent.Peer; | |
| var disconnevent = new EnetServerDisconnEvent | |
| { | |
| PeerID = peerdis.ID, | |
| IsTimeOut = false | |
| }; | |
| EnetServerDisconnEventQueue.Enqueue(disconnevent); | |
| break; | |
| case ENet.EventType.Timeout: | |
| var peertime = netEvent.Peer; | |
| var timeevent = new EnetServerDisconnEvent | |
| { | |
| PeerID = peertime.ID, | |
| IsTimeOut = true | |
| }; | |
| EnetServerDisconnEventQueue.Enqueue(timeevent); | |
| break; | |
| case ENet.EventType.Receive: | |
| var receivepacket = new EnetServerReceivePacket | |
| { | |
| Packet = netEvent.Packet, | |
| Channel = netEvent.ChannelID, | |
| PeerID = netEvent.Peer.ID | |
| }; | |
| EnetServerReceivePacketQueue.Enqueue(receivepacket); | |
| break; | |
| } | |
| } | |
| } | |
| enetHost.Flush(); | |
| enetHost.Dispose(); | |
| } | |
| // some main thread call: | |
| private void ServerEmptyQueues() | |
| { | |
| EnetServerConnEvent connEvent; | |
| while (EnetServerConnEventQueue.TryDequeue(out connEvent)) | |
| { | |
| Debug.Log("Enet Client connected (ID: " + connEvent.PeerID + ", IP: " + connEvent.IP + ")"); | |
| } | |
| EnetServerDisconnEvent disconnEvent; | |
| while (EnetServerDisconnEventQueue.TryDequeue(out disconnEvent)) | |
| { | |
| if (disconnEvent.IsTimeOut) | |
| { | |
| Debug.Log("Client timeout (ID: " + disconnEvent.PeerID + ")"); //", IP: " + netEvent.Peer.IP + | |
| enetdisconnect(disconnEvent.PeerID, false); | |
| } | |
| else | |
| { | |
| Debug.Log("Client disconnected (ID: " + disconnEvent.PeerID + ")"); // + ", IP: " + netEvent.Peer.IP + | |
| enetdisconnect(disconnEvent.PeerID, true); | |
| } | |
| } | |
| EnetServerReceivePacket receivePacket; | |
| while (EnetServerReceivePacketQueue.TryDequeue(out receivePacket)) | |
| { | |
| var packet = receivePacket.Packet; | |
| packet.CopyTo(recBuffer); | |
| // do shit with data. | |
| packet.Dispose(); | |
| } | |
| // enqueue new packets like this: | |
| Packet packet = default(Packet); | |
| packet.Create(sendbytearray, bytecount, packetflags); | |
| var broadpack = new EnetServerBroadcastPacketCommand | |
| { | |
| Channel = ChannelID, | |
| Packet = packet | |
| }; | |
| EnetServerBroadcastPacketCommandQueue.Enqueue(broadpack); | |
| // ring buffer declarations: | |
| private struct EnetServerBroadcastPacketCommand | |
| { | |
| public byte Channel; | |
| public Packet Packet; | |
| } | |
| private RingBuffer<EnetServerBroadcastPacketCommand> EnetServerBroadcastPacketCommandQueue = new RingBuffer<EnetServerBroadcastPacketCommand>(128); | |
| // from enet to mainthread. | |
| private struct EnetServerConnEvent | |
| { | |
| public uint PeerID; | |
| public string IP; | |
| } | |
| private RingBuffer<EnetServerConnEvent> EnetServerConnEventQueue = new RingBuffer<EnetServerConnEvent>(64); | |
| private struct EnetServerDisconnEvent | |
| { | |
| public uint PeerID; | |
| public bool IsTimeOut; | |
| } | |
| private RingBuffer<EnetServerDisconnEvent> EnetServerDisconnEventQueue = new RingBuffer<EnetServerDisconnEvent>(64); | |
| private struct EnetServerReceivePacket | |
| { | |
| public byte Channel; | |
| public uint PeerID; | |
| public Packet Packet; | |
| } | |
| private RingBuffer<EnetServerReceivePacket> EnetServerReceivePacketQueue = new RingBuffer<EnetServerReceivePacket>(32768); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment