/// <summary> /// 启动 /// </summary> private void Run() { if (isDisposed == true) { throw new ObjectDisposedException("Black Martix Server is Disposed"); } var myEnd = new IPEndPoint(IPAddress.Any, Port); if (!Host.Equals("any",StringComparison.CurrentCultureIgnoreCase)) { if (String.IsNullOrEmpty(Host)) { var p = Dns.GetHostEntry(Dns.GetHostName()); foreach (var s in p.AddressList) { if (!s.IsIPv6LinkLocal && s.AddressFamily != AddressFamily.InterNetworkV6) { myEnd = new IPEndPoint(s, Port); break; } } } else { try { myEnd = new IPEndPoint(IPAddress.Parse(Host), Port); } catch (FormatException) { var p = Dns.GetHostEntry(Dns.GetHostName()); foreach (var s in p.AddressList) { if (!s.IsIPv6LinkLocal) myEnd = new IPEndPoint(s, Port); } } } } sock = new Socket(myEnd.AddressFamily, SocketType.Stream, ProtocolType.Tcp); sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1); sock.Bind(myEnd); sock.Listen(50); sock.SendTimeout = SendTimeout; sock.ReceiveTimeout = ReceiveTimeout; BuffManagers = new BufferManager(GetMaxUserConnect , GetMaxBufferSize, GetMaxBufferSize); //BuffManagers.Init(); SocketAsynPool = new SocketAsyncEventArgsPool(GetMaxUserConnect); for (int i = 0; i < GetMaxUserConnect; i++) { SocketAsyncEventArgs socketasyn = new SocketAsyncEventArgs(); socketasyn.Completed += new EventHandler<SocketAsyncEventArgs>(Asyn_Completed); SocketAsynPool.Push(socketasyn); } Accept(); }
/// <summary> /// �湹�캯����ʼ������ /// </summary> public virtual void Initiate(int maxDatagramsize, int id, Socket socket, BufferManager bufferManager) { base.ID = id; base.LoginTime = DateTime.Now; m_bufferManager = bufferManager; m_bufferBlockIndex = bufferManager.GetBufferBlockIndex(); if (m_bufferBlockIndex == -1) // û�пտ�, �½� { m_receiveBuffer = new byte[m_bufferManager.ReceiveBufferSize]; m_sendBuffer = new byte[m_bufferManager.SendBufferSize]; } else { m_receiveBuffer = m_bufferManager.ReceiveBuffer; m_sendBuffer = m_bufferManager.SendBuffer; } m_maxDatagramSize = maxDatagramsize; m_socket = socket; m_datagramQueue = new Queue<byte[]>(); if (m_socket != null) { IPEndPoint iep = m_socket.RemoteEndPoint as IPEndPoint; if (iep != null) { base.IP = iep.Address.ToString(); } } }