private void TCPCallback(IAsyncResult ar) { hostStateDBInProgressTCPConnect inProgressConnect = (hostStateDBInProgressTCPConnect)ar.AsyncState; try { inProgressConnect.biosUpdateSocket.EndConnect(ar); if (inProgressConnect.biosUpdateSocket.Connected) { // Yay, the connection is open! We can tell the caller now. inProgressConnect.biosUpdateSocket = null; inProgressConnect.biosUpdateConnectionEvent.Set(); hostStateDBInProgressTCPConnect val; inProgressTCPConnects.TryRemove(inProgressConnect.biosCurrentThreadState.nodeIP, out val); return; } } catch (SocketException) { } // We failed to connect, either because .EndConnect threw, or because the socket was not connected. Report failure // (if our timeout has expired), or start another connection attempt if it has not. if (!inProgressConnect.biosUpdateDeadline.stillOK) { inProgressConnect.biosUpdateSocket = null; inProgressConnect.biosUpdateTimeoutEvent.Set(); return; } // Otherwise, queue up another connect attempt to just keep retrying. inProgressConnect.biosUpdateSocket.BeginConnect(inProgressConnect.biosUpdateEndpoint, TCPCallback, inProgressConnect); }
public override void setCallbackOnTCPPortOpen(int port, ManualResetEvent onCompletion, ManualResetEvent onError, cancellableDateTime deadline, biosThreadState state) { lock (inProgressTCPConnects) { if (inProgressTCPConnects.ContainsKey(state.nodeIP)) { throw new Exception("operation already in progress"); } hostStateDBInProgressTCPConnect newInProg = new hostStateDBInProgressTCPConnect { biosUpdateEndpoint = new IPEndPoint(IPAddress.Parse(state.nodeIP), port), biosUpdateConnectionEvent = onCompletion, biosUpdateDeadline = deadline, biosUpdateTimeoutEvent = onError, biosCurrentThreadState = state, biosUpdateSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) }; inProgressTCPConnects.GetOrAdd(state.nodeIP, newInProg); newInProg.biosUpdateSocket.BeginConnect(newInProg.biosUpdateEndpoint, TCPCallback, newInProg); } }