정리

GetQueuedCompletionStatus의 0 transferred bytes (1)

저장소/VC++

내가 틀리지 않았당께!! 아닌가? 



원문 출처 : http://javawork.egloos.com/2265358


 ERROR_NETNAME_DELETED는 에러 번호로는 64번이고 한글로는 "지정된 네트워크 이름을 더 이상 사용할 수 없습니다." 정도로 해석됩니다. 구글에 ERROR_NETNAME_DELETED로 검색해보면 거의 IOCP와 관련된 글들이 나옵니다. 어떤 상황에서 이 에러를 만나게 되는지, 해결책은 무엇인지 적어봅니다.

 보통 IOCP에서 소켓 끊어짐의 상징은 0 byte read 입니다. 0 byte read가 통보되는 시점은 상대방 소켓에서 closesocket() 혹은 shutdown() 함수를 호출한 시점입니다. 즉, 상대방이 closesocket() 혹은 shutdown() 을 호출하지 않고 종료해버리면 일반적으로 0 byte read는 발생하지 않습니다. 이렇게 0 byte read가 발생하지 않은 상태에서 read() 혹은 write()를 시도하면 상대는 이미 종료 되었으므로 ERROR_NETNAME_DELETED 에러가 나게 됩니다. 이러한 경우를 우아한 종료와는 반대되는 개념으로 HardClose라고 합니다.

ACE에서는 ACE_Asynch_Read_Stream.read() 나 ACE_Asynch_Write_Stream.write() 에서 0 이 아닌 다른 정수를 리턴하고(에러), ACE_OS::last_error() 하면 64번이 리턴됩니다. ACE를 사용하지 않는 경우에는 Read/Write 혹은 GetQueuedCompletionStatus에서  에러가 발생하고 GetLastError하면 64번이 리턴되겠죠.

다른 분의 설명으로는 accept에서도 발생가능한데, AccpEx호출 시 backlog에 있던 소켓이 accept가 되기 전에 접속을 끊어도 이 에러가 발생한다고 합니다.  아마도 이 글이 그러한 상황인 것 같습니다.

요약하면 ERROR_NETNAME_DELETED가 발생하는 경우는 상대방이 HardClose한 상황 이므로 그냥 종료처리하면 된다 입니다. 

동기화 - Interlocked 함수들

저장소/VC++

동기화에 종종 사용되는 Interlocked 함수들.

생각보다 자주 사용되는데 모르면 못 쓰는거지 뭐 ㅋ

잘 보고 나중에 간략히 정리하도록 하자.


Interlocked Variable Access

http://msdn.microsoft.com/en-us/library/windows/desktop/ms684122(v=vs.85).aspx


Interlocked Operations (요건 닷넷 버전)

http://msdn.microsoft.com/en-us/library/sbhbke0y.aspx



동기화 - Spin Lock

저장소/VC++

그냥 그런가보다 하고 넘긴 것들이 왜 이제야 눈에 들어오나.. 나태하다.

정리는 나중에,

영어 해석 잘 못하니까 아래 포스팅 우선 참고.

출처는 출처를 타고~~ 룰루랄라~~


참고 : http://choijaehyuk.com/236

참고 : http://dev.heartsavior.net/315

참고 : http://devnote.tistory.com/142

참고 : http://serverdown.tistory.com/239


다음 API에 대한 내용은 MSDN 보고 숙지


InitializecriticalSectionAndSpinCount


InterlockedCompareExchange(32-bit value compare)

InterlockedCompareExchange64(64-bit value compare)

InterlockedCompareExchangePointer(Pointer value compare)


더 많은 내용은 검색검색.

Lockless, Lock-free 기법도 찾아보자.


근데 적어놓고 다시 안 보면 fail ㅋ

WMI(Windows Management Instrumentation) C++ Sample

저장소/VC++
쓸 일이 별로 없을거라 생각했는데 이제야 찾아보게 된다.

MSDN Sample : http://msdn.microsoft.com/en-us/library/aa394558(v=vs.85).aspx


