출처 - http://soooprmx.com/wp/archives/4993

 

C프로그램의 파라미터 파싱 및 처리

문자열 파싱은 스크래치 상태(아무것도 없는 빈 상태)로부터 구현하기가 만만치 않은데, 이를 도와주는 라이브러리 함수가 있으니 바로 unistd.h에 정의된 getopt() 함수이다.

getopt()

이 함수의 원형은 다음과 같다.

int getopt(int argc, char * const argv[], const char *optstring);

이 함수의 파라미터는 간단한다.

  1. argc, argv : main() 함수가 받은 파라미터를 그대로 전달한다.
  2. optstring : 파싱해야 할 파라미터를 쓴다. 옵션이 별도의 파라미터를 받는 경우 콜론을 함께 쓴다.

예를 들어 -h, -v, -f filename을 받는 세 가지 옵션이 있다고 하면 옵션스트링은 "hvf:"가 된다. 각각의 옵션을 파싱해내기 위해서는 getopt()함수가 0을 리턴할 때까지 계속해서 반복하면 된다.

그외 전역변수

이 함수와 관련된 전역 변수에는 다음과 같은 것들이 있다.

  • optarg : 옵션 뒤에 별도의 파라미터 값이 오는 경우, 이를 파싱한 결과 파라미터 값은 optarg에 문자열로 저장된다.
  • optind : 다음번 처리될 옵션의 인덱스이다. 만약 파싱한 옵션이후에 추가적인 파라미터를 받는다면 (예를 들어 입력 파일 이름 같이) 이 값을 활용할 수 있다. getopt()함수는 한 번 호출될 때마다 이 값을 업데이트한다.
  • opterr : 옵션에 문제가 있을 때, 이 값은 0이 아닌 값이되며, getopt()함수가 메시지를 표시하게 된다.
  • optopt : 알 수 없는 옵션을 만났을 때 해당 옵션이 여기에 들어간다. (이 때 getopt의 리턴값은 ‘?’가 된다.)

샘플 코드

아래 샘플 코드는 간략한 예를 보여준다. 이 코드에서는 a, b, c의 세 옵션을 인식하며 각각의 옵션이 주어지는 경우 해당 플래그 변수를 1로 정의하고 그 결과를 출력한다.

1:  #include <stdio.h>
2:  #include <unistd.h> // for getopt()
3:  
4:  int main(int argc, char * const * argv){
5:      int flag_a = 0, flag_b = 0, flag_c = 0;
6:      int c; // option
7:      while( (c = getopt(argc, argv, "abc")) != -1) {
8:          // -1 means getopt() parse all options
9:          switch(c) {
10:             case 'a':
11:                 flag_a=1;
12:                 break;
13:             case 'b':
14:                 flag_b=1;
15:                 break;
16:             case 'c':
17:                 flag_c=1;
18:                 break;
19:             case '?':
20:                 printf("Unknown flag : %c", optopt);
21:                 break;
22:         }
23:     }
24:     if(flag_a) {printf("flag a is ON \n");}
25:     if(flag_b) {printf("flag b is ON \n");}
26:     if(flag_c) {printf("flag c is ON \n");}
27:     return 0;
28: }

보통 while문으로 루프를 돌면서 옵션들을 하나씩 검사한다. getopt가 optstring으로 정의되지 않은 옵션문자를 만나면 opterr 값이 세팅되고, 동시에 getopt()함수가 해당 문자에 대해 메시지를 출력한다. 이 때 반환값은 '?'가 되고 이때 알 수 없는 옵션 문자는 optopt에 저장된다.

추가 파라미터를 필요로하는 옵션

