레지스트리 함수 사용시 winreg.h을 인클루드하고, advapi32.lib을 Library에 등록해야 된다. 대부분 windows.h에 포함되어 있다.

레지스트리 등록
BOOL SHRegWriteString(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue, LPCTSTR lpData)
{
HKEY key;

if (RegCreateKeyEx( // 레지스트리키를 새로 만들어주는 함수이다. 만약 생성하려는 키가 존재하는 경우 해당 키를 오픈.

hKey, // 생성할 키의 루트키

lpKey, // 생성할 서브키(문자열)

0, // 반드시 0

NULL, // 키의 지정된 클래스명(문자열), (보통 NULL 입력)

REG_OPTION_NON_VOLATILE, // 정보를 파일에 기록한다. ( 보통 이 옵션을 사용 ), REG_OPTION_VOLATILE - 정보를 메모리에 기록합니다. ( 시스템종료시 기록이 지워진다. )


KEY_WRITE, // 쓰기와 관련된 모든 권한, KEY_ALL_ACCESS - 모든 권한, KEY_READ - 읽기와 관련된 모든 권한, KEY_EXECUTE - KEY_READ와 동일

NULL, // SECURITY_ATTRIBUTES 구조체의 포인터. (보통 NULL 입력)


&key, // 생성된 키의 핸들포인터

NULL // DWORD의 포인터, 생성된 키의 상태, (보통 NULL 입력)

)!=ERROR_SUCCESS) // 성공시 ERROR_SUCCESS, 실패시 0이 아닌값이 리턴됨

return FALSE;


if (RegSetValueEx( // 레지스트리키를 저장 하는 함수

key, // RegCreateKeyEx에서 얻은 핸들값

lpValue, // 값 이름

0, // 반드시 0

REG_SZ, //문자열 데이타 타입

(LPBYTE)lpData, // 값 데이터

lstrlen(lpData)+1 //값의 타입이(REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ) 일 경우 문자열의 크기

)!=ERROR_SUCCESS) // 성공시 ERROR_SUCCESS, 실패시 0이 아닌값이 리턴됨
return FALSE;

RegCloseKey(key); // RegCreateKeyEx에서 얻은 핸들을 닫는 함수
return TRUE;
}

ROOT KEY
HKEY_CLASSES_ROOT - 윈도우에 사용하는 프로그램과 각 프로그램에 연결된 확장명에 대한 정보, 단축키, 드래그 앤 드롭, 윈도우의 OLE에 관련된 정보가 저장
HKEY_CURRENT_USER - 사용자가 설정한 윈도우 환경에 대한 정보가 저장
HKEY_LOCAL_MACHINE - 컴퓨터에 설치된 하드웨어와 소프트웨어에 관련된 모든 설정 내용이 저장. 특히 하드웨어와 하드웨어를 구동시키는 드라이버와 설정 사항에 대한 정보가 저장
HKEY_USERS - HKEY_CURRENT_USER 에 저장된 정보 전체와 데스크탑 설정, 네트워크 연결등의 정보가 저장
HKEY_CURRENT_CONFIG - HKEY_LOCAL_MACHINE 키의 하위키인 Config 키의 내용만 담고 있슴.

데이터 형식
문자열 값(REG_SG) - 문자열 값을 가지는 데이터 형식
이진 값(REG_BINARY) - 0과1로 표현되는 2진수 값을 가지는 데이터 형식
DWORD 값(REG_DWORD) - DWORD는 더블워드(Double Word)를 의미하는 것
다중 문자열 값(REG_MULTI_SZ) - 여러 유니코드 문자열의 묶음
확장 가능한 문자열 값(REG_EXPAND_SZ) - 윈도우 XP는 여러 개의 시스템 정의 변수를 사용한다. 이러한 변수들은 BAT 파일이나 제어판의 ‘시스템’ 환경 변수에서 설정

