programming2009. 4. 13. 17:13

TCP 프로그래밍을 하다보면 잊지 말고 해줘야 할일이 좀비 세션에 대한 처리 이다.

좀비 세션은 서버나 클라이언트가 정상적으로 종료 하지 않았는데(보통 렌선이 뽑혔다거나, 방화벽에서 일부러 세션을 종료시켰다거나)도 불구하고 종료되어 서버나 클라이언트는 세션이 종료되었는지 모르는 상태(Close 이벤트를 못받는다.)의 세션을 말한다.

이러한 예외를 처리하기 위해 주기적으로 내가 살아있다고 신호를 보내줘야 하는데 이런 작업을 TCP 소켓에서 제공한다.
 
방법도 아주 간단다. 소켓의 옵션을 변경만 해주면 알어서 다 해준다. KEEPALIVE 에 대한 옵션은 두가지가 있다.

SIO_KEEPALIVE_VALS, SO_KEEPALIVE 이다. 이 두개의 옵션이 다른점은 SO_KEEPALIVE 옵션을 적용하면 시스템 레지스트리 값을 변경하므로 그 시스템의 모든 소켓의 KEEPALIVE 속성이 변경하게 된다. 그래서 이 옵션의 사용은 권장하지 않는다. SIO_KEEPALIVE_VALS 는 그와 달리 특정 SOCKET 에만 설정된다.

SO_KEEPALIVE 사용은 권장되지 않으므로 SIO_KEEPALIVE_VALS 간단한 샘플을 보자


#include <mstcpip.h>

tcp_keepalive tcpkl;
tcpkl.onoff = 1; // KEEPALIVE ON
tcpkl.keepalivetime = 1000; // 1초 마다 KEEPALIVE 신호를 보내겠다. (Default 는 2시간이다)
tcpkl.keepaliveinterval = 1000; // keepalive 신호를 보내고 응답이 없으면 1초마다 재 전송하겠다. (ms tcp 는 10회 재시도 한다)

WSAIoctl(SOCKET,
             SIO_KEEPALIVE_VALS, &tcpkl, sizeof(tcp_keepalive),
             0,0, &dwRet, NULL, NULL);

요렇게만 해주면 좀비세션이 되었을때 Close 나 Receive 이벤트를 받을수 있다.

% windows 2000 이상의 OS 에서만 동작한다. 참고
Posted by 상현달
programming2009. 4. 7. 11:27
1, 원격 디버깅할 PC 에 Remote Debugger 폴더를 복사 한다.("C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\Remote Debugger")

2, 원격에서 복사한 Remote Debugger 폴더 안에 "msvsmon.exe" 를 실행한다.

3, 실행한 후 "도구-옵션" 창에서 다음과 같이 설정한다.

% 이렇게 설정을 해야 인증 관련 오류가 발생하지 않는다. (보안이 필요한 경우 Default 값인 Windows 인증 으로 사용하길 ...)

4, 이제 비쥬얼 스튜디오에서 디버깅 정보를 설정한다.

5, 이제 디버깅을 시작하면 원격에서 디버깅이 시작된다
% 원격의 바이너리가 릴리즈라도 디버그는 되지만 정상적인 디버그 정보를 기대하지 마시길~
Posted by 상현달
programming2009. 4. 6. 18:53

VC80(VS2005) 부터 DLL Hell 문제를 해결하기 위해  배포방식이 조금 변경되었다.
DLL Hell 은 간단히 정리하면 하나의 PC 에 하나의 DLL 만 존재 할수 밖에 업어서 생기는 문제이다.
어떤 문제가 생기나 ? 제일 많이 발생하는 문제는 DLL 의 버전 문제이다. 한 PC 에 하나의 DLL 만 설치되면 버전 충돌문제가 발생할수 있다. 이런 문제를 해결하기 위해 같은 DLL 이라도 버전별로 설치해 놓고 쓰고 싶다는 얘기 이다.

하여튼 각설하고 그럼 어떻게 배포 해야 하나 ?

