如果对方服务器开启,则连接正常,如下—>  private void bt_Connect_Click(object sender, EventArgs e)
        {
            int port = 0;
            IPAddress serverIP;
            IPEndPoint serverFullAddr;            port = 123;            serverIP = IPAddress.Parse("219.126.131.83");            serverFullAddr = new IPEndPoint(serverIP,port);            socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            
            socket.Connect(serverFullAddr);
        }但是,有时对方服务器并没有启动,既最后一行代码提示—>由于目标机器积极拒绝,无法连接。 219.126.131.83:123我现在的目标是—>不管对方服务器开启没开启,程序都去连接,连接失败的话也不会报错,而是每阁一段时间去尝试连接一次.我现在的想法是->当连接失败时,触发Timer,在Timer中每隔些时间去连接一次,直到连接成功后,Timer终止.代码如下—> private void bt_Connect_Click(object sender, EventArgs e)
        {
            int port = 0;
            IPAddress serverIP;
            IPEndPoint serverFullAddr;            port = 123;            serverIP = IPAddress.Parse("219.126.131.83");            serverFullAddr = new IPEndPoint(serverIP,port);            socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            
            try
            {
            socket.Connect(serverFullAddr);
            }
            catch
            {
            timer1.start();
            }
        }          private void timer1_Tick(object sender, EventArgs e)
        {
            int port = 0;
            IPAddress serverIP;
            IPEndPoint serverFullAddr;            port = 123;            serverIP = IPAddress.Parse("219.126.131.83");            serverFullAddr = new IPEndPoint(serverIP,port);            socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            
            try
            {
            socket.Connect(serverFullAddr);
            }
            catch
            {
            return;
            }
            timer1.stop();
        }

解决方案 »

  1.   

    这个源代码完成的功能是当一个主机没有响应的时候,自动跳转到其他主机上,继续发生或者说是传递以前的消息,让系统以最健壮的方式运行。它适用的场景如下:1.连接第一个有效的主机 2. 如果连接失败,尝试连接其他的主机 3. 以同样的顺序发送消息 4. 如果,没有一个主机可用的话,备份消息,等到主机有效时再发送。void OnDoWork(object sender, DoWorkEventArgs e)
    {
        while (_messages.Count > 0)
        {
            TcpClient client = new TcpClient();
            try
            {
                client.Connect(IPAddress.Parse(_activeHost.IP), _activeHost.Port);            string message = _messages.Dequeue();            byte[] buffer = Encoding.Unicode.GetBytes(message);            client.Client.Send(buffer);            Log(new MessageEventArgs(message, _messages.Count, MessageStatus.Success, null));
            }
            catch (SocketException ex)
            {
                _hasFailures = true;
                string[] messages = _messages.ToArray();
                Log(new MessageEventArgs(null, _messages.Count, MessageStatus.Failure, ex.Message));            _messages.Clear();
                //save array to file
                StringBuilder allMessages = new StringBuilder();
                foreach (string message in messages)
                {
                    allMessages.Append(message + Environment.NewLine);
                }
                File.AppendAllText(_filepath, allMessages.ToString(), Encoding.UTF8);
                //failover
                _activeHost = FindHost();
            }
            finally
            {
                if (client.Connected)
                {
                    client.Client.Shutdown(SocketShutdown.Both);
                    client.Client.Disconnect(false);
                }
            }
        }
        _backgroundWorker = null;
    }
    http://www.codesoso.com/code/Socket-Multi-Host.aspx