검색결과 리스트
관심거리/IT볼거리 ♪ 에 해당되는 글 82건
- 2011/12/29 아이폰 폴더풀림없는 동기화방법!
- 2010/06/04 캐럿보이컴 :: 안녕, 맥미니 (2)
- 2008/11/06 캐럿보이컴 :: GCC 에러(Error / Warning) 메세지 리스트
- 2008/10/21 캐럿보이컴 :: mmap함수
- 2008/05/15 캐럿보이컴 :: zterm 에서 out of memory 문제
- 2008/05/08 캐럿보이컴 :: 커널 컴파일
- 2008/02/19 캐럿보이넷 :: 도메인 기관이전 절차
- 2008/01/17 캐럿보이컴 :: Controlling Memory Space of Other Process
- 2007/08/22 캐럿보이넷 :: IP MultiCast 일반
- 2007/05/21 캐럿보이컴 :: Keil 사용하기
http://cafe.naver.com/inmacbook/483909머리털나고 처음으로
(..는 아니구나..) 암튼 흔히 없는 해외 배송 포장기념으로 포장도 조심스럽게..흐흐..
보시다 시피 eject버튼이 없어서 시디를 꺼내려면 소프트웨어적으로 꺼내야 합니다.
혹시나 문제가 있어 CD를 빼야 할땐 부팅시 마우스 아무버튼이나 꾸욱 누르고 있으면 시디를 뱉어냅니다.
오른쪽 사진을 보면 전원아답터, RJ45, 디스플레이, MINI-DVI, 뭔지 모를 뭐시기.., USB 2.0 (위에서 아래순..)
컨넥터가 있고, 전원버튼, 방열환기구, Lock용 홀, 이어폰, 마이크 단자가 있습니다.
내부 스피커가 있어 굳이 이어폰단자에 스피커를 연결하지 않아도 됩니다.
아쉬운점이 있다면 전원과 MINI-DVI단자에
일반PC처럼 나사를 조이는 방식이 아니라 본체를 움직이거나 주위선정리를 하다가
선이 쑥빠지는 사고를 당할수 있어 조심해야 합니다.
아마도 디자인을 위해서라면 기능성을 과감하게 버리는 스티븐 형님의 개똥 철학이
적용된듯합니다.
이상 미니맥 개봉기였습니다.
GCC Error (Warning) Message List
Copyright © 1999 Seong-Kook Cin
Before reading this
이 문서는 GCC Version 2.7.2를 기준으로 하여 이 컴파일러가 출력하는 에러 [error]와 경고 [warning] 메시지를 한국어로 번역하고, 그 메시지를 발생할 수 있는 간단한 예제를 보이며, 간단한 해결책을 제시합니다.
이 문서는 C 배우미들이 낯선 컴파일러 메시지를 만났을 때 당황하지 않고 쉽게 문제를 해결할 수 있기를 바라는 뜻에서 만들어진 것입니다.
이 문서는 유용하게 쓰여지기를 바라면서 만들어졌지만 저자는 이 문서에 대해 어떠한 보증도 하지 않습니다. 즉, 이 문서에 의해 일어날 수 있는 손해에 대해서는 책임을 지지 않습니다.
이 문서는 GCC가 발생할 수 있는 에러 메시지를 모두 포함하지 않을 수도 있습니다. 여러분이 이 문서에 없는 에러 메시지를 발견해서, 이 문서에 추가하기를 원하거나, 이 문서에 틀린 곳을 수정하기를 원한다면 cinsk@acm.org 으로 e-mail을 보내시기 바랍니다. 어떠한 제안이나 비판도 환영합니다. 저자는 여러분들의 참여로 이 문서가 보다 완전해지기를 원합니다.
Conventions
영어를 한국어로 쓸 때, 한국어를 영어로 표기할 때 혼동을 가져올 수 있는 용어나 기타 부가적인 설명은 그 용어 뒤의 `[]'안에 옵니다. 문서의 형식은 다음과 같습니다.에러 메시지
에러 메시지 설명...................... 이 에러 메시지를 발생시키는 예제
파일:줄 번호: 실제 컴파일러가 발생하는 에러 메시지
Table of Contents
Errors
- `##' at end of macro definition
- `##' at start of macro definition
- `#elif' after `#else'
- #error XXX
- `#XXX' not within a conditional
- `#include' expects "FILENAME" or <FILENAME>
- `#' operator is not followed by a macro argument name
- ANSI C requires a named argument before `...'
- arithmetic on pointer to an incomplete type
- attempt to take address of bit-field structure member `XXX'
- badly punctuated parameter list in `#define'
- break statement not within loop or switch
- called object is not a function
- case label not within a switch statement
- character constant too long
- char-array initialized from wide string
- conflicting types for `XXX'
- continue statement not within a loop
- declaration of `XXX' as array of voids
- default label not within a switch statement
- dereferencing pointer to incomplete type
- duplicate case value
- empty character constant
- empty file name in `#include'
- empty #if expression
- enumerator value for `xxx' not integer constant
- function `XXX' is initialized like a variable
- incompatible type for argument N of `XXX'
- incompatible types in assignment
- invalid format `#line' directive
- invalid #-line
- invalid initializer
- invalid macro name `defined'
- invalid macro name `XXX'
- invalid operands to binary X
- invalid preprocessing directive name
- invalid use of undefined type `XXX'
- invalid type argument of `unary *'
- macro or `#include' recursion too deep
- multiple default labels in one switch
- negative width in bit-field `XXX'
- No such file or directory
- numeric constant contains digits beyond the radix
- parameter `XXX' is initialized
- parameter name omitted
- parse error
- parse error before `XXX'
- possible real start of unterminated constant
- redeclaration of `XXX'
- redefinition of `XXX'
- register name not specified for `XXX'
- request for member `XXX' in something not a structure or union
- `sizeof' applied to a bit-field
- storage size of `XXX' isn't known
- structure has no member named `XXX'
- top-level declaration of `XXX' specifies `auto'
- too few arguments to function `XXX'
- too many arguments to function `XXX'
- typedef `XXX' is initialized
- unbalanced `#endif'
- undefined or invalid # directive
- union has no member named `XXX'
- unterminated character constant
- unterminated comment
- unterminated `#if' conditional
- unterminated macro call
- unterminated string or character constant
- variable or field `XXX' declared void
- void value not ignored as it ought to be
- `XXX' declared as function returning an array
- `XXX' defined as wrong kind of tag
- `XXX' has both `extern' and initializer
- XXX: No such file or directory
- `XXX' previously declared here
Warnings
- address of register variable `XXX' requested
- assignment makes integer from pointer without a cast
- case value out of range
- control reaches end of non-void function
- data definition has no type or storage class
- declaration of `XXX' shadows a parameter
- dereferencing `void *' pointer
- escape sequence out of range for character
- `#ifdef' with no argument
- `#ifndef' with no argument
- implicit declaration of function `XXX'
- initialization makes integer from pointer without a cast
- integer overflow in expression
- initializer-string for array of chars is too long
- overflow in implicit constant conversion
- parameter names (without types) in function declaration
- passing arg N of `XXX' makes integer from pointer without a cast
- return-type defaults to `int'
- `return' with no value, in function returning non-void
- undefining `XXX'
- unknown escape sequence `\x'
- width of `XXX' exceeds its type
- `XXX' initialized and declared `extern'
- `XXX' redefined
warning: initializer-string for array of chars is too long
주어진 배열이 가질 수 있는 문자의 개수보다 많은 초기값이 주어진 경우에 발생합니다. C 언어의 문자열은 큰 따옴표(`"')로 둘러싸서 나타내며 문자열의 끝을 나타내기 위해 ASCII 코드 0번 문자(`\0')를 사용합니다. 따라서 아래의 예에서 배열 `ca'는 크기가 5로 되어 있어야 합니다.
문자열 배열을 쓸 때마다 이런 식으로 배열의 크기를 지정해 주는 것은 번거로운 일입니다. 배열이 초기값을 가지고 있을 때에는 배열의 크기를 지정하지 않아도(`ca[]') 좋습니다. char ca[3] = "abcd";
file:1: warning: initializer-string for array of chars is too long
invalid #-line
라인 [line] 번호 정보를 잘못 입력한 경우에 발생합니다. 라인 번호는 0보다 큰 양수 [positive number]이어야 합니다.
invalid format `#line' directive 에러를 참고하시기 바랍니다. # 0 "foo.c"
file:1: invalid #-line
또는, #line 0
file:1: invalid #-line
parse error before `XXX'
이 에러가 발생하는 조건은 너무나도 많습니다. 일반적으로 문장을 분석 [parse]할 때 예상하지 못한 구문을 발견했을 경우에 이 에러가 발생합니다. parse error 에러를 참고하기 바랍니다.
조건 1: typedef로 정의한 형에 short, long, signed, unsigned 등을 사용할 때. typedef int INT;
unsigned INT ui;
file:2: parse error before `ui'
file:2: warning: data definition has no type or storage class
조건 2: void f()
{
else {
}
}
file: In function `f':
file:3: parse error before `else'
warning: `XXX' redefined
사용자가 정의한 매크로를 다시 정의하거나, ANSI C 혹은 컴파일러가 미리 정의해 놓은 매크로를 재 정의하려 할 때 발생합니다. 사용자가 정의한 매크로인 경우, #undef 지시어를 써서 이 경고를 없앨 수 있습니다. #define MY_CONST "cinsk"
#define MY_CONST "windy"
file:2: warning: `MY_CONST' redefined
warning: undefining `XXX'
ANSI C 혹은 컴파일러가 미리 정의해 놓은 매크로(predefined macro)를 없앨 경우에 발생합니다. 이 경고가 발생할 경우, 여러분은 다른 매크로를 써야 합니다. 미리 정의된 매크로를 다른 목적으로 쓰는 것은 좋지 않습니다. ANSI C 혹은 컴파일러가 미리 정의해 놓은 상수 목록은 컴파일러와 함께 제공되는 매뉴얼을 참고하시기 바랍니다. #undef __FILE__
file1: warning: undefining `__FILE__'
ANSI C requires a named argument before `...'
ANSI C는 하나 이상의 가변 인자 [variable length argument]를 받을 수 있게 하지만 하나 이상의 고정된 인자가 있어야 합니다. 아래의 예에서 함수 f()는 고정된 인자가 하나도 없기 때문에 이 에러가 발생합니다. void f(...) { }
file:1: ANSI C requires a named argument before `...'
unterminated macro call
주어진 매크로의 인자를 읽을 때 괄호가 닫히지 않을 경우 이 에러가 발생합니다. #define NOP(x)
NOP(foo
file:2: unterminated macro call
duplicate argument name `XXX' in `#define'
매크로를 정의할 때 같은 이름을 두 인자에 대해 썼을 경우 이 에러가 발생합니다. #define ADD3(a, a, c) ((a) + (b) + (c))
file:1: duplicate argument name `a' in `#define'
parse error
어구 분석(parsing)에 실패했을 경우 이 에러가 발생합니다. 이 에러가 발생하는 경우는 매우 많습니다. parse error before `XXX' 에러를 참고하기 바랍니다.
조건 1: `#elif' 다음에 상수식이 오지 않을 때 #if defined(ONE)
int i = 1;
#elif
int i = 2;
#endif
file3: parse error
조건 2: 비어있는 매크로를 잘못 썼을 때. #define EMPTY
#if EMPTY
char *msg = "EMPTY is non-empty";
#endif
file:2: parse error
empty character constant
빈 문자 상수가 쓰였을 때 이 에러가 발생합니다. int i = '';
file:1: empty character constant
empty file name in `#include'
`#include' directive에서 파일 이름이 주어지지 않았을 때 발생합니다. #include <>
file:1: empty file name in `#include'
unbalanced `#endif'
`#endif' directive가 if 섹션 ('#if', `#ifdef', `#ifndef' 등으로 시작하는) 과 맞게 쓰이지 않을 때 발생합니다. #endif
file:1: unbalanced `#endif'
warning: declaration of `xxx' shadows a parameter
int f(int i)
{
enum e { l, j, k, i};
}
file: In function `f':
file:3: warning: declaration of `i' shadows a parameter
file:4: warning: control reaches end of non-void function
warning: integer overflow in expression
정수로 취급되는 식 (enumerator 포함)에서 오버플로우(overflow)가 일어날 경우에 이 경고가 발생합니다. #include
#error XXX
이 에러는 컴파일러에게 소스가 전달되기 전, 프리프로세서(preprocessor)에 의해 발생합니다. 프리프로세서는 `#error'로 시작하는 문장을 만나면 바로 컴파일 작업을 중단하고 `#error' 문장을 출력합니다. 이는 대개 프로그램 소스가 특별한 환경을 요구하는 경우, 적합하지 않은 환경일 때에는 컴파일이 되지 않게 하기 위한 목적으로 쓰입니다.
ANSI C에서는 몇 개의 미리 정의된(predefined) 상수를 정의하고 있고, 컴파일러에 따라서 추가적인 상수를 제공합니다. `#error'의 경우, 이들 상수와 같이 쓰이는 경우가 일반적이므로, 자세한 것은 컴파일러의 매뉴얼을 참고하시기 바랍니다. #ifndef NEVER_DEFINED
#error NEVER_DEFINED required
#endif
file:2: #error NEVER_DEFINED required
parameter name omitted
int f(int)
{
return 0;
}
file:1: parameter name omitted
`XXX' declared as function returning an array
int f(void)[];
file:1: `f' declared as function returning an array
called object is not a function
void f(void)
{
char *p;
p();
}
file: In function `f':
file:4: called object is not a function
warning: `return' with no value, in function returning non-void
int f(void)
{
return;
}
file: In function `f':
file:3: warning: `return' with no value, in function returning non-void
file
unterminated character constant
문자 상수가 `''로 닫히지 않을 경우에 발생합니다. char ch = 'a;
file:1: unterminated character constant
unterminated comment
주석 [comment]이 `/*'로 닫히지 않을 경우에 발생합니다. /* This is a comment
file:1: unterminated comment
unterminated string or character constant
문자 상수나 문자열이 `"'로 끝나지 않을 경우에 발생합니다. char *str = "cinsk\
the wind
file:1: unterminated string or character constant
file:2: possible real start of unterminated constant
possible real start of unterminated constant
문자 상수나 문자열이 `"'로 끝나지 않을 경우에 발생합니다. char *str = "hello\
world
file:1: unterminated string or character constant
file:2: possible real start of unterminated constant
warning: return-type defaults to `int'
함수의 리턴 형 [return type]을 생략할 경우에 발생합니다. 리턴 형이 생략된 함수의 리턴 형은 `int'입니다. foo(void)
{
return 0;
}
file:2: warning: return-type defaults to `int'
warning: control reaches end of non-void function
함수의 리턴 형 [return type]이 `void'가 아닌데도 함수가 `return' 문을 가지지 않을 경우에 발생합니다. 이 경우 함수를 `void' 형으로 선언하거나 `return' 문을 쓰면 해결됩니다. int foo(void) {}
file:1: warning: control reaches end of non-void function
warning: dereferencing `void *' pointer
void 형 포인터 [pointer]는 다른 형 포인터로 캐스트 [cast]하기 전에는 쓸 수 없습니다. 즉, 이 에러는 void 형 포인터에 역참조 [dereference] 연산자인 `*'를 썼기 때문에 발생합니다. 이 에러를 해결하려면 void 형 포인터를 다른 형 포인터 (예를 들어 `int *')로 캐스팅 [casting]해서 쓰면 됩니다. void foo(void)
{
void *p, *q;
*(p = q);
}
file:4: warning: dereferencing `void *' pointer
file:4: warning: value computed is not used
dereferencing pointer to incomplete type
정의되지 않은 형을 가리키는 포인터 [pointer]에 역참조 [dereference] 연산자(`*')를 쓸 수 없습니다. struct s;
void g(struct s *);
void f(void)
{
struct s *p;
g(*p);
}
file:6: dereferencing pointer to incomplete type
warning: passing arg N of `XXX' makes integer from pointer without a cast
함수 XXX의 N번째 파라메터 [parameter]가 정수형인데도 캐스팅 [casting]없이 포인터를 인자 [argument]로 쓴 경우에 발생합니다. void f(int);
void g(void)
{
f("erroneous");
}
file:4: warning: passing arg 1 of `f' makes integer from pointer without a cast
int f(char *);
void g()
{
f(5);
}
file: In function `g':
file:4: warning: passing arg 1 of `f' makes pointer from integer without a cast
incompatible type for argument N of `XXX'
함수 선언에 쓰인 파라메터 [parameter]의 형과 실제 인자 [argument]의 형이 서로 달라서 변경할 수 없는 경우에 발생합니다. struct s { int a; } p;
void f(void)
{
void g(int, int);
g(5, p);
}
file:5: incompatible type for argument 2 of `g'
too few arguments to function `XXX'
함수 선언에 쓰인 파라메터 [parameter]의 수보다 실제 인자 [argument]의 개수가 적을 경우에 발생합니다. void f(void)
{
void g(int, int);
g(5);
}
file:4: too few arguments to function `g'
too many arguments to function `XXX'
함수 선언에 쓰인 파라메터 [parameter]의 수보다 실제 인자 [argument]의 개수가 많을 경우에 발생합니다. void f(void)
{
void g(int);
g(5, 2);
}
file:4: too many arguments to function `g'
incompatible types in assignment
대입 [assignment] 연산에서 연산자 `=' 사이의 오퍼랜드 [operand]의 형이 서로 완전히 다릅니다. assignment makes integer from pointer without a cast 경고를 참고하시기 바랍니다. struct s {};
void f()
{
struct s st;
int i;
i = st;
}
file:7: incompatible types in assignment
warning: assignment makes integer from pointer without a cast
대입 [assignment] 연산에서 연산자 `=' 양쪽에 오는 오퍼랜드 [operand]가 왼쪽은 정수형, 오른쪽은 포인터일 경우에 이 경고가 발생합니다. 이를 해결하려면 포인터를 정수형으로 캐스팅 [casting]해야 합니다. incompatible types in assignment 에러를 참고하시기 바랍니다. void f()
{
char *cp;
int i;
i = cp;
}
file:5: warning: assignment makes integer from pointer without a cast
top-level declaration of `XXX' specifies `auto'
함수 바깥에 선언된 선언에 `auto' 키워드가 쓰였습니다. `auto' 키워드는 자동 변수 [automatic variable]를 선언하기 위해 쓰는 것이므로 전역 변수 [global variable]에 쓰일 수 없습니다. auto int i;
file:1: top-level declaration of `i' specifies `auto'
register name not specified for `XXX'
`register' 키워드는 자주 쓰이는 변수를 메모리 대신 (가능하다면 [if possible]) CPU의 레지스터 [register]를 쓰도록 합니다. 전역 변수 [global variable]에는 `register' 키워드를 쓸 수 없습니다. register int i;
file:1: register name not specified for `i'
redeclaration of `XXX'
같은 스코프 [scope] 안에 같은 이름이 쓰인 경우에 발생합니다. 다른 변수 이름을 써야 할 것입니다. 이 에러는 `XXX' previously declared here 에러와 함께 발생합니다. void foo()
{
int i;
int i;
i = 3;
}
file:4: redeclaration of `i'
file:3: `i' previously declared here
`XXX' previously declared here
같은 스코프 [scope] 안에 같은 이름이 쓰인 경우에 처음 선언한 곳을 나타내 줍니다. 이 에러는 redeclaration of `XXX' 에러와 함께 발생합니다. void foo()
{
int i;
int i;
i = 3;
}
file:4: redeclaration of `i'
file:3: `i' previously declared here
`#include' expects "FILENAME" or <FILENAME>
`#include'에 쓰이는 파일 이름은 `"'나 `<>'로 둘러싸야 합니다. #include stdio.h
file:1: `#include' expects "FILENAME" or <FILENAME>
numeric constant contains digits beyond the radix
주어진 수치 상수 [numeric constant]가 진법에 맞지 않을 경우에 발생합니다. 예를 들어 8 진수에서 쓰일 수 있는 숫자는 0, 1, ..., 7인데 아래의 예처럼 8을 쓴다거나, 16 진수에서 쓰일 수 있는 문자는 a, b, ..., f인데 f 이후의 문자를 쓸 경우에 발생합니다. int i = 08;
int j = 0xah;
file:1: numeric constant contains digits beyond the radix
file:2: numeric constant contains digits beyond the radix
`#' operator is not followed by a macro argument name
`#' 매크로 연산자는 매크로 인자 [argument] 앞에 나와 이 이 인자를 문자열 [string]로 만들어주는 역할을 합니다. `#' 연산자가 매크로 이름 앞에 나오지 않은 경우에 이 에러가 발생합니다. #define bug(s) s #
file:1: `#' operator is not followed by a macro argument name
`##' at start of macro definition
`##' 매크로 연산자는 두 개의 인자 [argument]를 받아 이들을 하나의 토큰 [token]으로 바꾸어 줍니다. 따라서 `##' 연산자는 `+' 연산자처럼 쓰이며 양쪽에 인자가 와야 합니다. `##' 연산자 앞에 인자가 오지 않을 때 이 에러가 발생합니다. #define bug(s) ## s
file:1: `##' at start of macro definition
`##' at end of macro definition
`##' 매크로 연산자는 두 개의 인자 [argument]를 받아 이들을 하나의 토큰 [token]으로 바꾸어 줍니다. 따라서 `##' 연산자는 `+' 연산자처럼 쓰이며 양쪽에 인자가 와야 합니다. `##' 연산자 뒤에 인자가 오지 않을 때 이 에러가 발생합니다. #define bug(s) s ##
file:1: `##' at end of macro definition
`XXX' defined as wrong kind of tag
struct이나 union, enum을 써서 한 형을 만들때, 이 때 사용한 tag (예를 들어 struct s;에서 tag는 `s'가 됩니다.)가 다른 타입에서 쓰일 때 이 에러가 발생합니다. struct s { int x, y, z; };
void f()
{
union s foo;
foo.x = 1;
}
file:4: `s' defined as wrong kind of tag
negative width in bit-field `XXX'
bit field에서 bit 갯수를 지정할 때 음수 [negative number]나 0을 쓸 수 없습니다. struct s { int x : -3; };
file:1: negative width in bit-field `x'
warning: width of `XXX' exceeds its type
Bit field의 크기가 주어진 형의 크기를 넘을 경우 발생합니다. 크기가 큰 다른 형으로 바꾸거나 bit field의 크기를 줄여 해결할 수 있습니다. struct s { char c : 20; };
file:1: warning: width of `c' exceeds its type
break statement not within loop or switch
`break' 키워드는 switch, while, do-while, for 내부에서만 쓰일 수 있습니다. `break'를 다른 곳에서 쓸 경우 이 에러가 발생합니다. void f()
{
break;
}
file:3: break statement not within loop or switch
request for member `XXX' in something not a structure or union
`.' 연산자는 구조체 [structure]나 union에서 멤버 [member]를 엑세스하기 위해 사용하며, 구조체나 union이 아닌 곳에서 `.'를 사용할 경우에 이 에러가 발생합니다. 대개의 경우, 구조체의 이름을 틀리게 썼을 경우에 발생합니다. struct s { int i; };
void f()
{
char c;
c.i = 3;
}
file:5: request for member `i' in something not a structure or union
char-array initialized from wide string
C 언어는 여러 나라의 언어를 지원하기 위해 multibyte 문자인 wide character를 지원합니다. Wide character 상수는 문자 상수나 문자열 앞에 'L'을 붙여 나타내며 이 형은 wchar_t (<stddef.h>에 정의되어 있습니다) 입니다. 이 에러는 wchar_t 형 문자열을 char 형 배열에 초기값으로 쓸 때 발생합니다. 배열을 wchar_t 형으로 선언하거나 초기값을 char 형 상수를 써서 이 에러를 해결할 수 있습니다. char a[] = L"abc";
file:1: char-array initialized from wide string
declaration of `XXX' as array of voids
void 형은 포인터 형으로 쓰거나 함수의 return 값으로 쓰이는 경우에만 의미가 있습니다. 다른 경우, 예를 들어 void 형 배열을 선언하는 것은 옳지 않습니다. void a[3];
file:1: declaration of `a' as array of voids
invalid macro name `defined'
프리프로세서 [preprocessor]의 연산자인 `defined'는 매크로 이름으로 정의될 수 없으며, 정의를 취소할 수도 없습니다.
invalid macro name `XXX' 에러를 참고하시기 바랍니다. #undef defined
#define defined abc
file:1: invalid macro name `defined'
file:2: invalid macro name `defined'
#undef 4
file:1: invalid macro name `4'
invalid type argument of `unary *'
단항 연산자 [unary operator] `*'는 포인터 앞에서 이 포인터가 가리키는 것을 역참조 [dereference]하기 위해 쓰입니다. `*' 연산자가 포인터가 아닌 다른 형에 쓰이면 이 에러가 발생합니다. void f()
{
int i;
*i = 3;
}
file:4: invalid type argument of `unary *'
arithmetic on pointer to an incomplete type
아직 완전하게 정의가 알려지지 않은 형에 대해서 포인터 연산을 수행할 수 없습니다. 아래의 예에서 이 에러가 발생하지 않게 하려면 먼저 `struct s' 형의 정의를 내려야 합니다. struct s;
void g(struct s*);
void f()
{
struct s *p;
g(p + 1);
}
file:6: arithmetic on pointer to an incomplete type
XXX: No such file or directory
`#include'에서 쓴 파일을 찾을 수 없을 때 이 에러가 발생합니다. 대개 이 에러는 사용자가 만든 파일을 `"' 대신 `<>'로 둘러싸거나 파일 이름을 틀리게 입력하거나, 또는 컴파일러 옵션에서 디렉토리 설정이 잘못되어 있는 경우, 컴파일러에서 쓰이는 환경 변수 [environment variable]가 잘못 지정되어 있는 경우에 발생합니다. 자세한 것은 GCC 문서(info)에서 `-I' 옵션이나 `C_INCLUDE_PATH' 환경 변수를 참고하시기 바랍니다. #include <where_is_it.h>
file:1: where_is_it.h: No such file or directory
variable or field `XXX' declared void
변수나 field는 void 형으로 선언할 수 없습니다.
저자가 쓰고 있는 GCC 2.7.2는 전역 변수 [global variable]로 `void a;'를 선언하면 이 에러를 만들지 않습니다. 이는 버그인 것으로 생각되는데, 이 문제에 대해 도움을 주실 수 있는 분은 알려 주시면 감사하겠습니다. 연락처는 이 문서의 처음에 있습니다. void foo()
{
void a;
}
file:3: variable or field `a' declared void
file:4: warning: unused variable `a'
`XXX' has both `extern' and initializer
함수의 내부에서 `extern'으로 선언된 오브젝트 [object]는 초기값 [initializer]을 가질 수 없습니다. `XXX' initialized and declared `extern' 경고를 참고하시기 바랍니다. extern int i = 1;
void f()
{
extern int j = 3;
}
file:1: warning: `i' initialized and declared `extern'
file: In function `f':
file:4: `j' has both `extern' and initializer
tmp.c:4: warning: unused variable `i'
warning: `XXX' initialized and declared `extern'
`extern'으로 선언된 오브젝트 [object]에 초기값 [initializer]을 주면 `extern'은 무시됩니다. `XXX' has both `extern' and initializer 에러를 참고하시기 바랍니다. extern int i = 1;
void f()
{
extern int j = 3;
}
file:1: warning: `i' initialized and declared `extern'
file: In function `f':
file:4: `j' has both `extern' and initializer
tmp.c:4: warning: unused variable `i'
function `XXX' is initialized like a variable
함수로 선언 [declaration]된 이름은 초기값 [initializer]을 가질 수 없습니다. int f(void) = 3;
file:1: function `f' is initialized like a variable
parameter `XXX' is initialized
예전 방식 [old style]으로 선언된 함수에서 파라메터 [parameter]는 초기값 [initializer]을 가질 수 없습니다. void f(i)
int i = 3;
{
}
file:2: parameter `i' is initialized
typedef `XXX' is initialized
`typedef'는 기존의 형에 대해 새 형 이름 [type name]을 정의하는 것이기 때문에 초기값 [initializer]을 가질 수 없습니다. typedef int INT = 1;
file:1: typedef `INT' is initialized
No such file or directory
컴파일러가 주어진 파일 이름 (디렉토리 포함)을 찾을 수 없을 때 발생합니다. 대개 파일 이름을 틀리게 입력했을 때 발생합니다. gcc where_is_it.c
where_is_it.c: No such file or directory
macro or `#include' recursion too deep
매크로나 `#include'가 재귀적으로 너무 깊게 반복될 때 발생합니다. 예를 들어 `util.h'가 `types.h'를 포함 (#include)하고, `types.h'가 다시 `util.h'를 포함하는 경우, 이들 파일을 소스에 포함시키면, 서로가 서로를 계속 포함시키게 되므로 결국 컴파일러는 이 에러를 발생시킵니다. 이럴 때에는 `#ifndef', `#define', `#endif' 등을 써서 재귀적으로 포함되지 않게 해서 해결합니다. #include "util.h"
file:1: macro or `#include' recursion too deep
invalid use of undefined type `XXX'
주어진 형이 완전히 정의되지 않은 상태에서 이 형을 사용할 수 없습니다. 아래의 예에서는 함수 g()의 return 형이 `struct s'이지만 `struct s'는 아직 정의되지 않았습니다. 이 때 g()를 부르는 것은 옳지 않습니다. 이 문제를 해결하려면 함수 g()를 부르기 전에 먼저 `struct s'를 정의해야 합니다. void f()
{
struct s g();
g();
}
file:4: invalid use of undefined type `struct s'
attempt to take address of bit-field structure member `XXX'
Bit field에는 `address of' 연산자인 `&'를 쓸 수 없습니다. struct s { int i : 3; };
void f()
{
struct s p;
int *ip = &p.i;
}
file:5: attempt to take address of bit-field structure member `i'
file:5: warning: unused variable `ip'
warning: address of register variable `XXX' requested
`register'로 선언 [declaration]된 변수에 `address of' 연산자를 쓸 경우에 발생합니다. `register'를 쓴다고 항상 CPU의 레지스터에 이 변수가 저장되는 것은 아니지만, 실제 CPU 레지스터의 사용 여부에 상관없이 `register'를 쓴 변수의 주소를 얻는 것은 옳지 않습니다. void f()
{
register int i;
int *ip = &i;
ip = 0;
}
file:4: warning: address of register variable `i' requested
`sizeof' applied to a bit-field
Bit-field에는 `sizeof' 연산자를 쓸 수 없습니다. struct s { int i : 3; };
void f()
{
struct s p;
int i = sizeof(p.i);
i = 3;
}
file:5: `sizeof' applied to a bit-field
warning: case value out of range
`case'에서 쓴 상수식 [constant expression]은 `switch'에서 쓴 데이터 형의 범위를 넘을 수 없습니다. 아래의 예에서는 `case'의 상수식 0xffffff가 `char' 형의 범위를 넘었기 때문에 발생합니다. 이 문제를 해결하려면 `switch'에서 쓴 데이터의 형을 좀 더 큰 형 (예를 들어 `int')으로 바꾸어야 합니다. void f()
{
char c;
switch (c) {
case 0xffffff:
;
}
}
file:5: warning: case value out of range
case label not within a switch statement
`case'는 `switch' 구조 안에서만 쓸 수 있습니다. void f()
{
case 4:
;
}
file:3: case label not within a switch statement
character constant too long
정수안에 들어가기에는 너무 많은 문자를 가지고 있는 상수를 쓸 때에 이 에러가 발생합니다. int i = 'abcde';
file:1: character constant too long
warning: escape sequence out of range for character
문자 상수나 문자열에 쓰인 escape sequence가 너무 큰 값을 가지고 있어 문자 [unsigned char]로 표현할 수 없을 때 이 경고가 발생합니다. 이러한 값들은 적절하게 잘라내 [truncate] 버립니다. char *p = "\x1ff\400";
file:1: warning: escape sequence out of range for character
file:1: warning: escape sequence out of range for character
continue statement not within a loop
`continue' 키워드는 루프 [loop] (for, while, do-while) 안에서만 의미가 있습니다. `continue'를 루프 밖에서 쓰는 것은 옳지 않습니다. void foo()
{
continue;
}
file:3: continue statement not within a loop
invalid operands to binary X
X는 바이너리 연산자 (예: +, -, *, /, ==, !=, <=, >= 등)이며, 연산자의 오퍼랜드 형은 스칼라 [scalar] 형이어야 합니다. 즉 정수나 실수이어야 하며, 구조체 [structure]나 union 형이 올 수 없습니다.
이 에러는 조건식 [conditional expression]이 필요한 if, for, while, do-while 등에서 구조체나 union형을 쓸 때에도 발생합니다.
또 이 에러는 형이 다른 포인터에 연산을 취할 때에도 발생할 수 있습니다. struct s { int i; };
void f()
{
struct s p;
int i = (p != 0);
while (p) {
}
}
file: In function `f':
file:5: invalid operands to binary !=
file:7: invalid operands to binary !=
file:5: warning: unused variable `i'
void f()
{
char *cp;
int *ip;
int i;
i = ip - cp;
}
file: In function `f':
file:6: invalid operands to binary -
이 에러는 조건식인 `? :'을 쓸 때에도 발생합니다. 조건식 `e1 ? e2 : e3'는 `e1'이 참일 경우, `e2'가 평가되고, 거짓일 때에는 `e3'가 평가됩니다. 이 때 이 조건식은 `if (e1 != 0) e2 else e3'로 취급되므로 만약 `e1'이 스칼라 형이 아니면 이 에러가 발생합니다. struct s { int x; } st;
void f(void)
{
int i = st ? 3 : 4;
}
file: In function `f':
file:5: invalid operands to binary !=
file:5: warning: unused variable `i'
warning: overflow in implicit constant conversion
주어진 상수를 함축적으로 [implicitly] 변환 [conversion]할 때 오버플로우 [overflow]가 발생할 때 이 경고가 발생합니다. 아래의 예는 `int' 형의 범위를 넘는 실수 상수 (double 형)를 `int' 형에 대입하려 하는 경우를 나타냅니다. int i = 1e300;
file:1: warning: overflow in implicit constant conversion
warning: declaration of `XXX' shadows a parameter
함수 내부에서 이 함수에 전달되는 파라메터 [parameter]와 같은 이름을 선언한 경우에 발생합니다. 즉 파라메터의 이름이 새 선언 [declaration]에 의해 가려졌으므로 이 선언이 나온 다음부터는 이 이름을 가진 파라메터를 쓸 수 없습니다. 이 경우, 둘 중 하나를 다른 이름을 갖게 고치는 것이 좋습니다. void f(int i, int INT)
{
int i;
i = 3;
}
file:3: warning: declaration of `i' shadows a parameter
warning: data definition has no type or storage class
데이터 (함수나 변수등)를 정의할 때 형을 쓰지 않을 경우 발생합니다. 일반적으로 함수나 변수의 return 형을 쓰지 않을 때 발생하며, 이 때에는 `int' 형으로 간주됩니다. i;
f();
file:1: warning: data definition has no type or storage class
file:2: warning: data definition has no type or storage class
default label not within a switch statement
`default' 키워드는 `switch' 문 [statement] 안에서만 쓸 수 있습니다. void f()
{
default:
;
}
file:3: default label not within a switch statement
invalid macro name `XXX'
매크로 이름은 유효한 [valid] C 언어 이름 [identifier]이 나와야 합니다. 즉 첫글자는 [_a-zA-Z]이며, 두번째 글자부터는 [_a-zA-Z0-9]입니다. 아래의 예에서 `3'은 이름 [identifier]이 될 수 없기 때문에 이 에러가 발생합니다.
invalid macro name `defined' 에러도 참고하시기 바랍니다. #define 3
file:1: invalid macro name `3'
invalid format `#line' directive
`#line' 지시어 [directive] 뒤에는 라인 번호를 의미하는 수치가 나와야 합니다. 이 수치는 0이 아닌 양수 [positive number]이어야 합니다.
invalid #-line 에러를 참고하시기 바랍니다. #line 02a
file:1: invalid format `#line' directive
warning: unknown escape sequence `\x'
문자열에서 `\' 뒤에 오는 문자는 특정한 뜻이 있는 몇 개의 문자만 쓸 수 있습니다. 예를 들어 `\n'은 newline 문자를 나타내고, `\t'는 tab 문자를 나타냅니다. 이를 `escape sequence'라고 하며, 알려지지 않은 문자가 `escape sequence'로 쓰인 경우 이 경고가 발생합니다. 이 때 쓰인 `\x'는 일반 문자 `x'로 취급됩니다. int i = '\q';
file:1: warning: unknown escape sequence `\q'
duplicate case value
두 `case' 문장에서 같은 상수 값이 쓰였을 때 발생합니다. void f()
{
int a = 3;
switch (a) {
case 1:
case 1:
default:
break;
}
}
file: In function `f':
file:6: duplicate case value
file:5: this is the first entry for that value
multiple default labels in one switch
`switch' 문장 안에서 `default' 레이블이 두 개 이상 쓰였을 경우 발생합니다. void f()
{
int a = 3;
switch (a) {
case 1:
default:
default:
break;
}
}
file: In function `f':
file:7: multiple default labels in one switch
file:6: this is the first default label
duplicate member `XXX'
`struct'이나 `union'에서 같은 이름이 두 개 이상의 멤버에 쓰였을 때 이 에러가 발생합니다. 각각 다른 이름을 써서 이 에러를 없앨 수 있습니다. struct s {
int i;
float i;
};
file:3: duplicate member `i'
`#elif' after `#else'
선택적 컴파일을 할 수 있는 `preprocessor directive'인 `#if', `#elif', `#else', `#endif'에서 `#elif'는 항상 `#else' 앞에 나와야 합니다. #if defined(ONE)
int i = 1;
#elif defined(TWO)
int i = 2;
#else
int i = 3;
#elif defined(FOUR)
int i = 4;
#endif
file:7: `#elif' after `#else'
(matches line 1)
`#XXX' not within a conditional
`Preprocessor directive'인 `#else'나 `#elif'는 `#if'나 `#ifdef', `#ifndef' 등의 if 섹션의 일부로 쓰여져야 합니다. `#elif'가 단독으로 쓰였을 경우 이 에러가 발생합니다. #elif defined(TWO)
int i = 2;
#endif
file:1: `#elif' not within a conditional
file:3: unbalanced `#endif'
#else
int i = 2;
#endif
file:1: `#else' not within a conditional
file:3: unbalanced `#endif'
invalid initializer
`struct'이나 `union'의 초기값을 중괄호({})로 싸지 않는 등, 잘못된 초기값을 썼을 때 이 에러가 발생합니다. struct s {
int x;
int y;
} st = 1;
file:4: invalid initializer
enumerator value for `AA' not integer constant
Enumerator로 쓰일 수 있는 상수는 반드시 정수형 값을 가져야 합니다. 실수(real)나 다른 상수가 아닌 값이 쓰이면 이 에러가 발생합니다. enum A { AA = 0.1, BB = 2 };
file:1: enumerator value for `AA' not integer constant
warning: parameter names (without types) in function declaration
함수의 선언은 ANSI 방식과 옛 방식 중 하나를 쓸 수 있습니다. 옛 방식은 함수의 인자 리스트를 쓰지 않고, ANSI 방식은 인자의 타입과 갯수를 꼭 지정해야 합니다. 아래의 예에서는 함수 f의 인자인 `i'의 타입을 지정하지 않았기 때문에 이 경고가 발생한 것입니다.
int f(i); file:1: warning: parameter names (without types) in function declaration
undefined or invalid # directive
#abc
file:1: undefined or invalid # directive
invalid preprocessing directive name
# 0x12
file:1: invalid preprocessing directive name
conflicting types for `XXX'
int i;
long i;
file:2: conflicting types for `i'
file:1: previous declaration of `i'
redefinition of `XXX'
int i = 0;
int i = 1;
file:2: redefinition of `i'
file:1: `i' previously defined here
empty #if expression
#if
int i = 2;
#endif
file:1: empty #if expression
unterminated `#if' conditional
#ifdef A
int i = 1;
file:1: unterminated `#if' conditional
warning: `#ifdef' with no argument
#ifdef
int i = 1;
#endif
file:1: warning: `#ifndef' with no argument
#ifndef
int i = 1;
#endif
warning: implicit declaration of function `XXX'
void f()
{
g();
}
file:3: warning: implicit declaration of function `g'
void value not ignored as it ought to be
int f()
{
void g();
int i = (int)g();
return i;
}
file: In function `f':
file:5: void value not ignored as it ought to be
structure has no member named `XXX'
struct abc {
int a, b;
};
void f()
{
struct abc a;
a.c = 0;
}
cf. union도 같음
file: In function `f':
file:8: structure has no member named `c'
warning: initialization makes integer from pointer without a cast
int i = "abc";
file:1: warning: initialization makes integer from pointer without a cast
badly punctuated parameter list in `#define'
#define max(a
file:1: badly punctuated parameter list in `#define'
storage size of `XXX' isn't known
struct s st;
file:1: storage size of `st' isn't known
file:
file:
file:
file:
http://coffeenix.net/data_repository/html/gcc-err.html
zterm 에서 out of memory 문제
Fedora core6를 설치하고 sshd를 띄운뒤에, WindowsXP가 설치된 데스크탑에서 zterm을 이용해서 접속을 했더니 엥?! 웬 Out of Memory?!!!
알고보니 zterm은 ssh Protocol 1만을 지원한단다.
Fedora Core 6에서 기본세팅은 ssh Protocol 2로 되어있는데;;(/etc/ssh/sshd_config)
sshd_config 파일을 열어보면 Protocol 2 라고 되어 있는 바로 윗 라인에 Protocol 2, 1 이라고 써있고 주석처리가 되있다. 그 라인의 주석처리를 없애고, Protocol 2 라고 되어 있는 라인만 주석처리하면 된다.
그리고 sshd 다시 시작.
service sshd restart
오오!!! zterm도 접속된다ㅠ-ㅠ
putty는 ssh protocol 2도 지원하므로 문제 없단다- -~
http://blog.naver.com/bluemoonlk/110017408177
윈도우즈의 버전을 업데이트 하는 것과 마찬가지로 리눅스도 커널컴파일을 통해 보다 높은 버전의 커널을 설치할 수 있다.
커널을 다운로드 받는 사이트로는 http://www.kernel.org 라는 곳에서 다운을 받아 컴파일 하도록 하자~~!
( 예제로 사용할 커널의 버전은 2.6.22.1 버전을 사용하도록 하겠다. 사이트에서 "F"를 누르면 풀 버전을 다운받을 수 있다. )
root@localhost ~ ]# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.1.tar.bz2
=> wget을 이용해서 커널의 풀 버전을 다운로드 받자~~~!
root@localhost ~ ]# tar xvfj linux-2.6.22.1.tar.bz2 -C /usr/src => 커널의 압축을 "/usr/src"디렉토리에 푼다.
root@localhost ~ ]# cd /usr/src/linux-2.6.22.1 => 압축을 푼 디렉토리로 이동
root@localhost linux-2.6.22.1 ]# make mrproper => 커널의 설정을 초기화 시킨다.
root@localhost linux-2.6.22.1 ]# make xconfig => ( X-Window 의 커널 환경을 설정한다. )
만약, 텍스트 모드로 커널 환경 설정을 하고 싶다면 "make menuconfig"라고 입력하면 된다.
※ 환경설정모드로 넘어가지지 않고 에러가 뜨는 경우 qt-devel, gcc-c++, ncurses-devel 라는 패키지가 없어 생기는 경우가 많으므로 yum이나 apt-get으로 패키지를 설치하자 ( 의존성 파일이 많으므로 패키지 받아서 설치는 비추..ㅡㅡ;)
=> xconfig 사용시 설정..( 원하는 방법으로 설정해도 되지만... 잘 모르는 경우를 대비해 CPU와 파일시스템 잡는 것만 이야기하겠다.)
CPU => Process type and features -> processor family 에서 자신에게 맞는 CPU 타입 지정
파일 시스템 => File systems -> DOS/FAT/NT File systems -> 지원되길 원하는 윈도우즈 파일 시스템 지정
다 지정하면 저장하고 종료~~~!
=> 뭐 xconfig와 그다지 크게 다른 것이 없다....ㅋ
CPU => Processor type and features -> Processor Family (엔터) -> CPU타입 지정
파일 시스템 => File systems -> DOS/FAT/NT File systems -> 지원받을 윈도우즈 파일시스템 지정
다 했으면 저장하고 빠져나오자~~~! ( Exit로 빠져나오다 보면 제일 마지막에 저장할 것인지 묻는다... 거기서 Yes )
root@localhost linux-2.6.22.1 ]# make clean => 이전의 컴파일 정보를 삭제하자~~!
root@localhost linux-2.6.22.1 ]# make => 커널 컴파일의 환경 설정대로 소스를 실제 컴파일 하는 과정
시간이 제법 걸리므로 천천히 여유있게 받아라... 짜증내지 말구...ㅋ
root@localhost linux-2.6.22.1 ]# echo $? => "make"과정에서 문제가 발생했는지 알아보는 명령어 ( "0"은 정상실행 )
root@localhost linux-2.6.22.1 ]# make modules_install => 컴파일된 모듈을 /lib/modules/ 디렉토리에 설치하자~~!
root@localhost linux-2.6.22.1 ]# echo $? => 위 명령어의 에러 여부를 확인 ~~!
root@localhost linux-2.6.22.1 ]# make install => 실제 컴파일된 커널을 /boot/ 디렉토리에 설치하자~~!
root@localhost linux-2.6.22.1 ]# vi /etc/grub.conf => 새롭게 생성된 커널을 확인하자~~~!
생성된 커널로 부팅하려면 default=0 으로 고치자~~!
root@localhost linux-2.6.22.1 ]# shutdown -r now => 생성된 커널로 부팅하기 위해 재부팅 명령어를 입력하자~~!
root@localhost ~ ]# uname -r => 커널 버전을 확인~~ 제대로 바껴있다면.. 설치가 완료된것이다~~!!
http://blog.naver.com/sweatmeat/10020438449보호글
캐럿보이컴 :: Controlling Memory Space of Other Process
2008/01/17 00:25보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.
1 교정과정
2 소개인터네트 환경이 눈부시게 발전했지만 인터네트를 가로지르는 데이터양은 이에 초과해서 늘어나고 있다. 요즘 대두되고 있는 원격 회상 회의, 원격 교육, 인터넷 대화형 TV등의 서비스는 엄청난 양의 데이터 교환이 필요하며, 인터네트 망의 한계 때문에 특별한 경우를 제외하고 원할한 서비스가 사실상 불가능하다. 혹은 서비스질이 크게 떨어지거나 상당한 비용을 지불해야 한다. 단순하게 생각하면 돈을 투자해서 네트워크 망 환경을 크게 개선시키면 되긴 하겠지만 엄청난 비용과 시간이 필요한 작업이다. 그렇다면 이러한 망 환경의 개선과 더불어 소프트웨어적인 다른 방법을 동원해서 문제를 해결하는게 더 좋은 방법일 것이다. 이번에는 소프트웨어적인 문제 해결방법중 하나인 멀티캐스팅에 대해서 알아보도록 하겠다. 3 캐스팅 개론캐스팅은 "던진다"라는 뜻을 가진다. 대표적인 던지기 스포츠인 야구만 봐도 "커브", "직구", "포크", "스크루", "씽커", "캣패스트", "체인지업", "아리랑볼?", "88 마구?"등 참 다양하기도 하다. 물론 우리는 공 던지는 법을 다루지는 않을 것이다. 우리가 다루는 내용은 인터네트 상에서 데이터를 던지는(캐스팅)방법을 다룰 것이다. 여러가지 캐스팅 방법중 멀티캐스팅에 대해서 다룰 것이며 이해를 돕기 위해서 중요한 다른 캐스팅 방법에 대해서도 간단히 알아 볼 것이다. 캐스팅에는 크게 3가지 기법이 있다. 캐스팅 종류 3.1 유니 캐스팅WAN과 LAN상에서 이루어지는 가장 일반적인 방식으로 서버와 클라이언트가 1대 1로 연결되고 데이터를 주고 받는다. 만약 하나의 서버에 100개의 클라이언트가 연결한다면 100개의 연결이 만들어 지고 서버는 동일한 데이터를 100개 복사해서 각각의 클라이언트에게 전송하게 될 것이다. 이 방식은 구현이 간단하고 웹과 같은 연결별 다른 데이터를 보내야 하는 분야에서는 쓸만하지만 동일한 데이터를 다수의 유저에게 전달시켜야 하는 실시간 멀티미디어 서비스에는 그리 적합하지 않다. -대량의 동일한 데이터가 유저 수만큼 복사되기 때문이다.- 소켓을 통한 일반적은 네트워크 프로그래밍은 유니캐스트 방식이다. 3.2 브로드 캐스팅브로드캐스팅(boradcasting)는 보내고자 하는 정보를 모든 수신자에게 보내는 방식으로, 서브네트워크에서 하나의 호스트가 데이터를 보내면 서브네트워크의 모든 호스트로 데이터가 전송된다. 데이터를 받을지 아니면 무시할지는 순전히 받는 측에서 결정하게 된다. 브로드 캐스팅은 주로 서브 네트워크 환경에서 주변의 호스트 정보를 알아오기 위한 데이터 교환용으로 널리 사용된다. 가장 대표적인 브로드 캐스팅 데이터는 arp데이터가 될것이다. 스위칭 라우터를 예로 들어서 생각해보도록 하자. 스위칭 라우터는 외부에서 들어온 데이터를 서브네트워크의 적당한 호스트로 보내야 할것이다. 이러한 작업을 위해서 보통 IP를 사용하는데, IP는 논리적인 값으로써 변경될 수 있는 값이므로 IP만 가지고 원하는 호스트와 통신하는건 적절하지 못하다. 이러한 문제를 해결하기 위해서 이더넷카드의 물리적인 번호와 IP번호를 맵핑시키는 방법을 사용하게 된다. 이는 라우터에만 적용되는게 아닌 서브네트워크의 단일 호스트에도 적용된다. 호스트가 새로 부팅 되었을 경우 이 호스트는 주변 호스트에 대한 아무런 정보도 가지고 있지 않는다. 이 호스트의 주소가 192.168.0.25인데, 192.168.0.26로 데이터를 전송할 일이 생겼다고 가정해 보자. 이 호스트는 192.168.0.26호스트가 어디에 있는지 알지 못한다. 이를 위해서 arp 패킷을 브로드 캐스팅 형식으로 서브네트워크에 있는 모든 호스트에게 보내게 된다. 패킷의 내용은 이를 테면 "192.168.0.26 주소를 가지는 호스트는 MAC주소와 함께 응답을 달라"이다. 일치하는 주소의 호스트는 MAC 정보를 채워 넣어서 192.168.0.25로 패킷을 보내게 된다. 이 처럼 브로드 캐스팅이 유용하게 사용되는 영역도 있긴 하지만 동일한 데이터가 모든 서브 네트워크로 전송된다는 특징 때문에 네트워크에 과도한 부하를 주는 경우가 발생하기도 한다. 때문에 대부분의 라우터들은 브로드 캐스팅을 허용하지 않는다. 서브네트워크에서 제한된 용도로만 사용할 수 있다. 3.3 멀티 캐스팅우리가 관심있어 하는 주제다. 유니 캐스트방식의 단점은 동일한 데이터를 연결갯수 만큼 복사해야 한다는 점인데, A라는 서브네트워크 그룹에서 10대의 PC로 B라는 미디어 서버로 인터넷 TV방송을 시청하는 경우를 생각해 보자. 이럴 경우 굳이 B서버에서 10번의 동일한 패킷 복사를 할필요 없이 B에서는 하나의 패킷만을 보내고 A서브네트워크를 담당하는 라우터등에서 패킷을 복사해서 A서버로 복사하는게 훨씬 효율적일 것이다. 유니캐스팅과 멀티캐스팅의 차이 멀티 캐스팅은 데이터를 보내는 호스트에서 하나의 데이터만 나가고 밑단의 호스트에서 정보를 받기를 원하는 호스트에게 데이터를 복사해서 보내게 된다. 당연히 효율적인 네트워크의 사용이 가능한데, 특히 데이터의 양이 많은 멀티미디어의 경우 멀티 캐스팅은 매우 필요한 기술이라고 볼수 있다. 요약하자면 (IP)멀티캐스팅은 단일 IP 목적지 주소로 여러 호스트들의 집합인 "호스트 그룹"에 IP 데이터 그램을 전송하는 것이다. 데이터 그램이란 어감에서 알 수 있듯이 멀티캐스팅 데이터는 UDP 데이터 그램과 같은 특징을 가진다. 즉 데이터는 전송중에 손상될 수 있으며 순서가 뒤바뀔 수도 있다. 조금만 깊이 생각해보아도 말단에서 단방향으로 복사되는 멀티캐스팅 데이터의 특성상 재전송 요청과 같은 TCP고유의 기능이 필요없다는 것을 알 수 있다. 다음은 지금 까지 다루었던 3가지의 캐스팅 방법을 비교한 그림이다. 캐스팅의 종류와 차이점 4 멀티캐스팅그럼 멀티캐스팅에 대해서 좀더 자세히 알아보도록 하겠다. 4.1 인터넷(IP) 프로토콜차원에서 본 멀티 캐스팅인터넷 프로토콜(IP)상에서 어떻게 멀티 캐스팅이 이루어질 수 있는가 ? 우리는 IP프로토콜이 관리등의 이유로 여러개의 클래스(class)로 나뉘어서 관리되고 있다는 것을 알고 있다. subnetworking을 참고하하라. 참고기사를 보면 단지 A, B, C 3개의 클래스만을 생각하고 있으나 이 외에도 D클래스가 사용되고 있다. 위 문서에서는 주제를 설명하는데 있어서 D클래스가 필요 없기 때문에 제외한 것 뿐이다. D클래스는 224.0.0.1 에서 239.255.255.254의 범위를 가지며, 멀티캐스팅을 위해서는 이들 주소범위에 있는 주소가 할당되어 있어야 한다. 네트워크 호스트 그룹에 데이터를 전송한다는 멀티캐스팅의 특징으로 보통 라우터에 멀티캐스팅 주소가 할당이 된다. 이렇게 해서 라우터까지 데이터가 도달했다면 라우터는 자신이 관리하는 여러 호스트중 데이터 수신을 원하는 호스트에만 데이터를 전송해야 할 것이다. 어떤 방식으로 원하는 호스트에게만 찝어서 데이터를 보낼 수 있는지 알아 보도록 하자. 4.2 IGMP 프로토콜을 이용한 멀티캐스팅 데이터 수신이러한 멀티캐스팅 데이터의 수신을 위해서 IGMP프로토콜을 사용한다. IGMP는 Internet Control Message Protocol의 줄임말로 인터네트 그룹 관리 규약이라고 불리운다. IGMP패킷은 다음과 같은 형식으로 전달된다. IGMP 패킷구조 IGMP 헤더의 구조 요청 타입 설명
Create Group Request를 이용하면 멀티캐스팅 그룹생성을 요청할수 있는데, 그룹을 생성시킬 때 Code값을 명시함으로써 Public 혹은 Private로 그룹의 성격을 결정할 수 있다. Cope 설명
호스트가 Create Group Request를 이용해서 그룹의 생성을 요청하면 요청을 받은 호스트나 라우터는 다음과 같은 응답을 보내게 된다. 응답의 종류
IGMP checksum은 IGMP헤더에 포함된 메시지를 체크하기 위해서 사용되는 값이다. IGMP메시지를 받은 측에서는 checksum값과 IGMP헤더의 메시지와 비교하는 방식으로 잡음등으로 인한 패킷손실이 있었는지를 검사하게 된다. Identifier은 현재 사용되어지지 않고 있으며, 0으로 채워져 있다. Group Address는 IGMP헤더의 실질적인 핵심으로 라우터와 호스트들은 이 그룹주소에 자신이 받기를 원하는 멀티캐스팅데이터의 주소를 명시해서 라우터에게 전송함으로써 라우터에게 "나는 이 멀티캐스팅 그룹에 join되어 있음"을 알려주게 된다. 예를 들어 225.100.1.5에서 멀티캐스팅 데이터가 225.100.1.6으로 전송된다고 가정해 보자. 225.100.1.6에 있는 호스트들이 이 데이터를 라우터로 부터 받기 위해서는 IGMP패킷에 그룹주소를 225.100.1.5를 명시해서 라우터에 보내면 된다. 그러면 라우터는 멀티캐스팅 라우팅 테이블을 검사해서 어느 호스트로 데이터를 보내야 하는지 알 수 있게 된다. 참고로 IGMP는 ICMP와 같은 레벨의 프로토콜(인터넷 프로토콜)로 IP+IGMP의 형태로 교환된다. 그러므로 라우터는 들어온 멀티캐스팅 데이터를 어느 호스트 IP로 보내야 할지를 결정할 수 있게 된다. 멀티캐스팅 라우터 테이블은 대충 아래와 같은 정보를 가지고 있다. 192.168.1.50 225.100.1.5 192.168.1.51 225.100.1.5 192.168.1.52 225.100.1.5 192.168.1.85 225.100.2.5멀티캐스팅 라우터 테이블이 위와 같다고 할때 225.100.1.5에서의 멀티캐스팅 데이터는 50, 51, 52로 전송되고 225.100.2.5에서의 멀티캐스팅 데이터는 85로 전송될 것이다. 그룹으로의 멀티캐스팅 5 인터넷(IP)환경에서의 멀티 캐스팅이상으로 멀티 캐스팅에 대한 개략적인 내용들에 대해서 알아보았다. 그렇다면 실제 인터넷 환경에서 멀티캐스팅이 효과적으로 이루어질 수 있는지 만약 그렇지 못하다면 다른 대안들이 있는지에 대해서 알아보도록 하자. 5.1 인터넷에서의 멀티 캐스팅기술 적용의 어려움안타깝게도 인터넷상에서 멀티캐스팅 서비스를 하는건 그리 쉬운문제가 아니다. 이 문제에 관해서 irc의 joinc채널에서 minzkn님과 산하님과의 토론이 있었다. 토론의 결과 인터넷(WAN)환경에서의 멀티캐스팅의 전격적인 적용은 (아직 까지는)사실상 어렵다는 결론에 도달했다. 이유는 경로배정을 위한 라우터의 경우 멀티캐스트 IP를 라우팅 할 수 있어야 하는데, 현재 인터넷 상에는 멀티캐스팅 기능을 가지지 않은 장비가 상당히 존재하기 때문이며, 이 장비들을 모두 교체한다는 것이 사실상 불가능 하기 때문이다. 또하나 그게 가능한 환경이라고 할 지라도..안되는(어려운) 이유는 멀티캐스팅이 가져올 수 있는 불확실한 네트웍부하때문이다. 멀티캐스팅 IP를 가진 많은 인터넷 방송데이터들이 엄청나게 ISP의 라우터와 스위치로유입될것은 물론이거니와... 자칫 잘못하면.. 갈곳없는 데이터들이 스위치나 네트웍속을 떠돌아다닐 가능성이 존재한다. 결론은 멀티캐스팅은 공중파수준의 인터넷방송을 가능하게 할 수 있는 꿈의 기술인것은 사실이나 이것이 현실화되기위해선 전 라우터의 멀티캐스팅지원과 보다 더 우수하고 내부 대역폭이 더 큰 기가빗스위치들이 갖춰줘야 하며 ISP간의 연동망 및 백본망, 가정의 인터넷대역폭 등이 충분히 갖춰져야 하며-가정의 대역폭은 충분하다고 볼수 있겠군요- 멀티캐스팅 프로그램들이 어떤 문제를 야기시키지 않도록 잘 만들어져야만 한다는것이다-혹은 그런것을 처리해낼수 있는 라우터 내지는 스위치들이 갖춰진다면... 분명코 언젠가는 그런 환경이 될것이다... 대략 한 5년...정도 ? 사실, 월드컵 경기전에 국내의 유수 ISP 들이 모여 많은 회의를 하였었다. 월드컵 전 경기를 인터넷으로 멀티캐스팅 방송을 할것인가? 말것이가? 과연, 상업적 수익모델이 있나없나..결론은, 엄청난 돈을 들여서 국내의 모든 라우터를 멀티캐스팅이 가능한것으로-두루넷은 제가 알기로 원래부터 모든 라우터가 멀티캐스팅 가능했던걸로...- 교체한다 해봤자 그만한 수익도 없을것 같고 월드컵 이후에 그 장비들을 활용한 계속적인 컨텐츠가 없다란 결론에 도달하고 결국 포기했다. 아무리 꿈의 서비스라 할지라도 기업입장에서는 이윤을 창출 시켜야 하는데 아직은 시기상조 였던 것이다. 5.2 그럼 멀티캐스팅은 적어도 당분간 쓸모 없는 기술인가 ?그렇지는 않다. 일단 무선환경에서의 경우 멀티 캐스팅은 필수고(무선의 특성상 원래 멀티캐스팅이 가능한 브로드캐스팅이므로), 특정한 환경(학교/연구소/회사)등에서의 화상회의와 같은 경우에 유용하게 쓰일 수 있을 것이기 때문이다. 멀티캐스팅이 관심의 대상이 되는 주된이유는,, 인터넷의 수익모델중 가장 크게 기대되는것이 바로 멀티미디어이기때문이다.. 현재 가장 비싼 광고료가 책정되는곳이 어디인가. 바로 TV이다..그만큼 동영상매체가 주는 파급효과는 큰것이다. 인터넷광고는 노출빈도수대 호감도가 반비례한다는 연구결과도 있을정도로 관심잇는 분야가 아니면 전혀 관심을 끌지 못하는것이 현재의 배너광고이다. 때문에, 이메일광고 휴대폰광고, 팝업창, 초기화면 등 여러가지 수익모델을 창출해내기 위한 인터넷기업들의 노력이 거세지고 있는 판국이다... 이러한 시점에서 공중파같은 고해상도에 버퍼링없는 인터넷방송이 가능하다면, 그것은 제 2의 TV시대가 열리는것이라고 볼 수 있겠다.. 그리고 인터넷 멀티 캐스팅을 현재 인터넷 전체에 전격적으로 적용할 수 없지만 회사, 연구소, 학교등과 같은 영역에서는 충분히 멀티 캐스팅을 응용할 수 있다. 또한 다음장에 소개할 MBone와 같은 프로젝트를 이용하는등 기존에 구축되어 있는 인터넷 망을 활용하는 방법들도 존재한다. 5.2.1 MBone망멀티캐스팅 기술이 매우 훌륭한 기술이긴 하지만 현재 인터네트 환경에 적용하기에는 무리가 따른다. 그래서 생각한 것이 멀티캐스팅 전용망인 MBone망의 구축이다. MBone(IP Multicast Backbone on ther Internet)은 Multicast Backbone의 줄임말로 IP 멀티캐스트가 가능한 네트워크들을 상호연결한 광역 네트워크 망이다. 위에서 설명했다시피 인터넷의 모든 백본 라우터들이 IP 멀티캐스트를 지원하는게 아니므로 전체 네트워크 상에서 멀티캐스트를 지원하는건 당분간 힘든일다. MBone은 멀티캐스팅 기능을 지원하는 백본 라우터들만을 연결해서 광역 네트워크를 가로지르는 네트워크 터널을 만드는 프로젝트이다. 아래 그림은 MBone를 통해서 만들어지는 네트워크 터널에 대한 구조를 나타내고 있다. MBone은 인터넷을 가로지리는 가상 네트워크 계층(layer)이라고 볼수 있다. 네트워크 망에 대한 별도의 확장작업 없이 이미 존재하는 망을 활용할 수 있다는 점에서 (시간적으로나 비용적으로)매력적인 프로젝트이다. MBONE 위 그림처럼 MBone은 다른 인터넷망과는 분리된 별도의 터널을 가지게 되므로 멀티캐스트에 최적화된 패킷의 구성이 가능하다. 이들 멀티캐스트 IP패킷은 IP해더와는 다른 헤더를 가진다. 즉 출발지 목적지정보에 개별 호스트의 IP가 명시되는게 아니고 각 터널의 종점 IP주소가 명시된다. 이때 사용되는 라우팅 프로토콜로는 DVMRP와 MOSPF(Multicast Open Shortest Path First), PIM(Protocol Independent Multicast)등이 사용되고 있다. 현재는 MOSIPF와 PIM이 널리 사용되고 있다. 종점라우터에 도착된 데이터는 라우터가 관리하는 호스트중 데이터 요청을 원하는 호스트로 전송된다. 이때 IGMP가 핵심적인 프로토콜로 사용된다. 6 IPv6와 멀티 캐스팅연구에 참고할 문서
6.1 IPv6 멀티 캐스트 주소 영역IPv6 멀티캐스팅 주소는 RFC2373(IP Version 6 Addressing Architecture)에 정의되어 있다. 여기에는 멀티캐스트 주소를 위해서 고정영역(fixed scope)과 변경가능영역(variable)을 정의하고 있다. IPv6 멀티캐스트 주소는 주소영역의 상위 한바이트(octet)의 값을 이용해서 구분한다. 만약 상위 한바이트의 주소의 값을 0xFF(11111111)로 설정하는 걸로 멀티캐스트 주소임을 명시한다. 이외의 다른 값들은 유니캐스트 주소들을 위한 용도로 사용된다. IPv6의 경우 IPv6보다 할당된 주소영역이 매우 크므로 비교적 여유있게 자원을 사용할수 있고, 실제로 다양한 네트워크 환경의 지원이 가능하도록 주소영역들이 정의되어 있다. 다음은 현재 IPv6에서 지원되는 멀티캐스트 주소영역의 목록이다. Node-Local Scope FF01:0:0:0:0:0:0:1 All Nodes Address [RFC2373] FF01:0:0:0:0:0:0:2 All Routers Address [RFC2373] Link-Local Scope FF02:0:0:0:0:0:0:1 All Nodes Address [RFC2373] FF02:0:0:0:0:0:0:2 All Routers Address [RFC2373] FF02:0:0:0:0:0:0:3 Unassigned [JBP] FF02:0:0:0:0:0:0:4 DVMRP Routers [RFC1075,JBP] FF02:0:0:0:0:0:0:5 OSPFIGP [RFC2328,Moy] FF02:0:0:0:0:0:0:6 OSPFIGP Designated Routers [RFC2328,Moy] FF02:0:0:0:0:0:0:7 ST Routers [RFC1190,KS14] FF02:0:0:0:0:0:0:8 ST Hosts [RFC1190,KS14] FF02:0:0:0:0:0:0:9 RIP Routers [RFC2080] FF02:0:0:0:0:0:0:A EIGRP Routers [Farinacci] FF02:0:0:0:0:0:0:B Mobile-Agents [Bill Simpson] FF02:0:0:0:0:0:0:C SSDP [Kostic] FF02:0:0:0:0:0:0:D All PIM Routers [Farinacci] FF02:0:0:0:0:0:0:E RSVP-ENCAPSULATION [Braden] FF02:0:0:0:0:0:1:1 Link Name [Harrington] FF02:0:0:0:0:0:1:2 All-dhcp-agents [RFC3315] FF02:0:0:0:0:1:FFXX:XXXX Solicited-Node Address [RFC2373] site-Local Scope FF05:0:0:0:0:0:0:2 All Routers Address [RFC2373] FF05:0:0:0:0:0:1:3 All-dhcp-servers [RFC3315] FF05:0:0:0:0:0:1:4 Deprecated (2003-03-12) FF0X:0:0:0:0:0:1:1000 Service Location, Version 2 [RFC3111] -FF0X:0:0:0:0:0:1:13FF 또한 네트워크 환경 뿐만 아니라 서비스의 종류에 따라서 다양한 주소영역이 준비되어 있다. 이렇게 서비스종류에 따라서 주소영역이 세분화 되어 있으므로, 응용 애플리케이션의 개발이 쉬워지고 Qos보다 현실적으로 적용가능해 질 것이다. Variable Scope Multicast Address FF0X:0:0:0:0:0:0:0 Reserved Multicast Address [RFC2373] FF0X:0:0:0:0:0:0:C SSDP [Kostic] FF0X:0:0:0:0:0:0:100 VMTP Managers Group [RFC1045,DRC3] FF0X:0:0:0:0:0:0:101 Network Time Protocol (NTP) [RFC1119,DLM1] FF0X:0:0:0:0:0:0:102 SGI-Dogfight [AXC] FF0X:0:0:0:0:0:0:103 Rwhod [SXD] FF0X:0:0:0:0:0:0:104 VNP [DRC3] FF0X:0:0:0:0:0:0:105 Artificial Horizons - Aviator [BXF] FF0X:0:0:0:0:0:0:106 NSS - Name Service Server [BXS2] FF0X:0:0:0:0:0:0:107 AUDIONEWS - Audio News Multicast [MXF2] FF0X:0:0:0:0:0:0:108 SUN NIS+ Information Service [CXM3] FF0X:0:0:0:0:0:0:109 MTP Multicast Transport Protocol [SXA] FF0X:0:0:0:0:0:0:10A IETF-1-LOW-AUDIO [SC3] FF0X:0:0:0:0:0:0:10B IETF-1-AUDIO [SC3] FF0X:0:0:0:0:0:0:10C IETF-1-VIDEO [SC3] FF0X:0:0:0:0:0:0:10D IETF-2-LOW-AUDIO [SC3] FF0X:0:0:0:0:0:0:10E IETF-2-AUDIO [SC3] FF0X:0:0:0:0:0:0:10F IETF-2-VIDEO [SC3] FF0X:0:0:0:0:0:0:110 MUSIC-SERVICE [Guido van Rossum] FF0X:0:0:0:0:0:0:111 SEANET-TELEMETRY [Andrew Maffei] FF0X:0:0:0:0:0:0:112 SEANET-IMAGE [Andrew Maffei] FF0X:0:0:0:0:0:0:113 MLOADD [Braden] FF0X:0:0:0:0:0:0:114 any private experiment [JBP] FF0X:0:0:0:0:0:0:115 DVMRP on MOSPF [Moy] FF0X:0:0:0:0:0:0:116 SVRLOC [Guttman] FF0X:0:0:0:0:0:0:117 XINGTV <hgxing@aol.com> FF0X:0:0:0:0:0:0:118 microsoft-ds <arnoldm@microsoft.com> FF0X:0:0:0:0:0:0:119 nbc-pro <bloomer@birch.crd.ge.com> FF0X:0:0:0:0:0:0:11A nbc-pfn <bloomer@birch.crd.ge.com> FF0X:0:0:0:0:0:0:11B lmsc-calren-1 [Uang] FF0X:0:0:0:0:0:0:11C lmsc-calren-2 [Uang] FF0X:0:0:0:0:0:0:11D lmsc-calren-3 [Uang] FF0X:0:0:0:0:0:0:11E lmsc-calren-4 [Uang] FF0X:0:0:0:0:0:0:11F ampr-info [Janssen] FF0X:0:0:0:0:0:0:120 mtrace [Casner] FF0X:0:0:0:0:0:0:121 RSVP-encap-1 [Braden] FF0X:0:0:0:0:0:0:122 RSVP-encap-2 [Braden] FF0X:0:0:0:0:0:0:123 SVRLOC-DA [Guttman] FF0X:0:0:0:0:0:0:124 rln-server [Kean] FF0X:0:0:0:0:0:0:125 proshare-mc [Lewis] FF0X:0:0:0:0:0:0:126 dantz [Yackle] FF0X:0:0:0:0:0:0:127 cisco-rp-announce [Farinacci] FF0X:0:0:0:0:0:0:128 cisco-rp-discovery [Farinacci] FF0X:0:0:0:0:0:0:129 gatekeeper [Toga] FF0X:0:0:0:0:0:0:12A iberiagames [Marocho] FF0X:0:0:0:0:0:0:12B X Display [McKernan] FF0X:0:0:0:0:0:0:201 "rwho" Group (BSD) (unofficial) [JBP] FF0X:0:0:0:0:0:0:202 SUN RPC PMAPPROC_CALLIT [BXE1] FF0X:0:0:0:0:0:0:300 Mbus/Ipv6 [RFC3259] FF0X:0:0:0:0:0:2:0000 -FF0X:0:0:0:0:0:2:7FFD Multimedia Conference Calls [SC3] FF0X:0:0:0:0:0:2:7FFE SAPv1 Announcements [SC3] FF0X:0:0:0:0:0:2:7FFF SAPv0 Announcements (deprecated) [SC3] FF0X:0:0:0:0:0:2:8000 -FF0X:0:0:0:0:0:2:FFFF SAP Dynamic Assignments [SC3]멀티캐스팅의 특성에 맞게 멀티미디어와 관려된 많은 서비스들이 존재하고 있음을 알 수 있다. 멀티미디어 서비스 외에도 NIS, NTP, NSS와 같이 동일한 정보를 여러개의 서버로 배포하는 인터넷 서비스를 위한 주소영역도 예약되어 있음을 확인할 수 있다. X Display를 위한 서비스가 있는게 개인적으로 유독 눈에 띈다. 6.2 멀티 캐스트 응용 프로그램 제작7 정리8 관련 자료들8.1 데이터 링크
8.2 참고 문서자료 |
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/MultiCast
[링크] : http://www.8051.co.kr/html/download/COMPILER_PDS/data/combo_keil.pdf
1. 뭐하는 프로그램인가?
: C 언어를 HEXA 파일로 만들어 준다. 이렇게 만들어진 HEXA 파일은 롬으로 구워진다.
2. 사용법
1) Keil uVision 실행
2) 새로운 프로젝트를 만든다.
3) 사용할 프로세서를 선택한다. (주의 : 이때 롬의 명칭이 아니라 메인 프로세서의 명칭을 선택해야 한다. 본인은 80C51BH 를 사용하였다.)
5) C 파일 만들기
이제 생성된 HEXA 파일을 들고 롬라이트에 구우러 가면 된다.
롬라이트에 굽는 법은 시간나면 만들어 볼까 한다~ 그럼 즐공~.
http://blog.naver.com/caliofe/20007308844
![[http]](http://www.joinc.co.kr/modules/moniwiki/imgs/http.png)