private void ResultConnect(IAsyncResult ar)
        {
            ConnectFrame       connectFrame = (ar.AsyncState as ConnectFrame);
            AsyncSocketContext desc         = new AsyncSocketContext();

            desc.UniqueId  = connectFrame.Socket.Description.UniqueId;
            desc.ManagedID = connectFrame.Socket.Description.ManagedID;
            desc.NetSender = connectFrame.Socket.Description.NetSender;

            try
            {
                connectFrame.Socket.TCPClient.EndConnect(ar);
                NetReceiver.OnConnectingResult(connectFrame.ReqID, desc, true, null);

                connectFrame.Socket.EnterIO();

                SocketAsyncEventArgs readEventArgs = IOManager.RetreiveEventArgs();// new SocketAsyncEventArgs();//= saeaPool.pop(); // saeaPool from the ASIOManager
                try
                {
                    readEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed);
                    readEventArgs.UserToken  = connectFrame.Socket;
                    bool willRaiseEvent = connectFrame.Socket.TCPClient.Client.ReceiveAsync(readEventArgs);
                    if (!willRaiseEvent)
                    {
                        ProcessReceive(readEventArgs);
                        // 위에서 releaseSocket이 되면, 아래 예외처리는 수행되지 않는다.
                    }
                }
                catch (Exception /*ex*/)
                {
                    // releasesocket을 수정하지 말고 각 문맥에서 releaseSAEA를 호출하자
                    if (null != readEventArgs)
                    {
                        readEventArgs.Completed -= IO_Completed;
                        IOManager.ReleaseSAEA(readEventArgs);
                    }
                    ReleaseSocket(connectFrame.Socket);
                }
            }
            catch (Exception ex)
            {
                lock (this)
                {
                    Sockets.Remove(desc.ManagedID);
                }
                NetReceiver.OnConnectingResult(connectFrame.ReqID, desc, false, ex);
                connectFrame.Socket.TCPClient = null;
            }
        }
        public int ConnectSocket(int reqID, AsyncSocket socket, string ipaddress, int port)
        {
            lock (this)
            {
                if (true == Sockets.ContainsKey(socket.Description.ManagedID))
                {
                    return((int)MyErrorCode.AlreadyPostConnect);
                }

                // 동일한 socket에 대해 connect를 또 요청할수 있으니 미리 컨테이너에 추가하고 하자.
                Sockets.Add(socket.Description.ManagedID, socket);

                ConnectFrame connectFrame = new ConnectFrame();
                connectFrame.ReqID  = reqID;
                connectFrame.Socket = socket;
                connectFrame.Socket.Description.NetSender = this;

                socket.TCPClient = new TcpClient(AddressFamily.InterNetwork);
                socket.TCPClient.BeginConnect(ipaddress, port, new AsyncCallback(ResultConnect), connectFrame);
            }

            return(0);
        }