'저장소 > VC++' 카테고리의 다른 글

동기화 - Interlocked 함수들  (0) 2012.11.09
동기화 - Spin Lock  (0) 2012.11.09
Windows에서 openssl 빌드 방법2  (0) 2012.11.05
Windows에서 openssl 빌드 방법1  (0) 2012.11.05
[펌] Windwos에서 openssl 빌드  (0) 2012.11.05

Windows에서 openssl 빌드 방법2

저장소/VC++

원문 출처 : http://blog.iseohyun.co.kr/120128190854


파일 생성 경로 등 설정


1) x86 static library

perl Configure VC-WIN32 --openssldir=D:\OpenSSL32_x86 no-shared no-asm threads no-idea no-mdc2 no-rc5


2) x86 static debug library

perl Configure debug-VC-WIN32 --openssldir=D:\OpenSSL32_x86_debug no-shared no-asm threads no-idea no-mdc2 no-rc5


3) x64 static library

perl Configure VC-WIN64A --openssldir=D:\OpenSSL32_x64 no-shared no-asm threads no-idea no-mdc2 no-rc5


4) x64 static debug library

perl Configure debug-VC-WIN64A --openssldir=D:\OpenSSL32_x64_debug no-shared no-asm threads no-idea no-mdc2 no-rc5


라이센스 문제로 인한 IDEA, MDC2, RC5를 제외시키는 방법은 위와 같고 그냥 출력 경로를 바꾸려면 아래와 같이 해라.


perl Configure VC-WIN32 --openssldir=D:\OpenSSL_x86

perl Configure VC-WIN64A --openssldir=D:\OpenSSL_x64



OpenSSL은 잘알려진 각종 암호화, 서명과 같은 툴을 이용하는 도구이다. 인증서에 사용되는 RSA서명은 물론, 암호화에 자주 사용되는 AES나 DES를 사용할 수 있으며, 기타 다른 알고리즘을 구현하기에도 용이하다. 오픈 소스를 사용하기 앞서, 이번 포스트에서는 배포되는 오픈소스의 라이브러리를 생성하는 과정을 소개한다.

(참고로, 라이브러리를 수정할 것이 아니라면 라이브러리 작성 과정을 생략하고 라이브러리만 설치(또는 카피copy)하면 된다.

다시말해 아래 과정을 다 수행 할 필요없이 첨부파일을 다운받아 설치만해도 된다는 뜻이다. 과정 8만 진행)

 

I. 재료구하기

소개에 앞서 라이브러리를 만드는 재료를 구하기 바란다.

※ 링크의 자료는 각 사이트의 업로드나 리뉴얼에 따라서 바뀔 수 있다. 댓글로 남겨놓으면 수정하도록 한다.

 

OpenSSL프로그램 다운로드

http://www.openssl.org/source/openssl-0.9.8k.tar.gz

 

ActivePerl 다운로드

http://downloads.activestate.com/ActivePerl/Windows/5.10/ActivePerl-5.10.0.1004-MSWin32-x86-287188.msi