레지스트리 삭제
BOOL SHRegDelValue(HKEY hKey, LPCTSTR lpKey, LPCTSTR lpValue)
{
HKEY Key;
LONG lRet = 0;

if(RegOpenKey( // 레지스트리를 오픈하는 함수

hKey, // 생성할 키의 루트키

lpKey, // 생성할 서브키(문자열)

&Key // 생성된 키의 핸들포인터

) != ERROR_SUCCESS) // 성공시 ERROR_SUCCESS, 실패시 0이 아닌값이 리턴됨
return FALSE;

lRet = RegDeleteValue( // 레지스트리를 삭제하는 함수

key, // RegOpenKey에서 얻은 핸들값

lpValue, // 값 이름

);

RegCloseKey(key); // RegCreateKeyEx에서 얻은 핸들을 닫는 함수
return ((lRet == ERROR_SUCCESS)? TRUE : FALSE); // 성공시 ERROR_SUCCESS, 실패시 0이 아닌값이 리턴됨
}

윈도우 시작에 등록 및 삭제

ex>

#include <windows.h>

// 등록

SHRegWriteString(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run","ProgramName", szPath);

// 삭제

SHRegDelValue(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run","ProgramName");

=========================================================================================================

레지스트리 등록

TCHAR value[1028] = "C:\\Program Files\\abc\\abc.exe -as";

HKEY hk;

RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\windows\\CurrentVersion\\Run", &hk));


RegSetValueEx(hk, "abc", 0, REG_SZ, (LPBYTE) value, strlen(value)+1);


RegCloseKey(hk);


=========================================================================================================

레지스트리 삭제

HKEY key;

RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS,&key);


RegDeleteValue(key, "abc") ;


RegCloseKey( key );

=========================================================================================================

레지스트리 데이터 구하기

HKEY hhkey;
TCHAR str1[4 + 1];
DWORD data_size1 = sizeof(str);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM",0, KEY_ALL_ACCESS, &hhkey);
int ret = RegQueryValueEx(hkey, "\\Device\\Silabser0", 0, NULL, (LPBYTE)str, &data_size1);
AfxMessageBox(str);

'Program Visual C++' 카테고리의 다른 글

ActiveX 권한2  (0) 2012.04.18
ActiveX 권한..1  (0) 2012.01.12
MFC CInternetSession클래스 사용시_유의점  (0) 2011.12.01
AVI 파일 다루기  (0) 2011.08.30
정적 라이브러리에서 MFC 사용  (0) 2011.08.25

홀펀칭 화상통화...등등

Program RFC/Algorithm 2012. 1. 4. 09:40 Posted by HisPark
아이폰4와 갤럭시S와 화상 전화는 왜 안나올까?


사실은 이 동영상에서 시작되었다.

잡스는 아이폰4에서의 화상통신이 wifi를 이용해서 이루어 지며, 무료(당연히)라고 했다.
그리고 특히 강조하며, no server, no setting...zero setting required 이라고..
즉 서버없이 사용자끼리, 완전 무료로, 아무런 세팅없이 화상통신이 가능하다는 얘기다.
위 내용을 그대로 보자면..
아이폰4끼리
wifi가 되는 곳 어디서나.
가로, 세로 모드
앞뒤 카메라
그리고 놀라운 화질과 음질...
듣기만 해도 기분좋은 얘기다...그런데...왜?
아이폰4끼리만 되는가 하는 문제이다. 왜 왜 왜!!!

갤럭시S나 , 다른 화상통신 프로그램과는 왜 안될까? 또는 Nate나 MSN, 또는 Skype와 화상통신이
된다면 좋을텐데...
일반전화 와 핸드폰은 통신이 된다. 이걸 핸드폰끼리만 통신이 된다고 하면 어떻겠는가?
또는 외국과는 통신이 안된다면 어떻겠는가?

물론 안되는 여러가지 문제가 있겠지만, 여기서는 기술적인 문제하나를 말하고 싶다.
다음 사진을 보자.

우선 위에 언급된 내용은 살펴보면

H.264 : 비디오 표준이다. 흔히 말하는 Mpeg4로 보면 된다.
AAC : 오디오 표준이다. Mpeg2에서 사용되었고, 흔히 사용하는 MP3와 같은 수준의 음질이나, 압축율은 더 좋다.

그런데 동영상을 보면 위 2가지에 대해서는 비디오, 오디오 표준이라는 얘길 하다가...
밑에는 농담과 함께 넘어가 버린다. 이걸 한번 살펴보자.

SIP : Session Initiation Protocol 이다. 쉽게 말해 인터넷 전화 프로토콜이다.
그리고..문제는 밑에 있는. 3가지 기술이다.

STUN : Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)
TURN : Traversal Using Relay Network Address Translation NATs
ICE : Interactive Connectivity Establishment
그리고
RTP : Real Time Protocol (RTSP : Real Time Streaming Protocol)
SRTP : Secure Real Time Protocol
둘다 실시간 음성 및 영상 송수신을 위한 프로토콜이다. SRTP는 보안을 위한 부분이다.

