Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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");
        }