성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>라즈베리 파이용 C++ 프로젝트에 SSL Socket 적용</h1> <p> 라즈베리 파이 등의 경우 C++에서 openssl을 사용하려면 다음과 같이 설치하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > sudo apt-get install libssl-dev </pre> <br /> 그런 다음 Visual Studio의 C++ 프로젝트 속성 창에서 -pthread를 사용했을 때와 유사하게,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Raspberry Pi/Windows 다중 플랫폼 지원 컴파일 관련 오류 기록 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11373'>http://www.sysnet.pe.kr/2/0/11373</a> </pre> <br /> 컴파일 옵션에 직접 다음의 값을 추가합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > -lcrypto -lssl </pre> <br /> 만약 "-lcrypto -lssl" 컴파일 옵션을 주지 않으면 링크 시에 다음과 같이 openssl 관련 함수들을 찾을 수 없다는 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > collect2 : error : ld returned 1 exit status Error undefined reference to `SSL_read' </pre> <br /> <hr style='width: 50%' /><br /> <br /> 웬일인지 NR_OPEN 상수가 정의되지 않았다는 오류가 발생할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Error 'NR_OPEN' was not declared in this scope </pre> <br /> 분명히 limits.h 헤더 파일을 포함시켰고, 헤더 파일 안에는 NR_OPEN 상수가 조건 없이 정의되어 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > #include <linux/limits.h> #define NR_OPEN 1024 </pre> <br /> 정확한 원인을 알 수는 없지만 다음과 같이 우회를 했습니다.<br /> <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > #if !defined(_NR_OPEN) #define NR_OPEN 1024 #endif </pre> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, 라즈베리 파이에서 특정 파일을 찾고 싶을 때 다음과 같이 find 명령어를 내리면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > sudo find / -name "..." </pre> <br /> 가령 openssl의 ssl.h 헤더 파일이 리눅스 파일 시스템의 어디에 위치해 있는지 알고 싶다면 다음과 같이 사용할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>sudo find / -name ssl.h</span> /usr/include/openssl/ssl.h $ <span style='color: blue; font-weight: bold'>find / -name ssl.h 2>/dev/null</span> // WSL 환경의 경우 /mnt 디렉터리를 제외하고 싶다면? $ <span style='color: blue; font-weight: bold'>find / -path /mnt -prune -o -name python 2>/dev/null</span> </pre> <br /> 윈도우의 경우에는 "dir /a/s ssl.h"라고 하는 것과 유사합니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> openssl의 초기화 시 인증서와 키 파일의 경로를 지정해야 하는데, 실행 모듈의 경로와 같은 위치에 있는 것을 지정하려고 다음과 같이 사용하면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > int use_cert = SSL_CTX_use_certificate_file(sslContext, <span style='color: blue; font-weight: bold'>"test.pem"</span>, SSL_FILETYPE_PEM); int use_prv = SSL_CTX_use_PrivateKey_file(sslContext, <span style='color: blue; font-weight: bold'>"key.pem"</span>, SSL_FILETYPE_PEM); </pre> <br /> 아래와 같이 해당 실행 모듈이 있는 경로로 이동 후 실행하면 정상적으로 파일을 찾는 반면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ cd /share $ ./test.out </pre> <br /> 다른 경로에서 직접 실행하게 되면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ /share/test.out </pre> <br /> test.out과 같은 위치의 파일을 못 찾고 pwd로 출력한 경로를 기준으로 찾게 됩니다. 사실 윈도우에서도 그렇기 때문에 당연한 결과입니다. 따라서 GetModuleFileName과 같은 Win32 API를 사용해 모듈 경로를 직접 구하는 식의 전처리가 필요한데요, 리눅스에서는 "/proc/[pid]/exe"라는 링크를 통해 실행 모듈의 경로를 구할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > How to find the full path of the C++ Linux program from within? ; <a target='tab' href='https://stackoverflow.com/questions/7051844/how-to-find-the-full-path-of-the-c-linux-program-from-within'>https://stackoverflow.com/questions/7051844/how-to-find-the-full-path-of-the-c-linux-program-from-within</a> </pre> <br /> [pid]가 아닌 현재 실행되고 있는 프로세스 내에서라면 self 문자열을 사용할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > /proc/self/exe </pre> <br /> 다음은 "<a target='tab' href='https://stackoverflow.com/questions/7051844/how-to-find-the-full-path-of-the-c-linux-program-from-within'>How to find the full path of the C++ Linux program from within?</a>" 글의 답변을 참고해 작성한 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > void get_module_dir_path(char modulePath[]) { char arg1[] = "/proc/self/exe"; char exepath[PATH_MAX + 1] = { 0 }; readlink(arg1, exepath, PATH_MAX); strcpy(modulePath, dirname(exepath)); printf("module path: %s\n", modulePath); } </pre> <br /> 암튼, 제가 리눅스 초보자이다 보니 간단한 Win32 API에 상응하는 수준의 것도 저렇게 찾아보게 되는군요. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, 위의 정보를 기반으로 지난번에 만들었던 라즈베리 파이 제로를 위한 가상 USB 키보드/마우스 장치에 SSL 소켓 서버를 구현해 두었습니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 키보드 및 마우스로 쓰는 방법 (절대 좌표, 상대 좌표, 휠) ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11369'>http://www.sysnet.pe.kr/2/0/11369</a> rasp_vusb ; <a target='tab' href='https://github.com/stjeong/rasp_vusb'>https://github.com/stjeong/rasp_vusb</a> </pre> </p><br /> <hr style='width: 50%' /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 윈도우즈 사용자를 위한 라즈베리 파이 제로 W 모델을 설정하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11372'>http://www.sysnet.pe.kr/2/0/11372</a> Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 이더넷 카드로 쓰는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11353'>http://www.sysnet.pe.kr/2/0/11353</a> Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 키보드로 쓰는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11354'>http://www.sysnet.pe.kr/2/0/11354</a> Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스로 쓰는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11355'>http://www.sysnet.pe.kr/2/0/11355</a> Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스 + 키보드로 쓰는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11356'>http://www.sysnet.pe.kr/2/0/11356</a> Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스로 쓰는 방법 (절대 좌표) ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11364'>http://www.sysnet.pe.kr/2/0/11364</a> Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 키보드 및 마우스로 쓰는 방법 (절대 좌표, 상대 좌표, 휠) ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11369'>http://www.sysnet.pe.kr/2/0/11369</a> 라즈베리 파이 용 C++ 프로젝트에 SSL Socket 적용 ; http://www.sysnet.pe.kr/2/0/11411 Raspberry Pi/Windows 다중 플랫폼 지원 컴파일 관련 오류 기록 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11373'>http://www.sysnet.pe.kr/2/0/11373</a> Linux 3: 라즈베리 파이 - (윈도우의 NT 서비스처럼) 부팅 시 시작하는 프로그램 설정 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11374'>http://www.sysnet.pe.kr/2/0/11374</a> </pre> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
5048
(왼쪽의 숫자를 입력해야 합니다.)