(출처 :

http://blog.daum.net/_blog/BlogView.do?blogid=0Idq4&articleno=8429385&admin=&refequery=openssl+install#ajax_history_home)

 

2008 무료 다운로드(학생용)

http://www.microsoft.com/express/download/#webInstall

 

인스톨 공식 문서는 OpenSSL을 다운로드 한 뒤 해당 폴더에서 찾을 수 있다.

C:\openssl-0.9.8k\INSTALL를 워드 파일로 열거나(영문)

C:\openssl-0.9.8k\INSTALL.W32를 워드 파일로 연다.(영문)

 

II. 라이브러리 작성

재료가 다 구해졌다면 라이브러리를 만들어보자.

1. ActivePerl 설치

 

2. OpenSSL 압축해제C:\openssl-0.9.8k 에 압축해제.

 

3. 컴파일환경 설정(Optional)

☞ C:\openssl-0.9.8k\Configure 파일에 VC-WIN32라는 파일을 로드한다컴파일 결과 파일이 C:\OpenSSL로 설치 되도록 한다.

 명령어 : perl Configure VC-WIN32 --openssldir=C:\OpenSSL

 

4. 어셈블리 사용여부.

☞ 어셈블리어를 사용하지 않는 경우 ms\do_ms.batNASM

☞ 어셈블리어를 사용하는 경우 ms\do_nasm.batMASM

☞ 어셈블리어를 사용하는 경우 ms\do_masm.bat

 

5. 소스 수정

☞ 소스파일 최상단에 위치한 주석문에 특수문자가 포함되어 있어서 컴파일 오류가 발생하기 때문에소스파일 가장 위에 주석문을 제거하고 저장함.

(/* v3_pci.c -*- mode:C; c-file-style: "eay" -*- */)

penssl-0.9.8k\crypto\x509v3\v3_pci.c

openssl-0.9.8k\crypto\x509v3\v3_pcia.c

삭제 하지 않으면 다음과 같은 오류 발생 :

NMAKE : fatal error U1077: '"path\cl.exe"' : return code '0x2

 

6. 환경변수에 nmake.exe의 위치를 추가 시킴.

목적 : nmake 실행

내컴퓨터 우클릭 -> 속성 -> 시스템 등록정보 -> 환경변수 -> XXX에 관한 사용자 변수(U)에서 PATH선택 -> 편집 -> 마지막에 “;” 추가후 입력

) C:\Program Files\ESTsoft\ALZip; C:\Program Files\OpenVPN\bin; C:\openssl-0.9.8k;

C:\Program Files\Microsoft Visual Studio 9.0\VC\bin

 

7. 컴파일

☞ Command창에서 다음을 순서대로 입력.

입력하기 전에 다음과 같은 명령을 수행한다.

C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat

(C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat 와 내용 동일)

인스톨 시행전에 vcvarsall.bat을 실행하지 않았을 때 다음과 같은 문제 발생

NMAKE : fatal error U1077: '"path\cl.exe"' : return code '0xc0000135'

ans) path경로 설정문제

[참고] http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvc/thread/325b5459-c469-40d0-bf6d-e3356a2f14cd/


x64의 경우

C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\amd64\vsvars64.bat 를 실행해야 한다.

안 그러면 아래와 같은 에러 발생

NMAKE : fatal error U1077: '"...\link.exe"' : return code '0x458'

[참고] http://www.mentby.com/younie-bradford/need-help-trying-to-build-openssl-in-windows-x64.html

 

7.1. nmake -f ms\ntdll.mak (2~3분 소요)

컴파일을 하고 실행이 정상적으로 완료되면 C:\openssl-0.9.8k\out32dll에 파일이 생성된다.

 

7.2. nmake -f ms\ntdll.mak test (1~2분 소요)

컴파일 된 데이터를 테스트 한다.

 

7.3 nmake -t ms\ntdll.mak install (1~2분 소요)

include, lib, bin을 생성한다.

 

8. 다음 파일을 사용하는 방법에는 2가지 방법이 있다.

8.1. 라이브러리에 직접 추가하는 방법

☞ 각각의 파일을 경로에 붙인다.

) C:\OpenSSL\bin libeay32.dll, openssl.exe, ssleay32.dll

 ->C:\Program Files\Microsoft Visual Studio 9.0\VC\bin

 ->C:\Program Files\Microsoft Visual Studio\VC98\Bin

C:\OpenSSL\include openssl폴더

 ->C:\Program Files\Microsoft Visual Studio 9.0\VC\include

 ->C:\Program Files\Microsoft Visual Studio\VC98\include

C:\OpenSSL\lib libeay32.lib, ssleay32.lib

 ->C:\Program Files\Microsoft Visual Studio 9.0\VC\lib

 ->C:\Program Files\Microsoft Visual Studio\VC98\lib

 

8.2. 라이브러리 경로를 추가 하는 방법

 Microsoft Visual Studio 6.0

