コード例 #1
0
        private void InitializeNetwork()
        {
            lock (m_initializeLock)
            {
                m_configuration.Lock();

                if (m_status == NetPeerStatus.Running)
                {
                    return;
                }

                if (m_configuration.m_enableUPnP)
                {
                    m_upnp = new NetUPnP(this);
                }

                InitializePools();

                m_releasedIncomingMessages.Clear();
                m_unsentUnconnectedMessages.Clear();
                m_handshakes.Clear();

                // bind to socket
                IPEndPoint iep = null;

                iep = new IPEndPoint(m_configuration.LocalAddress, m_configuration.Port);
                EndPoint ep = (EndPoint)iep;

                m_socket = new PlatformSocket();
                m_socket.ReceiveBufferSize = m_configuration.ReceiveBufferSize;
                m_socket.SendBufferSize    = m_configuration.SendBufferSize;
                m_socket.Blocking          = false;
                m_socket.Bind(ep);
                m_socket.Setup();

                IPEndPoint boundEp = m_socket.LocalEndPoint as IPEndPoint;
                LogDebug("Socket bound to " + boundEp + ": " + m_socket.IsBound);
                m_listenPort = boundEp.Port;

                m_receiveBuffer            = new byte[m_configuration.ReceiveBufferSize];
                m_sendBuffer               = new byte[m_configuration.SendBufferSize];
                m_readHelperMessage        = new NetIncomingMessage(NetIncomingMessageType.Error);
                m_readHelperMessage.m_data = m_receiveBuffer;

                byte[] macBytes = new byte[8];
                NetRandom.Instance.NextBytes(macBytes);

#if IS_FULL_NET_AVAILABLE
                try
                {
                    System.Net.NetworkInformation.PhysicalAddress pa = NetUtility.GetMacAddress();
                    if (pa != null)
                    {
                        macBytes = pa.GetAddressBytes();
                        LogVerbose("Mac address is " + NetUtility.ToHexString(macBytes));
                    }
                    else
                    {
                        LogWarning("Failed to get Mac address");
                    }
                }
                catch (NotSupportedException)
                {
                    // not supported; lets just keep the random bytes set above
                }
#endif
                byte[] epBytes  = BitConverter.GetBytes(boundEp.GetHashCode());
                byte[] combined = new byte[epBytes.Length + macBytes.Length];
                Array.Copy(epBytes, 0, combined, 0, epBytes.Length);
                Array.Copy(macBytes, 0, combined, epBytes.Length, macBytes.Length);
#if WINDOWS_PHONE
                SHA1 s = new SHA1Managed();
                m_uniqueIdentifier = BitConverter.ToInt64(s.ComputeHash(combined), 0);
#else
                m_uniqueIdentifier = BitConverter.ToInt64(SHA1.Create().ComputeHash(combined), 0);
#endif

                m_status = NetPeerStatus.Running;
            }
        }
コード例 #2
0
        private void ExecutePeerShutdown()
        {
            VerifyNetworkThread();

            LogDebug("Shutting down...");

            // disconnect and make one final heartbeat
            var list = new List <NetConnection>(m_handshakes.Count + m_connections.Count);

            lock (m_connections)
            {
                foreach (var conn in m_connections)
                {
                    if (conn != null)
                    {
                        list.Add(conn);
                    }
                }

                lock (m_handshakes)
                {
                    foreach (var hs in m_handshakes.Values)
                    {
                        if (hs != null)
                        {
                            list.Add(hs);
                        }
                    }

                    // shut down connections
                    foreach (NetConnection conn in list)
                    {
                        conn.Shutdown(m_shutdownReason);
                    }
                }
            }

            // one final heartbeat, will send stuff and do disconnect
            Heartbeat();

            lock (m_initializeLock)
            {
                try
                {
                    if (m_socket != null)
                    {
                        // Wrapped this in a try for MonoGame.  I think we are bombing here
                        //  because there are no clients connecting during tests.
                        try {
                            m_socket.Shutdown(SocketShutdown.Receive);
                        }
                        catch (Exception socketException) {
                            LogDebug("Exception trying to Shutdown Socket: " + socketException.Message);
                        }
                        m_socket.Close(2);                         // 2 seconds timeout
                    }
                    if (m_messageReceivedEvent != null)
                    {
                        m_messageReceivedEvent.Set();
                        m_messageReceivedEvent.Close();
                        m_messageReceivedEvent = null;
                    }
                }
                finally
                {
                    m_socket = null;
                    m_status = NetPeerStatus.NotRunning;
                    LogDebug("Shutdown complete");
                }

                m_receiveBuffer = null;
                m_sendBuffer    = null;
                m_unsentUnconnectedMessages.Clear();
                m_connections.Clear();
                m_handshakes.Clear();
            }

            return;
        }