원격 컴퓨터 연결 상태 확인 - 빠른 방법 찾기

네트워크 관련해서는 아무것도 모르는 사용자 입장.

C# 프로그램 개발 중, 로컬 및 네트워크에 연결된 다른 컴퓨터들의 파일/디렉토리를 액세스할 필요가 생겼다.

그런데 네트워크가 다운되어 있을 때 예전에 액세스되었던 파일/디렉토리가 여전히 유효한 지 확인하려고
  • Directory.Exists()
  • File.Exists()
들을 사용하면 어플리케이션이 한동안 먹통이 된다.

그래서 원격 컴퓨터의 연결 상태를 빠르게 점검할 수 있는 방법을 찾기 시작하였다.

1. WebRequest (예제 링크)
작은 수의 원격 파일 점검은 무난히 진행됨.
그러나 원격 디렉토리를 점검하는 것은 안된다.

2. Ping 또는 WMI (예제 링크)
WMI를 사용하는 방법은 아예 안되고, ping을 사용하는 방식은 잘 되긴 하는데 원격 컴퓨터가 다운되어 있으면 여전히 어플리케이션 응답이 느리다.

3. SendPingAsync (예제 링크)
ping 방식이긴 한데, 비동기 ping send 함수를 사용하는 것이다.

최종적으로 3번 링크 글의 도움을 받아 C#의 async/await 및 Ping.SendPingAsync()를 사용하여 응답성을 확보할 수 있었다.

using System.Net.NetworkInformation;
// host는 "Uri uri = new Uri(remotePath);" 로 얻을 수 있음
private static async System.Threading.Tasks.Task<bool> CheckConnectivity(string host)
{
bool retVal = false;
try
{
PingReply reply = await pingSender.SendPingAsync(host, timeout, buffer, options);
retVal = (reply.Status == IPStatus.Success);
}
catch
{
retVal = false;
}
return retVal;
}

11644473600000000과 116444736000000000의 차이는?

답: 후자 쪽에 숫자 0 이 하나 더 있다.얼핏 봐서는 쉽게 알 수 없는 차이.  이걸로 인해 고생한 걸 생각하면... 어휴~ OTL오래 전에 Linux용 코드를 Windows로 포팅하면서 윈도우용 gettimeofday()함수가 필요했었는데, 인터넷 검색으로 비교적 쉽게 찾을 수 있었고, 그대로 윈도우용 라이브러리에 추가하여... » 내용보기

Redmine 도움말 링크를 자체 사용자 가이드 링크로 바꾸기

지금 셋업하고 있는 개발환경에 대해 사용자 가이드를 워드 문서와 파워포인트 문서로 만들어오고 있었는데, Redmine이 웹 기반이라서 사용자 가이드도 HTML 문서로 작성하면 수시로 참조하기가 편할 거 같아서 변환 작업 중이다.아래 그림에 표시한 도움말 링크는 원래 www.redmine.org/guide로 연결된다.  그 곳의 정보도 ... » 내용보기

인터뷰 이벤트 준비

인터뷰 이벤트에 대해 알게 된 후 참가해볼 생각으로 나름 조금씩 준비를 하고 있다.더 이상 그 회사로부터 연락이 안 올 거 같다는 생각이 크긴 한데, 그래도 혹시나 싶어서... (Update: 연락은 왔으나, 예상했던 대로 분야가 영 다르다.  인터뷰는 없었던 걸로 해야 할 듯.)인터넷에서 인터뷰 후기 찾아서 읽어보는 것,그리고 이 참... » 내용보기

Redmine-Mercurial 개발 업무 플로우

Redmine 프로젝트 셋업, Mercurial Repository 연결을 지난 10월에 완료 후 지금까지 사용하다보니 어느 정도 개발 업무 프로세스가 잡혀가는 거 같다.사용하고 있는 경험을 바탕으로, 새로 들어오는 신입용을 가정하여 사용자 매뉴얼을 작성하고 있는데, 아래는 이 중 일부 내용들이다.일단 Redmine에서 Issue (일감)의 상태 변화는... » 내용보기