Tools -> Option -> Directories -> Include files -> C:\OpenSSL\include 추가

Executable files -> C:\OpenSSL\bin 추가Library files -> C:\OpenSSL\lib 추가

project -> settings -> Link ->Object/library modules:ssleay32.lib libeay32.lib 추가

(미실행시 에러)

1>test.obj : error LNK2019: unresolved external symbol _RAND_bytes referenced in function _main

 

☞ Microsoft Visual Studio 2008

Tools -> Options -> VC++ Directories -> Show directories for: ->Include files -> C:\OpenSSL\include 추가

Executable files -> C:\OpenSSL\bin 추가

Library files -> C:\OpenSSL\lib 추가

(프로젝트이름) Property Pages -> Configuration Properties -> Linker -> Command Line -> Additional options : -> ssleay32.lib libeay32.lib추가

'저장소 > VC++' 카테고리의 다른 글

동기화 - Spin Lock  (0) 2012.11.09
WMI(Windows Management Instrumentation) C++ Sample  (0) 2012.11.09
Windows에서 openssl 빌드 방법1  (0) 2012.11.05
[펌] Windwos에서 openssl 빌드  (0) 2012.11.05
ifstream 한글 문제  (0) 2012.10.30

Windows에서 openssl 빌드 방법1

저장소/VC++

권진호님 블로그

http://blog.daum.net/aswip/8429385



1. OpenSSL 다운로드

    http://www.openssl.org/source/openssl-0.9.8k.tar.gz


2. ActivePerl 설치

    openssl 라이브러리를 컴파일 하기 위해서는 perl 이 필요합니다.

    http://downloads.activestate.com/ActivePerl/Windows/5.10/ActivePerl-5.10.0.1004-MSWin32-x86-287188.msi

    다운로드 받은 ActivePerl을 설치합니다. (※ 설치시 Next 버튼만 계속 누르면 됩니다. ^^)


3. 전반적인 컴파일 환경 구축

    압축이 해제된 디렉토리로 이동하여, 아래와 같이 명령어를 입력합니다.

 

    1) x86 static library

        perl Configure VC-WIN32 --openssldir=C:\OpenSSL-x86 no-shared no-asm threads no-idea no-mdc2 no-rc5

 

    2) x86 static debug library

        perl Configure debug-VC-WIN32 --openssldir=C:\OpenSSL-x86-debug no-shared no-asm threads no-idea no-mdc2 no-rc5

 

    3) x64 static library

        perl Configure VC-WIN64A --openssldir=C:\OpenSSL-x64 no-shared no-asm threads no-idea no-mdc2 no-rc5

 

    4) x64 static debug library

        perl Configure debug-VC-WIN64A --openssldir=C:\OpenSSL-x64-debug no-shared no-asm threads no-idea no-mdc2 no-rc5

 

    ※ 참고로 --openssldir=C:\OpenSSL 과 같이 입력하면 "C:\OpenSSL" 디렉토리에 라이브러리가 설치됩니다.

    ※ no-idea no-mdc2 no-rc5 는 암호화 알고리즘 라이센스 문제로 인하여 빌드에서 제외시킵니다.

   

    


4. 구체적인 컴파일 환경 구축

    컴파일 환경은 다음과 같이 3가지 유형중 한 가지를 선택하여 사용이 가능합니다.

 

    1) x86

        - 어셈블리어를 사용하지 않는 경우       ms\do_ms.bat          

        - NASM 어셈블리어를 사용하는 경우    ms\do_nasm.bat    

        - MASM 어셈블리어를 사용하는 경우   ms\do_masm.bat

 

    2) x64

        - 어셈블리어를 사용하지 않는 경우     ms\do_win64a.bat

 

    3) Itanium
        - 어셈블리어를 사용하지 않는 경우 ms\do_win64i.bat

 

 

    만약, 어셈블리어를 사용하지 않을 경우에는, 아래와 같이 명령어를 입력합니다.

   


