Skip to content

Instantly share code, notes, and snippets.

@Vincenz099
Last active March 19, 2020 06:33
Show Gist options
  • Select an option

  • Save Vincenz099/dc2ebd56a211a1c7ff4c9d382dbea0c1 to your computer and use it in GitHub Desktop.

Select an option

Save Vincenz099/dc2ebd56a211a1c7ff4c9d382dbea0c1 to your computer and use it in GitHub Desktop.
enet thread example sniplet
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