| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- using System;
- using System.Threading.Tasks;
- using Log;
- namespace ENet
- {
- public sealed class ClientHost : Host
- {
- public ClientHost(uint peerLimit = NativeMethods.ENET_PROTOCOL_MAXIMUM_PEER_ID,
- uint channelLimit = 0, uint incomingBandwidth = 0,
- uint outgoingBandwidth = 0, bool enableCrc = true)
- {
- if (peerLimit > NativeMethods.ENET_PROTOCOL_MAXIMUM_PEER_ID)
- {
- throw new ArgumentOutOfRangeException("peerLimit");
- }
- CheckChannelLimit(channelLimit);
- this.host = NativeMethods.enet_host_create(IntPtr.Zero, peerLimit, channelLimit, incomingBandwidth, outgoingBandwidth);
- if (this.host == IntPtr.Zero)
- {
- throw new ENetException(0, "Host creation call failed.");
- }
- if (enableCrc)
- {
- this.EnableCrc();
- }
- }
- public Task<Peer> ConnectAsync(
- Address address, uint channelLimit = NativeMethods.ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT, uint data = 0)
- {
- CheckChannelLimit(channelLimit);
- var tcs = new TaskCompletionSource<Peer>();
- ENetAddress nativeAddress = address.Struct;
- IntPtr peerPtr = NativeMethods.enet_host_connect(this.host, ref nativeAddress, channelLimit, data);
- if (peerPtr == IntPtr.Zero)
- {
- throw new ENetException(0, "Host connect call failed.");
- }
- var peer = new Peer(peerPtr);
- this.PeersManager.Add(peerPtr, peer);
- peer.PeerEvent.Connected += e => tcs.TrySetResult(peer);
- return tcs.Task;
- }
- public void RunOnce(int timeout = 0)
- {
- this.OnExecuteEvents();
- if (this.Service(timeout) < 0)
- {
- return;
- }
- Event ev;
- while (this.CheckEvents(out ev) > 0)
- {
- switch (ev.Type)
- {
- case EventType.Connect:
- {
- var peer = this.PeersManager[ev.PeerPtr];
- peer.PeerEvent.OnConnected(ev);
- peer.PeerEvent.Connected = null;
- break;
- }
- case EventType.Receive:
- {
- var peer = this.PeersManager[ev.PeerPtr];
- peer.PeerEvent.OnReceived(ev);
- peer.PeerEvent.Received = null;
- break;
- }
- case EventType.Disconnect:
- {
- ev.EventState = EventState.DISCONNECTED;
- var peer = this.PeersManager[ev.PeerPtr];
- PeerEvent peerEvent = peer.PeerEvent;
- this.PeersManager.Remove(ev.PeerPtr);
- peer.Dispose();
- if (peerEvent.Received != null)
- {
- peerEvent.OnReceived(ev);
- }
- else
- {
- peerEvent.OnDisconnect(ev);
- }
- break;
- }
- }
- }
- }
-
- public void Start(int timeout = 0)
- {
- while (isRunning)
- {
- RunOnce(timeout);
- }
- }
- }
- }
|