안녕하세요. 언제나 휴일, 언휴예요.
앞에서 SharpPcap 라이브러리를 설치하고 네트워크 인터페이스 장치 목록을 출력하는 콘솔 응용 프로그램을 만들어 테스트 해 보았어요.
이번에는 네트워크 인터페이스 장치에 관하여 추상화한 ICaptureDevice 인터페이스 형식에 관해 간략하게 맛보기로 할게요.
ICaptureDevcie 인터페이스의 멤버는 다음과 같아요.
//추적 장치 인터페이스
public interface ICaptureDevice
{
//설명
string Description { get; }
//추적 필터 http://www.winpcap.org/docs/docs31/html/group__language.html 참고
string Filter { get; set; }
// 가장 최근에 발생한 오류
string LastError { get; }
// 링크 유형
LinkLayers LinkType { get; }
// Mac 주소
PhysicalAddress MacAddress { get; }
//장치 이름
string Name { get; }
// 캡쳐를 시작한 상태인지 여부
bool Started { get; }
//분석
ICaptureStatistics Statistics { get; }
//캡쳐 스레드에서 메인 스레드에 Join하는 최대 시간
TimeSpan StopCaptureTimeout { get; set; }
//추적을 멈추었을 때 수행할 이벤트
event CaptureStoppedEventHandler OnCaptureStopped;
//pCapMode의 Capture 상태에서 새로운 패킷이 도착했을 때 수행할 이벤트
event PacketArrivalEventHandler OnPacketArrival;
//장치에서 패킷 캡쳐 수행(동기 메서드)
void Capture();
// 캡쳐 아답터 닫기
void Close();
//장치에서 패킷을 캡쳐하여 반환
RawCapture GetNextPacket();
//다음 PCAP 헤더와 패킷 데이터의 위치를 구하는 메서드
int GetNextPacketPointers(ref IntPtr header, ref IntPtr data);
//캡쳐 아답터 열기
void Open();
//SharpPcap.DeviceMode를 입력 인자로 전달하여 캡쳐 아답터 열기
void Open(DeviceMode mode);
//장치 모드와 읽기 만료시간 설정하여 캡쳐 아답터 열기
void Open(DeviceMode mode, int read_timeout);
//장치에게 Raw 패킷 전송
void SendPacket(Packet p);
//바이트 배열의 Raw 패킷을 장치로 전송
void SendPacket(byte[] p);
//장치에게 Raw 패킷 전송, 전송할 바이트도 인자로 전달
void SendPacket(Packet p, int size);
// 장치에게 바이트 배열의 Raw 패킷 전송, 전송할 바이트도 인자로 전달
void SendPacket(byte[] p, int size);
// 캡쳐 시작
void StartCapture();
// 캡쳐 멈춤
void StopCapture();
}
여기에서는 이들에 관한 자세한 설명을 하는 것은 큰 의미를 갖지도 효과적이지도 않기에 주석으로 간략하게 어떠한 멤버인지만 소개해 두었어요. 직관적으로 이해할 수 있는 멤버도 있고 그렇지 않은 것들도 있죠. 실제 프로그래밍을 통해 느낄 수 있는 것들을 느껴나가기로 해요.
다음은 ICaptureDevice 멤버들 중에 캡쳐를 시작하지 않은 상태에서 확인할 수 있는 일부 멤버의 정보를 콘솔 화면에 출력하는 코드입니다.
프로젝트를 생성하여 SharpPcap 라이브러리의 닷넷 어셈블리를 참조 추가하는 부분은 앞의 게시글과 같아서 설명을 생략할게요. 그리고 앞으로도 이 부분에 대해서는 별도의 설명은 생략할게요.
using SharpPcap;
using System;
namespace Intro_ICaptureDevice
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("SharpPcap - ICaptureDevice 소개");
//추적할 수 있는 네트워크 인터페이스 목록 참조
CaptureDeviceList devices = CaptureDeviceList.Instance;
//목록의 개수가 0일 때 메시지 출력 및 종료
if (devices.Count == 0)
{
Console.WriteLine("추적할 수 있는 네트워크 인터페이스 장치를 찾을 수 없습니다.");
return;
}
//네트워크 인터페이스 목록 출력
Console.WriteLine("추적 목록");
foreach (ICaptureDevice dev in devices)
{
Console.WriteLine("장치 이름:{0}", dev.Name);
Console.WriteLine("{0}", dev.Description);
Console.WriteLine("필터:{0}", dev.Filter);
Console.WriteLine("캡쳐 시작 여부:{0}", dev.Started);
Console.WriteLine("Stop 캡쳐 타임아웃:{0}초", dev.StopCaptureTimeout.Seconds);
}
Console.Write("엔터를 누르면 종료합니다.");
Console.ReadLine();
}
}
}
이번 게시글의 소스 코드는 크게 설명할 부분은 없어요. 단지 매 번 시작 부분에서 사용할 ICaptureDevice에 어떠한 멤버가 있는지 간략하게 소개하는 것에 의의가 있어요.
다음은 실행 화면입니다.
Slow Start 할게요. ^^;