コード例 #1
0
        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);
        }
コード例 #2
0
        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);
            }
        }