/// <summary>
 /// Detach the given client from the server management
 /// </summary>
 /// <param name="clientSocket">the client to detach</param>
 /// <returns></returns>
 public bool DetachClient(IocpTcpSocket clientSocket)
 {
     lock (m_listLock)
     {
         return(m_socketList.Remove(clientSocket));
     }
 }
 /// <summary>
 /// Default constructor
 /// </summary>
 /// <param name="packetType">packet type</param>
 /// <param name="packet">packet</param>
 /// <param name="offset">offset</param>
 /// <param name="size">size of packet in byte</param>
 /// <param name="iocpTcpClient">client socket</param>
 /// <param name="dataPacket">data packet for send</param>
 public PacketTransporter(PacketType packetType, Packet packet, int offset, int size, IocpTcpSocket iocpTcpClient, Packet dataPacket = null)
 {
     m_packetType    = packetType;
     m_packet        = packet;
     m_offset        = offset;
     m_size          = size;
     m_iocpTcpClient = iocpTcpClient;
     m_dataPacket    = dataPacket;
 }
        /// <summary>
        /// Accept callback function
        /// </summary>
        /// <param name="result">result</param>
        private static void onAccept(IAsyncResult result)
        {
            IocpTcpServer server = result.AsyncState as IocpTcpServer;
            TcpClient     client = null;

            try
            {
                if (server.m_listener != null)
                {
                    client = server.m_listener.EndAcceptTcpClient(result);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + " >" + ex.StackTrace);
                if (client != null)
                {
                    try
                    {
                        client.Client.Shutdown(SocketShutdown.Both);
                        //client.Client.Disconnect(true);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message + " >" + e.StackTrace);
                    }
                    client.Close();
                    client = null;
                }
            }

            try
            {
                if (server.m_listener != null)
                {
                    server.m_listener.BeginAcceptTcpClient(new AsyncCallback(IocpTcpServer.onAccept), server);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + " >" + ex.StackTrace);
                if (client != null)
                {
                    client.Close();
                }
                server.StopServer();
                return;
            }

            if (client != null)
            {
                IocpTcpSocket socket = new IocpTcpSocket(client, server);
                lock (server.m_listLock)
                {
                    if (server.MaxSocketCount != SocketCount.Infinite && server.m_socketList.Count > server.MaxSocketCount)
                    {
                        socket.Disconnect();
                        return;
                    }
                }
                if (server.CallBackObj == null)
                {
                    socket.Disconnect();
                    return;
                }

                if (!server.Acceptor.OnAccept(server, socket.IPInfo))
                {
                    socket.Disconnect();
                }
                else
                {
                    INetworkSocketCallback socketCallbackObj = server.Acceptor.GetSocketCallback();
                    socket.CallBackObj = socketCallbackObj;
                    socket.Start();
                    lock (server.m_listLock)
                    {
                        server.m_socketList.Add(socket);
                    }
                    server.OnServerAccepted(server, socket);
                }
            }
        }
 /// <summary>
 /// Detach the given client from the server management
 /// </summary>
 /// <param name="clientSocket">the client to detach</param>
 /// <returns></returns>
 public bool DetachClient(IocpTcpSocket clientSocket)
 {
     lock (m_listLock)
     {
         return m_socketList.Remove(clientSocket);
     }
 }
        /// <summary>
        /// Accept callback function
        /// </summary>
        /// <param name="result">result</param>
        private static void onAccept(IAsyncResult result)
        {
            IocpTcpServer server = result.AsyncState as IocpTcpServer;
            TcpClient client=null;
            try { client = server.m_listener.EndAcceptTcpClient(result); }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + " >" + ex.StackTrace);
                if (client != null)
                {
                    try
                    {
                        client.Client.Shutdown(SocketShutdown.Both);
                        //client.Client.Disconnect(true);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message + " >" + e.StackTrace);
                    }
                    client.Close();
                    client = null;
                }
            }
            
            try { server.m_listener.BeginAcceptTcpClient(new AsyncCallback(IocpTcpServer.onAccept), server); }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + " >" + ex.StackTrace); 
                if (client != null)
                    client.Close();
                server.StopServer(); 
                return;
            }

            if (client != null)
            {
                IocpTcpSocket socket = new IocpTcpSocket(client, server);
                INetworkSocketCallback socketCallbackObj = server.CallBackObj.OnAccept(server, socket.IPInfo);
                if (socketCallbackObj == null)
                {
                    socket.Disconnect();
                }
                else
                {
                    socket.CallBackObj=socketCallbackObj;
                    socket.Start();
                    lock (server.m_listLock)
                    {
                        server.m_socketList.Add(socket);
                    }
                }
            }
           

        }
 /// <summary>
 /// Default constructor
 /// </summary>
 /// <param name="packetType">packet type</param>
 /// <param name="packet">packet</param>
 /// <param name="offset">offset</param>
 /// <param name="size">size of packet in byte</param>
 /// <param name="iocpTcpClient">client socket</param>
 /// <param name="dataPacket">data packet for send</param>
 public PacketTransporter(PacketType packetType, Packet packet, int offset, int size, IocpTcpSocket iocpTcpClient, Packet dataPacket = null)
 {
     m_packetType = packetType;
     m_packet = packet;
     m_offset = offset;
     m_size = size;
     m_iocpTcpClient = iocpTcpClient;
     m_dataPacket = dataPacket;
     m_callBackObj = iocpTcpClient.m_callBackObj;
 }