/// <summary> /// Starts operation processing. /// </summary> /// <param name="owner">Owner TCP client.</param> /// <returns>Returns true if asynchronous operation in progress or false if operation completed synchronously.</returns> /// <exception cref="ArgumentNullException">Is raised when <b>owner</b> is null reference.</exception> internal bool Start(TCP_Client owner) { if(owner == null){ throw new ArgumentNullException("owner"); } m_pTcpClient = owner; SetState(AsyncOP_State.Active); try{ // Create socket. if(m_pRemoteEP.AddressFamily == AddressFamily.InterNetwork){ m_pSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); m_pSocket.ReceiveTimeout = m_pTcpClient.m_Timeout; m_pSocket.SendTimeout = m_pTcpClient.m_Timeout; } else if(m_pRemoteEP.AddressFamily == AddressFamily.InterNetworkV6){ m_pSocket = new Socket(AddressFamily.InterNetworkV6,SocketType.Stream,ProtocolType.Tcp); m_pSocket.ReceiveTimeout = m_pTcpClient.m_Timeout; m_pSocket.SendTimeout = m_pTcpClient.m_Timeout; } // Bind socket to the specified end point. if(m_pLocalEP != null){ m_pSocket.Bind(m_pLocalEP); } m_pTcpClient.LogAddText("Connecting to " + m_pRemoteEP.ToString() + "."); // Start connecting. m_pSocket.BeginConnect(m_pRemoteEP,this.BeginConnectCompleted,null); } catch(Exception x){ m_pException = x; CleanupSocketRelated(); m_pTcpClient.LogAddException("Exception: " + x.Message,x); SetState(AsyncOP_State.Completed); return false; } // Set flag rise CompletedAsync event flag. The event is raised when async op completes. // If already completed sync, that flag has no effect. lock(m_pLock){ m_RiseCompleted = true; return m_State == AsyncOP_State.Active; } }