例外が発生するメソッドを規定回数だけリトライする
たとえば 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 );
}
}
}
}
}
}