2011/12/29 00:26
안녕하세요?
 
밑에분이 폴더풀림없는 동기화방법을 적어주셔서 저도 알고있는 방법이 하나 있어 소개해드리고자 합니다.
 
저도 예전엔 3초내에 USB를 뽑는 방법을 사용해 여러번 해보았는데.. 아무래도 불안한게 사실이라 과연 괜찮을까 하던중
 
알게된 방법이 있습니다.
 
1. 먼저 잘 아이폰으로 부터 구입항목전송을 하셔야 합니다. 꼭 하셔야 하며 만약 정상적으로 응용프로그램이 복사되지 않을 경우 아이폰에 앱들이 모두 삭제될 수 있습니다.
(만약 스토어 인증이 되어 있지 않다면 스토어 인증부터 먼저 해주셔야 구입항목전송이 가능합니다.)
 
 
 
 
2. 그 후 아이폰에 응용프로그램 탭을 클릭하시고 '응용 프로그램 동기화' 에 체크 해주세요.
그럼 저렇게 경고창이 뜰텐데요. '응용 프로그램 동기화' 눌러주시면 됩니다.
 
 
 
 
3. 2번 과정 후 하단에 '적용' 버튼이나 '동기화' 버튼은 절대 누르지 마시고 Command+Q 나 상단 메뉴바에 iTunes 에서 'iTunes 종료' 를 해주세요.
그럼 아래 스샷처럼 나올텐데 적용 버튼 눌러주시면 끝입니다.
그 후 다시 아이튠즈 실행 후 동기화 하셔도 폴더풀림없이 잘 유지되는 모습을 볼 수 있으실 거에요 ^^
 
 

원본 http://cafe.naver.com/inmacbook/483909
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
2010/06/04 19:12

(주소는 개인정보 보호상 가림처리..)


드디어 기다리던 맥미니가 왔습니다.

머리털나고 처음으로
(..는 아니구나..) 암튼 흔히 없는 해외 배송 포장기념으로 포장도 조심스럽게..흐흐..





구성품은 보는바와 같이 본체, 전원아답터, minidvi-dvi젠더, 메뉴얼, mac os x, 맥용 소프트웨어가 들어있어요



이게 그 문제의 본체입니다.
오.. 완전 작음..
하얀 하이그로시(?)재질에 회색 애플로고가 그려져있습니다.



 

왼쪽사진에 길게 있는 홈은 CD 삽입구입니다.
보시다 시피 eject버튼이 없어서 시디를 꺼내려면 소프트웨어적으로 꺼내야 합니다.
혹시나 문제가 있어 CD를 빼야 할땐 부팅시 마우스 아무버튼이나 꾸욱 누르고 있으면 시디를 뱉어냅니다.

오른쪽 사진을 보면 전원아답터, RJ45, 디스플레이, MINI-DVI, 뭔지 모를 뭐시기.., USB 2.0 (위에서 아래순..)
컨넥터가 있고, 전원버튼, 방열환기구, Lock용 홀, 이어폰, 마이크 단자가 있습니다.
내부 스피커가 있어 굳이 이어폰단자에 스피커를 연결하지 않아도 됩니다.

아쉬운점이 있다면 전원과 MINI-DVI단자에
일반PC처럼 나사를 조이는 방식이 아니라 본체를 움직이거나 주위선정리를 하다가
선이 쑥빠지는 사고를 당할수 있어 조심해야 합니다.

아마도 디자인을 위해서라면 기능성을 과감하게 버리는 스티븐 형님의 개똥 철학이
적용된듯합니다.

제품 하단에는 미끄럼 방지를 위해 실리콘재질로 처리 되어있습니다.


이상 미니맥 개봉기였습니다.
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
2008/11/06 10:51

GCC Error (Warning) Message List

Copyright © 1999 Seong-Kook Cin

Seong-Kook Cin
Jang-Chon Dong 21-2
Sun-Chon City 540-190
South KOREA

Before reading this

[USE GNU]이 문서는 GCC Version 2.7.2를 기준으로 하여 이 컴파일러가 출력하는 에러 [error]와 경고 [warning] 메시지를 한국어로 번역하고, 그 메시지를 발생할 수 있는 간단한 예제를 보이며, 간단한 해결책을 제시합니다.

이 문서는 C 배우미들이 낯선 컴파일러 메시지를 만났을 때 당황하지 않고 쉽게 문제를 해결할 수 있기를 바라는 뜻에서 만들어진 것입니다.

이 문서는 유용하게 쓰여지기를 바라면서 만들어졌지만 저자는 이 문서에 대해 어떠한 보증도 하지 않습니다. 즉, 이 문서에 의해 일어날 수 있는 손해에 대해서는 책임을 지지 않습니다.

이 문서는 GCC가 발생할 수 있는 에러 메시지를 모두 포함하지 않을 수도 있습니다. 여러분이 이 문서에 없는 에러 메시지를 발견해서, 이 문서에 추가하기를 원하거나, 이 문서에 틀린 곳을 수정하기를 원한다면 cinsk@acm.org 으로 e-mail을 보내시기 바랍니다. 어떠한 제안이나 비판도 환영합니다. 저자는 여러분들의 참여로 이 문서가 보다 완전해지기를 원합니다.