1, VC80 으로 배포 하면 기본적으로 Manifest 파일이 생성된다.  ("./Release/Test.exe.intermediate.manifest")

2, Manifest 파일을 열어본다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

3, Test.exe 가 실행되기 위해서는 VC90.DebugCRT 파일이 필요하단 말이당. (MFC 로 만들면 몇가지 더 생긴다.)
"C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT"
이경로에 파일을 복사해서 Test.exe 파일가 같이 놓으면 실행하는데 문제가 없을 것이다.

4, 참고로 시스템에 설치되는 Manifest 파일과 DLL 들은 "C:\WINDOWS\WinSxS" 안에 있으니 배포할때 참고 하면되겠다. 

Posted by 상현달
programming2009. 4. 3. 21:29
운영중인 라이브러리를 64bit 용으로 요청 받았다.
근데 이 라이브러리가 사용하는 라이브러리가 또 엄청 많다 ㅡㅡ 난감.....
그래서 이번기회에 작업하면서 정리를 하려 했으나, 좋은 링크를 발견해서 그냥 링크로 대신할란다. ㅡㅡ

http://www.microsoft.com/korea/msdn/msdnmag/issues/06/05/x64/default.aspx#S8

그리고 추가 링크 하나더 MSDN 링크

http://msdn.microsoft.com/ko-kr/library/h2k70f3s.aspx

그냥 링크만 남기기는 좀 아쉬워서 간단 요약해 본당 ㅎㅎ.

1, 먼저 64비드 빌드 환경을 설정한다. ("구성 관리자" 에서 "활성 솔루션 플랫폼" 에서 x64 추가)
2, 주소값을 int, long, DWORD 에 저장한 것이 있는지 확인한다. 그리고 DWORD_PTR 로 변경한다.
3, printf, sprintf 에 포인터를 %d, %lx 등 으로 사용한 부분은 %p 로 변경한다. 64 비트 변수를 포맷팅 하려면 %I64d 와 같이 prefix I 를 이용해 사이즈를 지정해준다.
4, size_t, time_t ptrdiff_t는 64비트 Windows 운영 체제에서 64비트 값이다. 32비트 값 고정으로 사용하려면 __time32_t 등을 사용해야 한다.
5, win32 코드와 win64 코드가 구분지어져야 한다면 _WIN64 전처리기를 사용하여 작업한다.

64 bit 로 빌드 한 후 배포에 문제가 있다면 다음을 참고한다.

http://www.serious-code.net/moin.cgi/RedistributingVisualCppRunTimeLibrary

% VC80 의 DLL & Manifest 파일은 "C:\Program Files\Microsoft Visual Studio 8\VC\redist" 에 있다. 입맛 맞게 가져다 쓰면될듯 ...
Posted by 상현달
programming2008. 9. 8. 16:19

printf 나 va_list 사용할때마다 맨날 까먹어서 이번 기회에 한번 정리해 놓자


제어문자 (Escape Sequence)

\n:  다음줄로 이동
\r:   현재줄에서 제일 앞으로 이동
\a:  내부 스피커를 통해 벨소리 출력
\t:   탭키 누른 효과
\\: \ 문자 출력
\': ' 문자 출력
\": " 문자 출력

서식 문자

c: 문자 (char)

d, i: 부호있는 10진수 (short, int)

ld: 부호있는 10진수 (long)

u: 부호없는 10진수 (int)

o: 8진수 (int)

x: 16진수 a~f 출력 (int)

X: 16진수 A~F 출력 (int)

I64d: 부호 있는 10진수 (INT64)

I64u: 부호 없는 10진수 (UINT64)

f: 고정 소수점 표기법 사용 (double)

e: 부동 소수점 표기법 사용 e 사용(double)

E: 부동 소수점 표기법 사용 E 사용(double)

g: 고정 또는 부동 소수점 표기법 중 길이가 짧은 서식 사용 (double)

G: g와 같지만 E 사용 (double)

s: 문자열


% 뒤 괄호 안의 변수 타입은 참고용이고 꼭 그것만 가능한건 아니다.

Posted by 상현달