gcc의 -o와 같이 파일 이름등의 추가 파라미터를 필요로하는 옵션은 다음과 같이 처리한다.

  1. optsting에서 옵션 문자 뒤에 콜론을 붙인다. "abcf:"와 같은 식으로 쓴다.
  2. getopt()함수는 -f를 만나면 자동으로 그 뒤에 붙은 문자열을 공백까지 탐색하여 이를 optarg에 복사한다.
  3. 처리시에는 리턴값이 ‘f’인 경우 optarg의 값을 그대로 액세스하면 된다.

이러한 처리 코드는 아래와 같다.

case 'f':
    memcpy(file_name, optarg, strlen(optarg));
    break;

또한 파라미터가 있다고 정의한 경우, 파라미터 값이 빠진채로 실행되었다면 이 때는 옵션이 인식할 수 없는 옵션으로 처리된다.

case '?':
    if(optopt == 'f') {
        printf("option -f requires FILENAME\n");
    }
    break;

optind

옵션문자들을 모두 처리한 이후에 프로그램 자체의 파라미터를 처리하기 위해서는 optindargv의 인덱스로 사용하여 파라미터를 전달 받을 수 있다.

그외 긴 이름

--output등의 긴 이름 옵션을 사용하기 위해서는 getoptlong함수를 사용한다.

VPN 이란?

[ virtual private network]
우리말로 '가상사설망'이라고 이야기합니다.

 

원래 보안을 목적으로 할 때 인터넷망은 따로 구축되어야 합니다. 외부 네트워크에서 들어올 수 있는 '해킹'등을 차단하기 위해서입니다. 이를 인트라넷이라고 하고, 회사의 지사나 사업상 파트너들처럼 외부에서 승인한 사용자들이 접근하여 사용할 수 있는 확장된 사설 인트라넷을 '엑스트라넷'이라고 합니다.  하지만 이렇게 따로 인터넷망을 구축할 경우 그 비용(서버 및 인건비 등)은 당연히 비싸지고, 필요에 따라 가변적으로 사용하기가 어렵다는 단점이 발생합니다.

 

 

 

가상사설망(VPN)은  공중망을 사설망처럼 이용해 회선비용을 절감하게 위해서 쓰는 기업통신 서비스! 엄밀히 말하면 공중망이 사설망이 될 수 있도록 만들어 주는 그 중간단계를 포함하는 말이라고 할 수 있습니다.

 

 

 

 

 

 

인터넷망을 전용선처럼 사용할 수 있으려면 특수한 통신체계와 암호화기법이 필요한 데 VPN에 이를 제공하며, 공공의 인터넷망이지만 마치의 전용 네트워크로 기업내부의 본사와 지사간 전용망을 설치한 것 같은 효과를 볼 수 있습니다.

기업의 통신망과 인터넷서비스 제공자와 연결만 하면 되기 때문에 개별적으로 고가의 장비 (일테면 서버 같은...)나 전용 소프트웨어를 구입하고 관리할 필요가 없어, 전용선에 구축하는 것에 비해 20~80% 이상의 비용 절감효과를 얻을 수 있다고 합니다.

 

 

 

 

 

 

그 외에 가상으로 마치 사설망인 것처럼 쓰지만, 실제로는 공공 네트워크이므로  사용자의 이동성이 보장된다는 점이 또 다른 장점입니다. VPN 서비스에서 가장 중요한 점은 데이터를 공중망을 통해 보내고 받는 과정에서의 암호화 및 보안기술이라고 할 수 있겠죠?

망에 접속하는 사용자 인증과정도 중요한테, 계정으로 신분 확인을 하는 사용자 인증, IP주소로 확인하는 클라이언트 인증, 서비스 포트로 인증 과정을 거치는 세션 인증 등의 방식이 있습니다. VPN서비스는 자체적으로 보안기술을 계속 개발하기 어려운 일반 기업이 보안문제를 해결하는 데도 도움을 줍니다.

* 마이크로소프트, 3Com 등 몇몇 회사들이 PPTP(point-to-point tunneling protocol)라는 표준 프로토콜을 제안하였으며, 마이크로소프트는 이 프로토콜을 윈도우NT 서버에 내장시켰습니다.

 

 

    

 

 