여기서 STUN, TURN, ICE 는 네트워크 전공자/종사자 아니면 좀처럼 들어보기 힘든 부분이다.
쉽게 말해서 공유기 문제를 해결하기 위한 부분으로,
공유기는 1개의 IP를 여러 컴퓨터가 나뉘 쓸 수 있게 한다. 그리고 공유기에 물린 컴퓨터는 전부
내부 아이피 즉 192.168.... 로 된 아이피 주소를 사용하는게 보통이다.

그러다 보니, 전화를 걸때 수신자의 아이피 주소로는 그사람을 찾아갈 수 없다는 문제가 생긴다.
즉 192.168...로 시작되는 주소는 외부에서 접근할 수 없는 주소인 것이다.
이문제를 해결하기 위해 고안된 것이 위에서 언급된 3가지 기술 STUN, TURN, ICE 이다.
간단히 언급하자면
STUN는 흔히 말하는 UDP Hole Punching 이라는 기술로 접속을 위한 서버에서 UDP로 생성된
connection을 이용해서 접속하는 기술이다. 그러나, 이 기술로 100% 공유기를 통과할 수 없다.
이게 안되는 타입의 공유기가 있기 때문이다. symmetric 타입의 공유기는(자세한 설명은 생략. 골아플테니까.)
STUN 으로 연결되지 않는다. 이를 위해서 어쩔 수 없이 Relay .. 즉 전달하는 서버를 필요로 한다.
쉽게 말해서 송신자 A와 수신자 B가 통화를 하는 경우, 중간에 C가 들어서 A가 보내는 데이터를
전부 받아서 C에게로 전달해 주는 방식이다. 이경우 송수신자가 늘어난다면, 중간에 전달해 주는
C는 거의 죽음이다. 물론 몇가지 서버의 부하를 줄일 수 있는 방법이 있지만, 기본적으로 동영상을
실시간 전달하자면 대역폭(bandwidth)가 문제가 될 수 밖에 없다.
그리고 ICE는 위 2가지 기술을 조합하여 서로 다른 주소 영역가에 최적의 라우팅 경로를 찾아내는 기술이다.

결과적으로
위 3가지 기술은 전부 공유기 때문에 생기는 문제를 해결하기 위한 기술이다.
또한 그 방법이 깔끔하지 못하다.
한두번씩은 경험해 봤겠지만, NateOn(네이트온)에서 멀쩡히 채팅은 잘 되고 있었는데, 파일을 보내지
못하는 경우를 본적이 있을 것이다. 못봤다고? ...부럽다. 여튼.
Nate가 거의 비슷한 기술을 사용하고 있다.
즉 그냥 채팅을 하는 경우 데이터를 전부 Relay 시켜서, 전달한다. 그러나, 파일을 보내는 경우
STUN 기술이 들어간다. 그러다 보니, 공유기가 Hole Punching이 지원되지 않는 모델이거나,
2개 이상의 공유기가 중첩되어 있는 경우 파일이 전달되지 않는 문제가 생기곤 한다.

그럼 다시 처음으로 돌아가 보면...
아이폰4끼리 통신을 하는 경우
1. STUN 서버가 필요하다. 크게 부하는 없지만, 어느정도 서버가 확보되어야 하고, 사용자가 많아진다면,
추가 서버가 필요하다. 그리고.
2. STUN 서버로 동작하지 않는 공유기(NAT)를 사용하는 경우 TURN 서버로 Relay 해야 되는데..이건 부하가
심하다. 사용자가 늘어난다면, 그리고 재수없게도 Symmetric NAT가 많다면 더욱 더 많이 필요하다.
아마도, 네이트에서 파일전송이 안되는 경우처럼, 아이폰4 사용자들도 인터넷은 되는거 같은데, 화상통신이
안되는 경험을 하게 될 것이다. 아마도...하지만 릴레이 서버를 잘 이용한다면, 어느정도는 가능하지만...
이게 어느정도 될지는 알 수 없다.

