통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
[Windows Driver Model] 포럼 마을 입니다.
  마을등급 Windows Driver Model   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 조성배 주민 746 since 2006-12-29
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
마을 게시판
등록된 마을 게시판이
없습니다.
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 강좌&팁
 WSK UDP Client Sample   | Other 2013-10-22 오후 2:34:45
 _Zealot_  _Zealot_님께 메시지 보내기_Zealot_님을 내 주소록에 추가합니다._Zealot_님의 개인게시판 가기 번호: 208 추천:0  / 읽음:3,785

http://wskudp.googlecode.com/svn/trunk/ 

간단한 WSK UDP Sample 입니다. 

WSK 로 오면서 Kernel socket 이 이전의 TDI Client 에 비할 수 없이 그야말로 Simple하고 사용하기 쉽게 되었습니다. 

간단히 랩핑해서 거의 응용수준의 소켓 인터페이스를 이용할 수 있게 되었지요...

다만 WDK에서 제공하는 Sample 이 적고 제공되는 문서가 아직은 많지 않은 듯 하네요...

아무튼 드라이버 개발자에게 커널단의 소켓사용이 쉬워진건 대단히 만족스러운 부분인것 같습니다.

랩핑된 WSK 인터페이스를 이용하는 코드만 잠시 보겠습니다.


static PWSK_SOCKET g_UdpSocket = NULL;

VOID
WskudpUnload(
)
{ 
WSKCleanup();
}

DriverEntry(
)
{
NTSTATUS status = STATUS_SUCCESS;
SOCKADDR_IN LocalAddress = {0,};
SOCKADDR_IN RemoteAddress = {0,};

LONG BufferSize = 0;
CHAR GreetMessage[] = "Hello there\r\n";

DriverObject->DriverUnload = WskudpUnload;

status = WSKStartup();

g_UdpSocket = CreateSocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, WSK_FLAG_DATAGRAM_SOCKET);
if (g_UdpSocket == NULL) {
return (status = STATUS_UNSUCCESSFUL);
}

LocalAddress.sin_family = AF_INET;
LocalAddress.sin_addr.s_addr = INADDR_ANY;
//LocalAddress.sin_port = INADDR_PORT;

// Bind Required
status = Bind(g_UdpSocket, (PSOCKADDR)&LocalAddress);
if (!NT_SUCCESS(status)) {
CloseSocket(g_UdpSocket);
return status;
}

RemoteAddress.sin_family = AF_INET;
RemoteAddress.sin_addr.s_addr = HTON_LONG(INADDR_LOOPBACK);
RemoteAddress.sin_port = HTON_SHORT(LOG_PORT);

if (SendTo(g_UdpSocket, GreetMessage, sizeof(GreetMessage)-1, (PSOCKADDR)&RemoteAddress) == sizeof(GreetMessage)-1) {
} else {
}

CloseSocket(g_UdpSocket);

return status;
}


WSKStartup, CreateSocket, Bind, SendTo, CloseSocket, WSKCleanup 은 실제 WSK 인터페이스를 사용하기 쉽게 랩핑한 함수들이며 랩핑의 수준도 아주 얕습니다.

그리고 거의 응용수준의 소켓인터페이스를 사용할 수 있음을 알 수 있죠...

응용소켓과의 차이점은 Bind를 필수적으로 수행해야 한다는 점 입니다. 응용에선 Bind를 하지 않아도 커널계층에서 알아서 Bind를 불러주기 때문에 해줄 필요가 없으나 커널 소켓은 반드시 수행해 주어야 합니다.
즉, Bind 의 과정을 통해 데이터그램소켓과 TransportAddress를 연결시켜주어야 합니다.
그리고 응용에서 사용하는 SOCKADDR_IN 구조체를 동일하게 사용할 수 있는 것도 인상적이죠... 기존 TDI에선 Connection Object 라든지 Address Object 와 같은 객체로 관리해 주어야 하고 복잡했습니다.

각각의 랩퍼함수들은 비동기 IRP 연산을 통해 Kernel Socket Provider 와 통신하는데... 고속의 성능을 요구하는 I/O 가 필요할 시에는 IRP reuse 기법을 사용할 필요가 있습니다. 현재 Sample 은 IRP resuse 를 사용하지 않습니다.

이처럼 이제 커널단에서 네트웍 패킷을 보내는 기능을 넣는 일은 아주 쉬운 일이 되어 버렸습니다.

 

도움이 되시길 바랍니다.

 

 

[코멘트] 좋음
2013-11-11 20:46
 kohahn  kohahn님께 메시지 보내기kohahn님을 내 주소록에 추가합니다.kohahn님의 개인게시판 가기 
정말감사합니다..........많은강좌부탁드려요 ㅠ_ㅠ
저장 취소
[코멘트] 좋음
2013-11-19 14:03
 bjko0oo  bjko0oo님께 메시지 보내기bjko0oo님을 내 주소록에 추가합니다.bjko0oo님의 개인게시판 가기 
좋은 정보 감사합니다~^^
저장 취소
코멘트쓰기
  좋음   놀람   궁금   화남   슬픔   최고   침묵   시무룩   부끄럼   난감
* 코멘트는 500자 이내(띄어쓰기 포함)로 적어주세요.
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.