using System.Net; using System.Net.Sockets; using LiteNetLib.Utils; namespace LiteNetLib { /// /// Type of message that you receive in OnNetworkReceiveUnconnected event /// public enum UnconnectedMessageType { BasicMessage, Broadcast } /// /// Disconnect reason that you receive in OnPeerDisconnected event /// public enum DisconnectReason { ConnectionFailed, Timeout, HostUnreachable, NetworkUnreachable, RemoteConnectionClose, DisconnectPeerCalled, ConnectionRejected, InvalidProtocol, UnknownHost, Reconnect, PeerToPeerConnection, PeerNotFound } /// /// Additional information about disconnection /// public struct DisconnectInfo { /// /// Additional info why peer disconnected /// public DisconnectReason Reason; /// /// Error code (if reason is SocketSendError or SocketReceiveError) /// public SocketError SocketErrorCode; /// /// Additional data that can be accessed (only if reason is RemoteConnectionClose) /// public NetPacketReader AdditionalData; } public interface INetEventListener { /// /// New remote peer connected to host, or client connected to remote host /// /// Connected peer object void OnPeerConnected(NetPeer peer); /// /// Peer disconnected /// /// disconnected peer /// additional info about reason, errorCode or data received with disconnect message void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo); /// /// Network error (on send or receive) /// /// From endPoint (can be null) /// Socket error void OnNetworkError(IPEndPoint endPoint, SocketError socketError); /// /// Received some data /// /// From peer /// DataReader containing all received data /// Number of channel at which packet arrived /// Type of received packet void OnNetworkReceive(NetPeer peer, NetPacketReader reader, byte channelNumber, DeliveryMethod deliveryMethod); /// /// Received unconnected message /// /// From address (IP and Port) /// Message data /// Message type (simple, discovery request or response) void OnNetworkReceiveUnconnected(IPEndPoint remoteEndPoint, NetPacketReader reader, UnconnectedMessageType messageType); /// /// Latency information updated /// /// Peer with updated latency /// latency value in milliseconds void OnNetworkLatencyUpdate(NetPeer peer, int latency); /// /// On peer connection requested /// /// Request information (EndPoint, internal id, additional data) void OnConnectionRequest(ConnectionRequest request); } public interface IDeliveryEventListener { /// /// On reliable message delivered /// /// /// void OnMessageDelivered(NetPeer peer, object userData); } public interface INtpEventListener { /// /// Ntp response /// /// void OnNtpResponse(NtpPacket packet); } public interface IPeerAddressChangedListener { /// /// Called when peer address changed (when AllowPeerAddressChange is enabled) /// /// Peer that changed address (with new address) /// previous IP void OnPeerAddressChanged(NetPeer peer, IPEndPoint previousAddress); } public class EventBasedNetListener : INetEventListener, IDeliveryEventListener, INtpEventListener, IPeerAddressChangedListener { public delegate void OnPeerConnected(NetPeer peer); public delegate void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo); public delegate void OnNetworkError(IPEndPoint endPoint, SocketError socketError); public delegate void OnNetworkReceive(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod deliveryMethod); public delegate void OnNetworkReceiveUnconnected(IPEndPoint remoteEndPoint, NetPacketReader reader, UnconnectedMessageType messageType); public delegate void OnNetworkLatencyUpdate(NetPeer peer, int latency); public delegate void OnConnectionRequest(ConnectionRequest request); public delegate void OnDeliveryEvent(NetPeer peer, object userData); public delegate void OnNtpResponseEvent(NtpPacket packet); public delegate void OnPeerAddressChangedEvent(NetPeer peer, IPEndPoint previousAddress); public event OnPeerConnected PeerConnectedEvent; public event OnPeerDisconnected PeerDisconnectedEvent; public event OnNetworkError NetworkErrorEvent; public event OnNetworkReceive NetworkReceiveEvent; public event OnNetworkReceiveUnconnected NetworkReceiveUnconnectedEvent; public event OnNetworkLatencyUpdate NetworkLatencyUpdateEvent; public event OnConnectionRequest ConnectionRequestEvent; public event OnDeliveryEvent DeliveryEvent; public event OnNtpResponseEvent NtpResponseEvent; public event OnPeerAddressChangedEvent PeerAddressChangedEvent; public void ClearPeerConnectedEvent() { PeerConnectedEvent = null; } public void ClearPeerDisconnectedEvent() { PeerDisconnectedEvent = null; } public void ClearNetworkErrorEvent() { NetworkErrorEvent = null; } public void ClearNetworkReceiveEvent() { NetworkReceiveEvent = null; } public void ClearNetworkReceiveUnconnectedEvent() { NetworkReceiveUnconnectedEvent = null; } public void ClearNetworkLatencyUpdateEvent() { NetworkLatencyUpdateEvent = null; } public void ClearConnectionRequestEvent() { ConnectionRequestEvent = null; } public void ClearDeliveryEvent() { DeliveryEvent = null; } public void ClearNtpResponseEvent() { NtpResponseEvent = null; } public void ClearPeerAddressChangedEvent() { PeerAddressChangedEvent = null; } void INetEventListener.OnPeerConnected(NetPeer peer) { if (PeerConnectedEvent != null) PeerConnectedEvent(peer); } void INetEventListener.OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo) { if (PeerDisconnectedEvent != null) PeerDisconnectedEvent(peer, disconnectInfo); } void INetEventListener.OnNetworkError(IPEndPoint endPoint, SocketError socketErrorCode) { if (NetworkErrorEvent != null) NetworkErrorEvent(endPoint, socketErrorCode); } void INetEventListener.OnNetworkReceive(NetPeer peer, NetPacketReader reader, byte channelNumber, DeliveryMethod deliveryMethod) { if (NetworkReceiveEvent != null) NetworkReceiveEvent(peer, reader, channelNumber, deliveryMethod); } void INetEventListener.OnNetworkReceiveUnconnected(IPEndPoint remoteEndPoint, NetPacketReader reader, UnconnectedMessageType messageType) { if (NetworkReceiveUnconnectedEvent != null) NetworkReceiveUnconnectedEvent(remoteEndPoint, reader, messageType); } void INetEventListener.OnNetworkLatencyUpdate(NetPeer peer, int latency) { if (NetworkLatencyUpdateEvent != null) NetworkLatencyUpdateEvent(peer, latency); } void INetEventListener.OnConnectionRequest(ConnectionRequest request) { if (ConnectionRequestEvent != null) ConnectionRequestEvent(request); } void IDeliveryEventListener.OnMessageDelivered(NetPeer peer, object userData) { if (DeliveryEvent != null) DeliveryEvent(peer, userData); } void INtpEventListener.OnNtpResponse(NtpPacket packet) { if (NtpResponseEvent != null) NtpResponseEvent(packet); } void IPeerAddressChangedListener.OnPeerAddressChanged(NetPeer peer, IPEndPoint previousAddress) { if (PeerAddressChangedEvent != null) PeerAddressChangedEvent(peer, previousAddress); } } }