5. 소스 수정

    윈도우 환경에서는 아래와 같은 파일을, OpenSSL을 컴파일 하기 이전에 수정해 주어야 합니다.

    (아마 다음 OpenSSL 버전에서는 필요없는 과정이 될 수도 있겠군요.. ^^;;)


    1) openssl-0.9.8k\crypto\x509v3\v3_pci.c

        소스파일 최상단에 위치한 주석문에 특수문자가 포함되어 있어서 컴파일 오류가 발생하기 때문에,

        소스파일 가장 위에 주석문을 제거하고 저장함.


    2) openssl-0.9.8k\crypto\x509v3\v3_pcia.c

        소스파일 최상단에 위치한 주석문에 특수문자가 포함되어 있어서 컴파일 오류가 발생하기 때문에,

        소스파일 가장 위에 주석문을 제거하고 저장함.


    3) openssl-0.9.8k\crypto\cversion.c

        cversion.c 105 번째 라인을 아래와 같이 수정함.

        [수정 전] return "OPENSSLDIR: \"" OPENSSLDIR "\"";

        [수정 후] return "OPENSSLDIR: \" OPENSSLDIR \"";


    4) openssl-0.9.8k\crypto\cryptlib.h

        cryptlib.h 84~86번째 라인을 아래와 같이 수정함.

        


    5) openssl-0.9.8k\crypto\opensslconf.h 

        opensslconf.h 107~108번째 라인을 아래와 같이 수정함.

       

 

 

6. Makefile 수정

    디버그 모드로 빌드할 때만..

   

    


 

 

7. 컴파일 및 설치

    정적 라이브러리 빌드 인 경우 : nmake -f ms\nt.mak install

    동적 라이브러리 빌드 인 경우 : nmake -f ms\ntdll.mak install

    만약, 동적 라이브러리 컴파일 및 설치를 위해서는 아래와 같이 명령어를 입력합니다.

   

 

 

8. 설치 결과

    첨부된 "OpenSSL.zip"파일은 윈도우 환경에서 OpenSSL을 컴파일한 결과물을 압축한 파일입니다.

 

     OpenSSL.zip

 

 

9. 주의사항

 

    I've compiled a program under Windows and it crashes: why?


    This is usually because you've missed the comment in INSTALL.W32.

    Your application must link against the same version of the Win32 C-Runtime against which your openssl libraries were linked.

    The default version for OpenSSL is /MD - "Multithreaded DLL".

 

    If you are using Microsoft Visual C++'s IDE (Visual Studio), in many cases,

    your new project most likely defaulted to "Debug Singlethreaded" - /ML.

 

    This is NOT interchangeable with /MD and your program will crash, typically on the first BIO related read or write operation.

 

    For each of the six possible link stage configurations within Win32,

    your application must link against the same by which OpenSSL was built.

 

    If you are using MS Visual C++ (Studio) this can be changed by:


    1. Select Settings... from the Project Menu.
    2. Select the C/C++ Tab.
    3. Select "Code Generation from the "Category" drop down list box
    4. Select the Appropriate library (see table below) from the "Use run-time library" drop down list box. 

       Perform this step for both your debug and release versions of your application

       (look at the top left of the settings panel to change between the two)

       Single Threaded               /ML       -  MS VC++ often defaults to this for the release version of a new project.
       Debug Single Threaded     /MLd     -  MS VC++ often defaults to this for the debug version of a new project.
       Multithreaded                   /MT
       Debug Multithreaded         /MTd
       Multithreaded DLL             /MD      -  OpenSSL defaults to this.
       Debug Multithreaded DLL   /MDd

 

       ※ Note that debug and release libraries are NOT interchangeable.

       If you built OpenSSL with /MD your application must use /MD and cannot use /MDd.


       As per 0.9.8 the above limitation is eliminated for .DLLs.

       OpenSSL .DLLs compiled with some specific run-time option [we insist on the default /MD] can be deployed with application   

       compiled with different option or even different compiler.

 

       But there is a catch! Instead of re-compiling OpenSSL toolkit, as you would have to with prior versions,

       you have to compile small C snippet with compiler and/or options of your choice.

 

       The snippet gets installed as <install-root>/include/openssl/applink.c and

       should be either added to your application project or simply #include-d in one [and only one] of your application source files.

 

       Failure to link this shim module into your application manifests itself as fatal "no OPENSSL_Applink" run-time error.

 

       An explicit reminder is due that in this situation [mixing compiler options]

       it is as important to add CRYPTO_malloc_init prior first call to OpenSSL.


