例外が発生するメソッドを規定回数だけリトライする

たとえば TcpClient をつかってサーバーに接続する場合、通信経路に問題があったり、サーバーに問題があったりすると接続失敗の例外が発生します。

こういったときには、あらかじめリトライ回数を決めておいて TcpClient.Connect を何回か実施するのが定石です。

下記のコードのように、例外が発生した場合は適切に catch してループしてやり、成功したところで break で脱出してやればいいです。

サンプルコードは、ポートスキャンのようなコードになっていますので、対外的なサーバーには実行テストをしないでください。

using System;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;

namespace aaa
{
	public partial class Form1 : Form
	{

		TcpClient Client;

		public Form1()
		{
			InitializeComponent();
		}

		private void button1_Click( object sender, EventArgs e )
		{
			// 繰り返し回数.
			const int NUM_RETRY = 10;

			// 繰り返すときのウェイトmsec.
			const int MSEC_WAIT = 300; 

			// 接続先のアドレスとポート番号のベース.
			const String STR_IP_ADRS = "192.168.174.20";
			const int PORT_NUM_BASE = 49152;

			Client = new TcpClient();

			for ( int n = 0; n < NUM_RETRY; n++ )
			{

				int port_num = PORT_NUM_BASE + n;

				try
				{
					Client.Connect( STR_IP_ADRS, port_num );

					String str_successs = String.Format( "success: PortNumber is {0}.", port_num );
					this.Text = str_successs;
					Console.WriteLine( str_successs );

					MessageBox.Show( str_successs );
					break; // warning.
				}
				catch
				{

					String str_err = String.Format( "retry{0}, {1}.", n, port_num );
					this.Text = str_err;
					Console.WriteLine( str_err );

					if ( n < NUM_RETRY - 1 )
					{
						// すぐにリトライしても意味ないのでちょっと待つ.
						Thread.Sleep( MSEC_WAIT );
					}

				}

			}

		}
	}
}