본문 바로가기

소켙과 핸들 1 몇 회까지 울궈먹으며 포스팅을 할 지 모르겠지만, 1회라고 써 본다. 김성우씨의 네트워크 프로그래밍 책의 예제에 기반한 CPP 프로그램을 실행하면서 프로세스 익스플로러로 핸들을 확인했다. 예제는 아주 간단하게 소켙을 만들었다가, 다시 죽이는 것이었고, 내가 수정한 부분은 소켓을 만들었다, 닫는 작업을 반복해 보는 것이었다. WSAStartup 함수가 실행된 직후이다. 프로그램의 시작부분이라서 쓰레드가 하나 만들어 지는 것 같고, 레지스트리 키 두개를 읽나부다. 레지스트리 키 명을 확인해 보면 HKLM\SYSTEM\ControSet001\Services\WinSock2\Parameters\NameSpace_Catalog5 와 HKLM\SYSTEM\ControlSet001\Services\WinSock2\P..
socket and device\afd, device\tcp device\ksecdd 간단한 서버 샘플 프로그램을 디버그모드로 돌리면서, 어떻게 핸들이 생성되는지를 process explorer 로 살펴봤다. 아울러 tcpview 로도 언제 뜨는지를 확인해 봤다. 캡쳐한 그림을 참조. winsock 초기화. Procexp 핸들 화면을 보면, 아무런 핸들도 생성되지 않았다. socket 함수가 성공했다. \Device\Afd 핸들이 하나 생성되었음을 확인할 수있다. 아직 소켓만 생성된 상태이고, 이름은 바인드되지 않은 상태이다. bind 함수가 성공하면서, \Device\Tcp 핸들이 하나 생성된다. listen 이 성공하면서, \Device\KsecDD 핸들이 생성되고, 드디어 tcpview 에도 Server.exe 가 9000 포트로 LISTENING에 들어갔다는 게 뜬다. WINDOW..
[TIP] Nirsoft RegDllView Nirsoft 에는 재미있는 툴들이 많이 있다. 이 중에 RegDllView (등록된 DLL 뷰어)란 툴이 있다. 우선 캡쳐화면을 보면 : 현재 시스템에 등록되어 있는 dll/ocx/exe 파일등을 보여주는 툴이다. 액티브엑스를 만들어 테스트할 때, 새로운 버전이 돌고 있는지, 이전 것이 돌고 있는지 헷갈릴 경우가 있었는데, 이 툴을 사용하면, 현재 틍록된 파일의 패쓰까지 보여주고, 등록날짜/시점까지 보여주니까 그런 혼동을 줄일 수 있을 것이다. 이뿐 아니라, CCleaner 에서도 찾아주기는 하지만, 등록은 되어 있는데, 등록된 실제 파일은 존재하지 않는 것도 쉽게 찾을 수 있고, 또, 프로그램 상에서 등록해제도 가능하니까 그 용도로도 쓸 수 있겠다.
[Project Euler 213] 30x30 격자 벼룩 http://projecteuler.net/index.php?section=problems&id=213 30x30 크기의 격자에 벼룩이 있다. 최초에 벼룩은 격자 하나당 하나씩 있고, 한 번 종이 울리면, 격자의 사방으로 튈 수 있다. 가장자리에 있는 벼룩은 바깥으로 나갈 수 없다. 종이 울릴 때마다 각 격자에 벼룩이 몇마리 있을지에 대한 확률분포를 색으로 표현하는 걸 만들어 봤다. 문제가 풀릴려면 부동소수점연산에 의한 오차가 문제가 될 것 같으나, 대략적인 것만 보기 위해서, 그런 건 우선 무시하고 만들어 봤다. 10번 종이 울린 후 확률 분포는 다음과 같다. 색이 흐리면 (하얀색에 가까우면) 확률이 낮은 것이다. vc6.0, mfc 로 짜봤으며, 소스는 여기 있다. 대충 짠거라 책임은 지지 않는다. ..
[Projet Euler 231] 조합의 소인수분해 문제 이항계수 10C3 = 120 이다. 120 = 23 × 3 × 5 = 2 × 2 × 2 × 3 × 5 이고, 2 + 2 + 2 + 3 + 5 = 14 이 된다. 즉 10C3 의 소인수분해하여 나온 인자의 합은 14이다. 20000000C15000000 의 소인수분해 인자의 합을 구하라. http://projecteuler.net/index.php?section=problems&id=231 풀이법. 130! 마지막엔 0이 몇 개 있는지를 풀어내는 방법을 응용한다. 사실 동일한 거다. 일반적으로 m! 에 소수 p가 몇 개 있는지 구하는 식은 [m/p] + [m/(p*p)] + [m/(p*p*p)] + [m/(p*p*p*p)] + ... 이다. nCm = n!/((m!)((n-m)!)) 이다. 소스.
[Project Euler 183] 분할곱 http://projecteuler.net/index.php?section=problems&id=183 N이 양의 정수이고, N을 k 개로 똑같이 나누자. r = N/k 즉, N = r + r + ... + r 이다.P를 이 분할의 곱이라고 한다. 즉, P = r x r x ... x r = rk 예를 들어, 11을 다섯 개로 나누면, 11 = 2.2 + 2.2 + 2.2 + 2.2 + 2.2 이고, P는P = 2.25 = 51.53632 이다. 그리고, N에 대해 M(N) = Pmax , 즉 P가 갖을 수 있는 최대값으로 정의하자. N = 11일 때에는 다섯 개로 나누었을 때, Pmax = (11/4)4 로 최대가 되고, 다시, M(11) = 14641/256 = 57.19140625, 으로 10진수 ..
[Project Euler 204] 해밍수 해밍수(Hamming number)란 5보다 큰 소수 인수를 갖지 않는 양수를 말한다. 즉, 해밍수를 작은 것부터 몇 개 나열하면 다음과 같다. 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15. 108보다 작은 해밍수는 1105개가 있다. 이 개념을 일반화하자. 타잎 n의 일반화된 해밍수를 n보다 큰 소수 인수를 갖지 않는 양수로 정의하자. 즉, 해밍수는 타잎 5의 일반화된 해밍수가 된다. 109보다 작은 타잎 100의 일반화된 해밍수는 몇 개 인가? 재귀로 풀었다. 아래가 코드. #!/usr/bin/env python # Euler Project Problem 204 # Hamming number import math LIM = 10**8 count = 0 for a in range(in..
[Project Euler 123] (p-1)^n + (p+1)^n % p^2 http://projecteuler.net/index.php?section=problems&id=123 pn 이 n번째 소수 ( 2, 3, 5, 7, 11, ..., )이고, r이 (pn1)n + (pn+1)n 를 pn2으로 나눈 나머지라고 하자. 예를 들어, n = 3, p3 = 5 이고, 43 + 63 = 280 5 mod 25 이다. 이 나머지가 109을 넘는 가장 작은 n은 7037이다. 나머지가 1010을 넘는 가장 작은 n을 구하라. #!/usr/bin/env python # Project Euler Problem 123 def remainder0(p, n): return ((p-1)**n + (p+1)**n)%(p*p) def remainder(p, n): ''' p is a prime. r..