반응형
네트웍 프로그램을 개발할시 Connect 로 접속할때 IP가 살아 있지 않으면 딜레이가 많이 생깁니다.
하나의 IP에 단발성으로 Connect 를 할거면 딜레이가 생겨도 상관이 없지만 여러 IP에 Connect 를 시도 해야 할때는 이 딜레이 때문에 프로그램이 꼭 다운된듯한 느낌이 들어 사용자에게 오해를 불러 일으킬수 있는 요지가 있어 이 딜레이를 없애는게 좋은거 같습니다.
C# 내부 함수로는 이 딜레이를 없애는 방법은 없는거 같습니다. 그럼 방법은 ping 을 날려 보고 살아 있으면 Connect를 하고 죽어있으면 다른 IP로 넘어 가는 방법을 택해야 하는거 같습니다.
C#에서 Ping Test Code 입니다.
참고한자료 : msdn - Ping 클래스(System.Net.NetworkInformation)
하나의 IP에 단발성으로 Connect 를 할거면 딜레이가 생겨도 상관이 없지만 여러 IP에 Connect 를 시도 해야 할때는 이 딜레이 때문에 프로그램이 꼭 다운된듯한 느낌이 들어 사용자에게 오해를 불러 일으킬수 있는 요지가 있어 이 딜레이를 없애는게 좋은거 같습니다.
C# 내부 함수로는 이 딜레이를 없애는 방법은 없는거 같습니다. 그럼 방법은 ping 을 날려 보고 살아 있으면 Connect를 하고 죽어있으면 다른 IP로 넘어 가는 방법을 택해야 하는거 같습니다.
C#에서 Ping Test Code 입니다.
public bool Connect(string ip, int port)
{
try
{
//IP Address 할당
this.ipAddress = IPAddress.Parse(ip);
//TCP Client 선언
this.tcpClient = new TcpClient(AddressFamily.InterNetwork);
Ping pingSender = new Ping();
PingOptions options = new PingOptions();
// Use the default Ttl value which is 128,
// but change the fragmentation behavior.
options.DontFragment = true;
// Create a buffer of 32 bytes of data to be transmitted.
string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
byte[] buffer = Encoding.ASCII.GetBytes(data);
int timeout = 120;
PingReply reply = pingSender.Send(this.ipAddress, timeout, buffer, options);
if (reply.Status == IPStatus.Success)
{
// Ping 성공시 Connect 연결 시도
this.tcpClient.NoDelay = true;
this.tcpClient.Connect(ipAddress, port);
this.ntwStream = tcpClient.GetStream();
}
else
{
// Ping 실패시 강제 Exception
throw new Exception();
}
return true;
}
catch (Exception ex)
{
//MessageBox.Show("Connect Fail... : " + ex);
return false;
}
}
{
try
{
//IP Address 할당
this.ipAddress = IPAddress.Parse(ip);
//TCP Client 선언
this.tcpClient = new TcpClient(AddressFamily.InterNetwork);
Ping pingSender = new Ping();
PingOptions options = new PingOptions();
// Use the default Ttl value which is 128,
// but change the fragmentation behavior.
options.DontFragment = true;
// Create a buffer of 32 bytes of data to be transmitted.
string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
byte[] buffer = Encoding.ASCII.GetBytes(data);
int timeout = 120;
PingReply reply = pingSender.Send(this.ipAddress, timeout, buffer, options);
if (reply.Status == IPStatus.Success)
{
// Ping 성공시 Connect 연결 시도
this.tcpClient.NoDelay = true;
this.tcpClient.Connect(ipAddress, port);
this.ntwStream = tcpClient.GetStream();
}
else
{
// Ping 실패시 강제 Exception
throw new Exception();
}
return true;
}
catch (Exception ex)
{
//MessageBox.Show("Connect Fail... : " + ex);
return false;
}
}
참고한자료 : msdn - Ping 클래스(System.Net.NetworkInformation)
'프로그래밍' 카테고리의 다른 글
[C#]DataGridView Data를 Excel 파일로 저장(Export) (22) | 2010.01.14 |
---|---|
C# Content-Transfer-Encoding 설정 코드 (0) | 2009.07.04 |
모바일 게임 개발 (17) | 2009.04.14 |
Effective C# 정리 (0) | 2009.04.08 |