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); }