Conventions

영어를 한국어로 쓸 때, 한국어를 영어로 표기할 때 혼동을 가져올 수 있는 용어나 기타 부가적인 설명은 그 용어 뒤의 `[]'안에 옵니다. 문서의 형식은 다음과 같습니다.

에러 메시지

에러 메시지 설명......................

이 에러 메시지를 발생시키는 예제

파일:줄 번호: 실제 컴파일러가 발생하는 에러 메시지

Table of Contents

Errors

Warnings


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 

enum A { AA = INT_MAX + 1 };

file:3: warning: integer overflow in expression

#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

크리에이티브 커먼즈 라이선스
Creative Commons License
2008/10/21 16:23

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

2008/05/15 10:29

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
크리에이티브 커먼즈 라이선스
Creative Commons License
2008/05/08 23:15

윈도우즈의 버전을 업데이트 하는 것과 마찬가지로 리눅스도 커널컴파일을 통해 보다 높은 버전의 커널을 설치할 수 있다.

커널을 다운로드 받는 사이트로는 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
크리에이티브 커먼즈 라이선스
Creative Commons License
2008/02/19 08:56
사용자 삽입 이미지
크리에이티브 커먼즈 라이선스
Creative Commons License
2008/01/17 00:25

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

2007/08/22 19:30

Contents

1 교정과정
2 소개
3 캐스팅 개론
3.1 유니 캐스팅
3.2 브로드 캐스팅
3.3 멀티 캐스팅
4 멀티캐스팅
4.1 인터넷(IP) 프로토콜차원에서 본 멀티 캐스팅
4.2 IGMP 프로토콜을 이용한 멀티캐스팅 데이터 수신
5 인터넷(IP)환경에서의 멀티 캐스팅
5.1 인터넷에서의 멀티 캐스팅기술 적용의 어려움
5.2 그럼 멀티캐스팅은 적어도 당분간 쓸모 없는 기술인가 ?
5.2.1 MBone망
6 IPv6와 멀티 캐스팅
6.1 IPv6 멀티 캐스트 주소 영역
6.2 멀티 캐스트 응용 프로그램 제작
7 정리
8 관련 자료들
8.1 데이터 링크
8.2 참고 문서자료

1 교정과정

  1. 2003/12/10 : multicast 주소영역 관련 내용 추가 - yundream

2 소개

인터네트 환경이 눈부시게 발전했지만 인터네트를 가로지르는 데이터양은 이에 초과해서 늘어나고 있다. 요즘 대두되고 있는 원격 회상 회의, 원격 교육, 인터넷 대화형 TV등의 서비스는 엄청난 양의 데이터 교환이 필요하며, 인터네트 망의 한계 때문에 특별한 경우를 제외하고 원할한 서비스가 사실상 불가능하다. 혹은 서비스질이 크게 떨어지거나 상당한 비용을 지불해야 한다.


단순하게 생각하면 돈을 투자해서 네트워크 망 환경을 크게 개선시키면 되긴 하겠지만 엄청난 비용과 시간이 필요한 작업이다. 그렇다면 이러한 망 환경의 개선과 더불어 소프트웨어적인 다른 방법을 동원해서 문제를 해결하는게 더 좋은 방법일 것이다. 이번에는 소프트웨어적인 문제 해결방법중 하나인 멀티캐스팅에 대해서 알아보도록 하겠다.

3 캐스팅 개론

캐스팅은 "던진다"라는 뜻을 가진다. 대표적인 던지기 스포츠인 야구만 봐도 "커브", "직구", "포크", "스크루", "씽커", "캣패스트", "체인지업", "아리랑볼?", "88 마구?"등 참 다양하기도 하다.

물론 우리는 공 던지는 법을 다루지는 않을 것이다. 우리가 다루는 내용은 인터네트 상에서 데이터를 던지는(캐스팅)방법을 다룰 것이다. 여러가지 캐스팅 방법중 멀티캐스팅에 대해서 다룰 것이며 이해를 돕기 위해서 중요한 다른 캐스팅 방법에 대해서도 간단히 알아 볼 것이다.

캐스팅에는 크게 3가지 기법이 있다.

캐스팅 종류



3.1 유니 캐스팅

WAN과 LAN상에서 이루어지는 가장 일반적인 방식으로 서버와 클라이언트가 1대 1로 연결되고 데이터를 주고 받는다. 만약 하나의 서버에 100개의 클라이언트가 연결한다면 100개의 연결이 만들어 지고 서버는 동일한 데이터를 100개 복사해서 각각의 클라이언트에게 전송하게 될 것이다. 이 방식은 구현이 간단하고 웹과 같은 연결별 다른 데이터를 보내야 하는 분야에서는 쓸만하지만 동일한 데이터를 다수의 유저에게 전달시켜야 하는 실시간 멀티미디어 서비스에는 그리 적합하지 않다. -대량의 동일한 데이터가 유저 수만큼 복사되기 때문이다.-

소켓을 통한 일반적은 네트워크 프로그래밍은 유니캐스트 방식이다.

3.2 브로드 캐스팅

브로드캐스팅(boradcasting)는 보내고자 하는 정보를 모든 수신자에게 보내는 방식으로, 서브네트워크에서 하나의 호스트가 데이터를 보내면 서브네트워크의 모든 호스트로 데이터가 전송된다. 데이터를 받을지 아니면 무시할지는 순전히 받는 측에서 결정하게 된다.

브로드 캐스팅은 주로 서브 네트워크 환경에서 주변의 호스트 정보를 알아오기 위한 데이터 교환용으로 널리 사용된다. 가장 대표적인 브로드 캐스팅 데이터는 arp데이터가 될것이다. 스위칭 라우터를 예로 들어서 생각해보도록 하자. 스위칭 라우터는 외부에서 들어온 데이터를 서브네트워크의 적당한 호스트로 보내야 할것이다. 이러한 작업을 위해서 보통 IP를 사용하는데, IP는 논리적인 값으로써 변경될 수 있는 값이므로 IP만 가지고 원하는 호스트와 통신하는건 적절하지 못하다. 이러한 문제를 해결하기 위해서 이더넷카드의 물리적인 번호와 IP번호를 맵핑시키는 방법을 사용하게 된다.

이더넷카드는 전 세계에서 유일한 48bit의 고유번호를 가지고 있으며 이 정보와 IP주소를 맵핑 시킴으로써 주변의 호스트 정보를 알 수 있게 된다. 라우터는 처음 부팅시 주변 호스트의 물리적 주소와 IP주소를 알아내야 하는데 이때 사용되는 프로토콜이 arp이며, 모든 주변 호스트에 대한 정보를 알아야 되므로 arp 요청을 브로드 캐스팅 하게 된다.

이는 라우터에만 적용되는게 아닌 서브네트워크의 단일 호스트에도 적용된다. 호스트가 새로 부팅 되었을 경우 이 호스트는 주변 호스트에 대한 아무런 정보도 가지고 있지 않는다. 이 호스트의 주소가 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)로 나뉘어서 관리되고 있다는 것을 알고 있다. [http]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 헤더의 구조


요청 타입 설명
Type 설명
1 Create Group Request
2 Create Group Reply
3 Join Group Request
4 Join Group Reply
5 Leave Group Request
6 Leave Group Reply
7 Confirm Group Request
8 Confirm Group Reply

Create Group Request를 이용하면 멀티캐스팅 그룹생성을 요청할수 있는데, 그룹을 생성시킬 때 Code값을 명시함으로써 Public 혹은 Private로 그룹의 성격을 결정할 수 있다.

Cope 설명
Code 설명
0 Public
1 Private

호스트가 Create Group Request를 이용해서 그룹의 생성을 요청하면 요청을 받은 호스트나 라우터는 다음과 같은 응답을 보내게 된다.

응답의 종류
Code 설명
0 Request Granted
1 Request denied, no resources
2 Request denied, invalid code
3 Request denied, invalid group address
4 Request denied, invalid access key
5 - 255 Request pending

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와 멀티 캐스팅


연구에 참고할 문서
[http]INTERNET PROTOCOL VERSION 6 MULTICAST ADDRESS

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 데이터 링크

[http]IP 멀티 캐스팅
[http]KRNET'98 특강
Multicast 예제
[http]Multicasting in the Internet
[http]MBone란
[http://my.netian.com/~vs909/i/igmp.htm 인터네트 그룹 다중전송 규약(IGMP) 표준
[http]IGMP V1.0 RFC 988

8.2 참고 문서자료

File name Size(byte) Date
  ..   2007-08-21
2003multcast.pdf 3344911 2006-04-27
multi_ack.pdf 459978 2006-04-27
Total 2 files

원본 http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/MultiCast
크리에이티브 커먼즈 라이선스
Creative Commons License
2007/05/21 13:54

[링크] : http://www.8051.co.kr/html/download/COMPILER_PDS/data/combo_keil.pdf

1. 뭐하는 프로그램인가?

   : C 언어를 HEXA 파일로 만들어 준다. 이렇게 만들어진 HEXA 파일은 롬으로 구워진다.


2. 사용법

   1) Keil uVision 실행



   2) 새로운 프로젝트를 만든다.

 

  


   3) 사용할 프로세서를 선택한다. (주의 : 이때 롬의 명칭이 아니라 메인 프로세서의 명칭을 선택해야 한다. 본인은 80C51BH 를 사용하였다.)



 
   4) 옵션 수정
 

 
프로세서의 클럭 및 OUTPUT 수정
 
 

 

   5) C 파일 만들기


간단한 프로그램을 입력하고 컴파일하여 HEXA 파일을 만든다.
 

이제 생성된 HEXA 파일을 들고 롬라이트에 구우러 가면 된다.

롬라이트에 굽는 법은 시간나면 만들어 볼까 한다~  그럼 즐공~.


출처 http://blog.naver.com/caliofe/20007308844
크리에이티브 커먼즈 라이선스
Creative Commons License
1 2 3 4 5 ... 9