본문 바로가기

프로그래밍/미분류

소켙과 핸들 1

반응형
몇 회까지 울궈먹으며 포스팅을 할 지 모르겠지만, 1회라고 써 본다.

김성우씨의 네트워크 프로그래밍 책의 예제에 기반한 CPP 프로그램을 실행하면서 프로세스 익스플로러로 핸들을 확인했다. 예제는 아주 간단하게 소켙을 만들었다가, 다시 죽이는 것이었고, 내가 수정한 부분은 소켓을 만들었다, 닫는 작업을 반복해 보는 것이었다.
사용자 삽입 이미지

WSAStartup 함수가 실행된 직후이다. 프로그램의 시작부분이라서 쓰레드가 하나 만들어 지는 것 같고, 레지스트리 키 두개를 읽나부다.
사용자 삽입 이미지

레지스트리 키 명을 확인해 보면 HKLM\SYSTEM\ControSet001\Services\WinSock2\Parameters\NameSpace_Catalog5 와 HKLM\SYSTEM\ControlSet001\Services\WinSock2\Parameters\Protocol_Catalog9 이다.
사용자 삽입 이미지

처음으로 socket 함수가 실행되면서, 생성됐다. \Device\Afd 가 만들어졌다. 쓰레드 핸들은 왜 또 하나가 늘어났는지 모르겠다. 위쪽에 있는 (2944): 1612 쓰레드는 디버거인 비주얼 스튜디오의 것이다.

윈도우즈 인터널즈의 Afd에 대한 설명을 인용하자. 윈도우즈 인터널즈 4판 13장 네트워킹
명명된 파이프와 메일슬롯 API처럼 윈속은 Windows I/O 모델과 통합하고 소켓을 나타내기 위해 파일 핸들을 사용한다. 이 지원은 커널 모드 파일 시스템 드라이버의 도움을 필요로 하므로, Msafd.dll은 소켓 기반 함수를 구현하기 위해 보조 함수 드라이버(AFD; Ancillary Function Driver, \Windows\System32\Drivers\Afd.sys)의 서비스를 사용한다. AFD는 TDI 클라이언트이고, TDI IRP를 프로토콜 드라이버에 전송하여 메시지를 보내고 받는 것과 같은 네트워크 소켓 작업을 수행한다.
사용자 삽입 이미지

closesocket 을 하면서 \Device\Afd 가 죽는다. 위에서 생성됐던 쓰레드 핸들은 안 닫힌다. 왜지?
사용자 삽입 이미지

루프른 돌면서 다시 socket 을 했을 때에는 \Device\Afd 만 생성된다. 처음에 생성될 때 열었던 쓰레드 핸들을 다시 열지는 않는다. 루프를 도는 동안, 계속 저 \Device\Afd 만 만들어졌다, 죽었다를 반복한다.
사용자 삽입 이미지

WSACleanup 을 하면서, WSAStartup 에서 열었던 레지스트리키 핸들을 닫는다.

아, 재미있어라.
728x90

'프로그래밍 > 미분류' 카테고리의 다른 글

Private but Shareable  (0) 2009.04.24
[번역] AD 도메인으로 연결하기  (0) 2009.04.15
socket and device\afd, device\tcp device\ksecdd  (0) 2009.04.10
[복잡]  (0) 2008.12.05
비트 인버트는 선형적인가?  (0) 2008.11.27