[펌] Windwos에서 openssl 빌드

저장소/VC++
Windows 환경에서 openssl 빌드

openssl 다운로드 : http://www.openssl.org/



ifstream 한글 문제

저장소/VC++

ifstream을 이용해서 파일 좀 열어볼까 했더니 경로에 한글이 들어가니 문제가 생긴다.

내부에서 문자열 변환할 때 제대로 된 변환이 되지 않는 것을 디버깅 해보면 확인할 수 있다.


해결 방법은 locale 설정으로 가능하다고 한다.


#include <locale>

setlocale(LC_ALL, "Korean");


이따구로 할거라면 걍 fopen을 쓰고 만다 내가!!!!

[STL] string, wstring의 assign을 이용한 문자열 변환

저장소/VC++

string, wstring의 assign 함수를 이용한 MBCS <-> Wide Char 변환의 문제점.


unicode 안 된다. ㅡㅜ

경로 처리할 때 폴더 이름에 한글이 들어갔더니만 안 된다. 야호!!!

어째 쓰기 쉽더니만... 확인 좀 해볼걸.

미처 생각 못했다. 아흑... ㅠㅠ


MultiByteToWideChar/WideCharToMultiByte를 쓰거나 ATL의 W2A/A2W를 이용해라.


그럼 안녕.

Visual Studio에서 리소스 편집의 영향을 받는 파일(aps 파일은 뭐냐?)

저장소/VC++

출처 : MSDN http://msdn.microsoft.com/ko-kr/library/fywbdhak(v=vs.90).aspx


Visual Studio에서 리소스 편집의 영향을 받는 파일


Visual Studio 개발 환경에서는 리소스 편집 세션 중 다음 표에 있는 파일에 대한 작업을 수행합니다.

파일 이름

설명

Resource.h

개발 환경에서 만들어지는 헤더 파일로, 기호 정의가 포함됩니다.

Filename.aps

현재 리소스 스크립트 파일의 바이너리 버전으로, 빠른 로드를 위해 사용됩니다.

리소스 편집기에서 .rc 파일이나 resource.h 파일을 직접 읽을 수는 없습니다.
리소스 컴파일러가 이 파일을 리소스 편집기에서 사용할 수 있도록 .aps 파일로 컴파일합니다.
.aps 파일은 기호화된 데이터만 저장하는 컴파일 단계 파일입니다. 일반적인 컴파일 과정에서처럼,
주석과 같이 기호가 아닌 정보는 컴파일할 때 삭제됩니다. .aps 파일이 .rc 파일과 동기화되지 않으면
그 때마다 .rc 파일이 다시 생성됩니다. 예를 들어, 저장할 때
리소스 편집기는 .rc 파일과 resource.h 파일을 덮어씁니다.
리소스의 변경 내용은 모두 .rc 파일에 저장되지만 주석은 .rc 파일을 덮어쓸 때 삭제됩니다.
주석을 보존하는 방법은 
컴파일 타임에 리소스 포함을 참조하십시오.

.rc

현재 프로젝트에 있는 리소스의 스크립트가 포함된 리소스 스크립트 파일.
저장할 때마다 .aps 파일이 이 파일을 덮어씁니다.

 


'저장소 > VC++' 카테고리의 다른 글

ifstream 한글 문제  (0) 2012.10.30
[STL] string, wstring의 assign을 이용한 문자열 변환  (0) 2012.10.30
boost 관련 참고할만한 링크  (0) 2012.09.12
deprecated 설정  (0) 2012.09.11
Windows 권한  (0) 2012.08.20