private void HandleMessageReceived(IPEndPoint receivedFrom, byte[] buffer, int numBytesReceived) { NetworkPeer peer = null; if (peersByEndpoint.TryGetValue(receivedFrom, out peer)) { peer.HandleMessageReceived(buffer, numBytesReceived); } else { if (NeutrinoConfig.LogLevel == NeutrinoLogLevel.Debug) { NeutrinoConfig.Log("Received from potentially new peer at " + receivedFrom); } List <NetworkMessage> initialMessages = new List <NetworkMessage>(msgFactory.Read(buffer, numBytesReceived)); var connectMsg = initialMessages.FirstOrDefault <NetworkMessage>(x => (x is ConnectMessage)); if (connectMsg == null) { NeutrinoConfig.Log("Ignoring peer who didn't send a ConnectMessage with his initial traffic"); } else { var newPeer = NeutrinoConfig.CreatePeer(); newPeer.Init(this, serverSocket, receivedFrom.Address, receivedFrom.Port, ((ConnectMessage)connectMsg).Nickname); peersByEndpoint[(IPEndPoint)receivedFrom] = newPeer; endpointsByPeer[newPeer] = (IPEndPoint)receivedFrom; if (OnPeerConnected != null) { OnPeerConnected(newPeer); } newPeer.HandleMessageReceived(buffer, numBytesReceived); } } }
public void Start() { NeutrinoConfig.Log("Node starting..."); serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); if (ServerHostname == null) { serverSocket.Bind(new IPEndPoint(IPAddress.Any, ServerPort)); } else { serverSocket.Bind(new IPEndPoint(IPAddress.Any, 0)); var addresses = Dns.GetHostAddresses(ServerHostname); if (addresses == null || addresses.Length == 0) { throw new ApplicationException("Unable to resolve server [" + ServerHostname + "]"); } else { IPAddress address = addresses.FirstOrDefault <IPAddress>(x => x.AddressFamily == AddressFamily.InterNetwork); if (address == null) { address = addresses.FirstOrDefault <IPAddress>(x => x.AddressFamily == AddressFamily.InterNetworkV6); } if (address == null) { throw new ApplicationException("Unable to find an IP address for server [" + ServerHostname + "]"); } var serverPeer = NeutrinoConfig.CreatePeer(); serverPeer.Init(this, serverSocket, address, ServerPort, "Server"); IPEndPoint serverEndpoint = new IPEndPoint(address, ServerPort); peersByEndpoint[serverEndpoint] = serverPeer; endpointsByPeer[serverPeer] = serverEndpoint; if (OnPeerConnected != null) { OnPeerConnected(serverPeer); } var connectMsg = msgFactory.Get <ConnectMessage>(); connectMsg.Nickname = localNickname; SendToAll(connectMsg); } } var asyncResult = serverSocket.BeginReceiveFrom(receiveBuffer, 0, NeutrinoConfig.MaxMessageSize, SocketFlags.None, ref receivedEndPoint, new AsyncCallback(HandleMessageReceived), null); if (asyncResult.CompletedSynchronously) { HandleMessageReceived(asyncResult); } NeutrinoConfig.Log("Node started"); }