최근에는 안드로이드나 iOS 기반의 모바일 기기에서의 접속을 지원과 보안을 지원하는 모바일 VPN(mobile VPN)으로 그 영역이 확장되고 있습니다. 모바일 VPN(Mobile VPN)은 모바일 기기와 서버간의 암호화를 지원하고, 모바일에서 접속할 수 있는 사이트를 제한할 수 있습니다. 모바일 VPN은 개인이 공공의 와이파이에 연결했을 때 단말기 내부이 정보를 보호하기 위한 중간적인 보안시스템으로도 활용할 수 있습니다. 외부에서 와이파이를 연결할 때 마음이 불안하신 분들은 VPN계열의 어플을 깔아보시는 것도 좋으실 듯 합니다!^^

[출처] [IT 용어] VPN 이란?|작성자 꽃잔

출처 - http://mwultong.blogspot.com/2006/12/c-argc-argv-main-function-parameter.html

각 함수에는 인수(파라미터)를 지정할 수 있습니다. 프로그램 본체인 main() 함수에도 당연히 인수를 지정할 수 있습니다. 메인 함수의 인수는, 운영체제에서 그 프로그램을 실행할 때 지정해 준 "옵션"입니다.

예를 들어 도스창(명령 프롬프트;CMD.EXE)에서

dir /?

이렇게 하면 dir 명령에 대한 도움말이 출력됩니다. 이때 "/?" 라는 문자열이 옵션이 되는 것입니다.



main(int argc, char* argv[])
에서

argc 는, 프로그램을 실행할 때 지정해 준 "명령행 옵션"의 "개수"가 저장되는 곳입니다.

argv 는, 프로그램을 실행할 때 지정해 준 "명령행 옵션의 문자열들"이 실제로 저장되는 배열입니다.


다음 예제를 보면 쉽습니다.

int argc, char* argv[] 사용법 예제; main() Option Example


소스 파일명: 0.cpp

#include <stdio.h>
#include <stdlib.h>  // exit()

int main(int argc, char* argv[]) {


  // 옵션 지정하지 않았을 때 에러 출력하고 종료
  if (argc == 1) {
    fputs("에러! 옵션을 입력하지 않으셨군요...\n", stderr);
    exit(1);
  }


  // 옵션 개수 출력
  printf("%d 개의 옵션을 입력하셨군요\n\n", argc - 1);


  // 옵션 배열의 요소들을 하나씩 출력
  for (int i = 1; i < argc; i++)
    printf("argv[%d] = %s\n", i, argv[i]);

  return 0;
}




컴파일 및 실행 결과 화면:

D:\Z>cl /nologo 0.cpp
0.cpp

D:\Z>0.exe
에러! 옵션을 입력하지 않으셨군요...

D:\Z>0.exe 111 222
2 개의 옵션을 입력하셨군요

argv[1] = 111
argv[2] = 222

D:\Z>0.exe AAA BBB CCC
3 개의 옵션을 입력하셨군요

argv[1] = AAA
argv[2] = BBB
argv[3] = CCC

D:\Z>0.exe 자장면 탕수육 짬뽕 불도장 팔보채
5 개의 옵션을 입력하셨군요

argv[1] = 자장면
argv[2] = 탕수육
argv[3] = 짬뽕
argv[4] = 불도장
argv[5] = 팔보채

D:\Z>




옵션을 하나도 입력하지 않으면 argc 는 1이 됩니다. 즉 argc 는 항상 1 이상입니다. 0이 되지 않습니다.

위의 경우, argv[0]은 0.exe 가 됩니다. 즉 argv 의 첫번째 요소는 항상 "프로그램 자신의 파일명"입니다.

따라서 옵션의 정확한 개수를 구하려면 argc 에서 1을 마이너스해 주어야 합니다.

+ Recent posts