그리고 아이폰4와 다른 스마트폰과의 통신...
이건 문제가 심각하다. 만약 갤럭시S와 통신을 할 수 있게 하려면...
STUN 서버를 같이 운영해야 된다. 서버를 둔다는 것이 그냥 IDC 같은데 처박아 두면 되는게 아니다.
릴레이 서버도 마찬가지... 두회사간, 그리고, 외국과의 화상통신을 위한 준비가 만만치 않다.
STUN 서버를 1대만 둔다면...전세계를 통합하는 1대의 STUN라면 몰라도...
릴레이 서버도 마찬가지고... 해결해야될 기술적 과제가 많다는 얘기다.
물론 이게 돈이 된다면...무슨 수를 써서라도 해결할 방법이 생길 수도 있겠지만, 화상통화만으로
돈이 되는 것은 아니다.
이게 전화처럼, 10년이상을 내다보고, 할 수 있다면 또 모를까...

아마도 쉽게 이루어 지지 않을 전망....
물론..이러한 기술적 문제는 IPv6가 전격적으로 도입된다면...또 전혀 다른 국면을 맞이 할 수도 있다.
NAT라는 것이 기본적으로 IP 부족과 관련이 있기 때문이다.

결론적으로 추론을 하자면.. 대대적인 통합 화상전화 시스템은 몇년내에 볼 수 없을 것 같다.
누군가 갤럭시S와 아이폰간 화상 전화 시스템을 만들어서 서비스 한다고 해도...쉽게 돈이 될것 같진
않아서...쉽사리 뛰어 들것 같지도 않다.
그리고 기술은 어느방향으로 뛸지 아무도 알 수 없기 땜에... 지금 크게 투자하는 것도 위험해 보이고..
 
 
 
http://zzpark.egloos.com/tb/10592868 님 블러그에서 ...
 

'Program RFC/Algorithm' 카테고리의 다른 글

RTCP-SR 에서 ntp timestamp  (0) 2011.11.14
Hole Punching  (0) 2011.08.31
Hole Puching  (0) 2011.08.31

KBCard

Knowledge General 2011. 12. 7. 14:53 Posted by HisPark

1. 굿데이 카드
  (30이상)
- 주유 업종 60원/ℓ 할인 (한도20만)
- 통신 업종 10% 할인(한도5만)
- 대중교통 업종 10% 할인 (한도5만)

  (60이상사용)
- 주유 업종 60원/ℓ 할인 (한도40만)
- 음식점,커피전문점,편의점,약국 업종 10% 할인

  (120이상사용)
- 학원 피트니스 10% (한도20만)

2. CJ카드

- 빕스,한쿡,헤프터더레인,씨푸드오션,카페소반,콜드스톤크리머리,차이나팩토리,더플레이스,피셔스마켓 이용시 20%할인 + 2%(CJ)적립 1일 1회, 할인전 이용금액 20만원 이내

-  투썸플레이스, 뚜레쥬르 이용시 10% 할인백화점 및 할인점 내 입점 매장 제외

- 올리브영 이용시 10% 할인 + 1%(CJ포인트)적립
- 영화할인 : CGV 8500원 결제시 6천원 청구할인(8500원 미만 결제시 3천원 청구할인)  1일 1회, 연간 12회 직전 3개월 월 평균 결제금액 30만원 이상시 적용

- 연회비 약정기간 내에 CJ오쇼핑에서 1건 이상 사용시 면제 3%적립 + 2-3개월 무이자할부  VIPS,아웃백,TGI,커피 전문점 10%적립


3. 마이원 카드

- 영화할인 : CGV, 매가박스, 프리머스, 씨너스에서 영화결제시 승인 건당 4000원 청구할인 승인월 직전 3개월 평균결제금액 10만원 이상 월 2회, 연 8회

- 스타벅스 10% 청구 할인 : 승인월 직전 3개월 평균 10만원 고객 대상

- 아웃백, TGI,마르쉐,베니건스,시즐러 10% 청구할인 : 1일 1회, 일 20만원

- 마이원 적립 : CGV,프리머스,씨너스,마르쉐,씨즐러 10%적립,교보,보디가드,예스,섹시쿠키,러쉬 5%적립 핫트렉스 5% 할인-누적구매금액20만원부터 ,  레드망고 100원당 1망고, 반디앤루디스 3%적립


4. 포인트리 라임 카드

- 주유 : GS 리터당 50원 적립 - 월 30만원 이용분까지 적립 [ LPG제외]

- 쇼핑 : 5대백화점,4대할인점 3%적립(월30만까지-무실적),

- 영화 : 티켓링크의 영화,공연예매 10%적립, 퍼플회원가입 20%할인(퍼플회원:공연 10~50% 할인)

- 패밀리레스토랑 : 베니건스 10%적립 + 5% 현장 할인, VIPS,아웃백,TGIF 10%적립 (월20만까지)

- 커피전문점 : 10% 적립 (월10만까지)

- 스포츠/레저 5% 적립

'Knowledge General' 카테고리의 다른 글

손연재 에어컨 모델별 구별법  (0) 2012.10.09
Hennesy 알아보기  (0) 2012.01.09
공채할인 계산  (0) 2011.09.05
자동차 등록 인터넷  (0) 2011.09.05
경조사비?!  (0) 2011.07.25
MFC의 CInternetSession 클래스를 사용하면 간편하게 웹페이지를 읽어올 수 있죠..

일단 웹페이지를 열기위해 OpenURL() 멤버 함수를 호출합니다..

CStdioFile* OpenURL(" LPCTSTR pstrURL, DWORD dwContext = 1, DWORD dwFlags = INTERNET_FLAG_TRANSFER_ASCII, LPCTSTR pstrHeaders = NULL, DWORD dwHeadersLength = 0 );
Throw ( CInternetException );

요놈은 CStdioFile(pstrURL에 연결해서 가지고 온 내용이 담긴 파일) 포인터를 리턴값으로 가지고 있읍죠.

페이지 pstrURL 형식에 따라 원하는 클래스로 캐스팅이 가능합니다.

URL type Returns
file:// CStdioFile*
http:// CHttpFile*
gopher:// CGopherFile*
ftp:// CInternetFile*

제가 MSDN Library January 2001를 설치해서 보는데요..
이 함수 정보에서 Remarks나 Return Value란을 뒤져봐도

"리턴값으로 넘어온 파일 포인터를 어떻게 처리해야 한다"라는 언급은 전혀 없어서
그냥 썼었습니다.. 그랬더니 무지막지한 메모리 릭이..(무한루프 속에서 호출하였음..)

제가 무식해서 첨엔 메모리 새는 원인을 찾지못하고 헤매다가 이 함수가 왠지 걸쩍지근해서..

소스파일인 inet.cpp 파일을 직접 훓어보았더니..

리턴값이 CInternetSession의 멤버변수(CStdioFile)를 포인터로 돌려주는게 아니라 new로 생성된거 였더군요..

즉 리턴값에 대해 delete 처리가 반드시 필요하다는 거죠..(왜 멤버변수라고 단정 지었던 것인지 ㅡㅡ;)

덧붙여.. TRY-CATCH를 반드시 써주셔야 합니다.. 안그럼 프로그램 언제 종료될지 모릅니다... -_-;

고로 이 클래스를 이용하시는 분들은 다음과 같이 써주시면 안전(?)하겠습니당..

CInternetSession* pSession = NULL;
CStdioFile* pFile = NULL;
TCHAR szError[1024] = {0};

TRY
{
pSession = new CInternetSession;
pFile = pSession->OpenURL("http://www.devpia.com");
}
CATCH (CInternetException, pEx)
{
pEx->GetErrorMessage(szError, 1024);
}

END_CATCH

if (pFile != NULL)
{
//여기서 웹페이지 내용을 가지고 처리
//HTTP를 호출했을 시
CHttpFile* pHttpFile = (CHttpFile*)pFile;
delete pHttpFile;
pHttpFile = NULL;
pFile = NULL;
}

if (pSession != NULL)
{
//pSession->Close(); //CInternetSession 소멸자가 알아서 호출함
delete pSession;
pSession = NULL;
}