태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

롸이언의 인생이야기 @ Innovate yourself ™


RGB to YUV 색공간 변경 색보정

2008/12/19 18:21

복사 http://blog.naver.com/laizenti/40058994588

RGB에서 YUV로, YUV에서 RGB로 변환할 때 어떤 문제가 발생하는지 수식화 해봤습니다.

변환 공식은 아래 공식을 이용했고(ITU-R BT.601), 8bit 색 깊이로 계산하였습니다.

RGB to YUV Conversion
Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
U(Cb) = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128
V(Cr)  =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128

 

YUV to RGB Conversion
R = 1.164(Y - 16) + 1.596(V - 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
B = 1.164(Y - 16) + 2.018(U - 128)

 

표1> 이론상 가장 이상적인 색 변환표입니다. RGB - YUV - RGB 변환이 완벽하게 이루어집니다.

 

 

R

G

B

 

Y

U

V

 

R

G

B

Black

0

0

0

 

16

128

128

 

0

0

0

White

255

255

255

 

235

128

128

 

255

255

255

Yellow

255

255

0

 

210

16

146

 

255

255

0

Cyan

0

255

255

 

170

166

16

 

0

255

255

Green

0

255

0

 

145

54

34

 

0

255

0

Magenta

255

0

255

 

107

202

222

 

255

0

255

Red

255

0

0

 

82

90

240

 

255

0

0

Blue

0

0

255

41

240

110

 

0

0

255

 

 

표2> 위의 이상적인 변환 표를 만들기 위해서는 아래와 같이 소숫점에 대한 정보를 계속 가지고 있어야 합니다.

 

 

R

G

B

 

Y

U

V

 

R

G

B

Black

0

0

0

 

16

128

128

 

0

0

0

White

255

255

255

 

235.045

128

128

 

254.968

254.968

254.968

Yellow

255

255

0

 

210.055

16.055

146.105

 

254.776

254.931

-0.025

Cyan

0

255

255

 

169.51

165.74

16.055

 

0.02142

254.941

254.845

Green

0

255

0

 

144.52

53.795

34.16

 

-0.1714

254.903

-0.1484

Magenta

255

0

255

 

106.525

202.21

221.84

 

255.14

0.06502

255.117

Red

255

0

0

 

81.535

90.26

239.945

 

254.947

0.0278

0.12342

Blue

0

0

255

 

40.99

239.95

109.895

 

0.19278

0.03723

254.993

 

 

표3> 다음 예는, 소숫점을 반올림 처리하고 그 결과로 다시 변환한 표입니다. 최종 RGB로 변환한 결과에서 +1씩 오차값이 발생합니다.

 

R

G

B

 

Y

U

V

 

R

G

B

Black

0

0

0

 

16

128

128

 

0

0

0

White

255

255

255

 

235

128

128

 

255

255

255

Yellow

255

255

0

 

210

16

146

 

255

255

0

Cyan

0

255

255

 

170

166

16

 

1

255

256

Green

0

255

0

 

145

54

34

 

0

256

1

Magenta

255

0

255

 

107

202

222

 

256

1

255

Red

255

0

0

 

82

90

240

 

256

1

0

Blue

0

0

255

 

41

240

110

 

0

0

255

 

 

표4> 아래 예는, 소숫점 없이 YUV에서 RGB로 변환하고, 다시 YUV로 변환한 결과입니다.

이것은 통상 캠코더(YUV)에서 NLE(RGB)를 거처 최종 동영상 파일을 인코딩(YUV) 했을때를 가상해본 시나리오입니다.

Magenta 변환시 최종 YUV에서 오차가 발생합니다.

 

Y

U

V

 

R

G

B

 

Y

U

V

Black

16

128

128

 

0

0

0

 

16

128

128

White

235

128

128

 

255

255

255

 

235

128

128

Yellow

210

16

146

 

255

255

0

 

210

16

146

Cyan

170

166

16

 

1

255

255

 

170

166

16

Green

145

54

34

 

0

255

1

 

145

54

34

Magenta

107

202

222

 

255

1

255

 

107

202

221

Red

82

90

240

 

255

1

0

 

82

90

240

Blue

41

240

110

 

0

0

255

 

41

240

110

 

 

결론

캠코더는 CCD/COMS에서 빛을 받아 전기적 신호로 변환할 때는 RGB 신호를 사용합니다. 쉬운 예로 3CCD 캠코더는 프리즘을 통해 RGB 3개의 CCD에 각각 신호를 분리해서 받습니다. 이 신호는 채널당 10~14bit 까지 처리합니다. 이후 DSP를 통해 감마와 화이트발란스 등을 잡고, 최종 테잎이나 메모리에 저장할 때는 YUV 신호로 저장합니다. 이렇게 저장할 때까지만 해도 색공간의 오차는 거의(?) 발생하지 않는다고 볼 수도 있습니다. 그러나, 이렇게 캠코더에서 저장된 YUV 동영상 파일(대부분의 동영상 파일들이 YUV를 사용하고 있음)을 YUV 색공간을 사용하는 편집 프로그램이 아닌, RGB 색공간을 사용하는 편집 프로그램 (예로, 애프터이팩트, 컴버스쳔 등)으로 작업하여 다시 YUV 코덱으로 저장하게 되면 바로 위와 같은 문제가 발생할 가능성이 있다는 것입니다.

 

이 쯤에서 고민해봐야 할 것은 RGB 색공간을 사용하는 NLE에서 색공간을 변환시킬 때, 소숫점 정보를 끝까지 가지고 가는지, 아니면 변환 후 버리게 되는지가 관건이 될겁니다. 소숫점 정보를 끝까지 가지고 간다면 맨 처음 보였던 표1과 같은 이상적인 화면을 얻을 수도 있을 겁니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2009/10/16 09:55

출처 : FALINUX  wav 파일로 녹음하기
장길석

이제 사운드 카드로 소리를 담아 내는 방법을 알게 되었으니 파일로 저장하는 방법에 대해 알아 보겠습니다. 가장 흔히 사용하는 wav 파일 형식을 이용하겠습니다. 사실 이 방법도 문서를 통하여 학습하기 보다는 Warren W. Gay라는 분이 만든 http://www.hitsquad.com/smm/programs/WavPlay/의 WavPlay 1.0을 분석하여 알게되었습니다.

그러다 보니 역시 부족한 부분과 잘못된 부분이 있을 것으로 생각됩니다. 혹 틀린 부분이나 부족한 부분이 있더라도 양해를 부탁드리며 그냥 지나치지 마시고 지적해주시고 알려 주시면 감사하겠습니다.

Wave 파일로 저장하기 위해 다시 한번 Wave 파일의 포맷을 보시겠습니다.

필드 이름 필드 값 크기 (bytes)
Chunk ID 'RIFF' 4
Chunk size   4
Format 'WAVE' 4
SubChunk 1 ID 'fmt ' 4
SubChunk 1 Size   4
Audio Format 1 2
Num Channels   2
Sample Rate   4
Byte Rate   4
Block Align   2
Bits Per Sample   2
SubChunk 2 ID 'data' 4
SubChunk 2 Size   4
data   SubChunk 2 Size

이전 Wave 파일을 출력할 때에는 분홍색 부분만 스트럭쳐를 구성해서 헤더 부분을 읽어 내었는데요, 저장하기 위해서는 모든 내용을 스트럭쳐로 구성하겠습니다. 역시 이부분은 http://www.hitsquad.com/smm/programs/WavPlay/에 올려진 WavPlay 1.0 의 소스 부분에서 이름만 조금 수정했습니다.

typedef  struct
{
   char     RiffID [4] ;
   u_long   RiffSize ;
   char     WaveID [4] ;
   char     FmtID  [4] ;
   u_long   FmtSize ;
   u_short  wFormatTag ;
   u_short  nChannels ;
   u_long   nSamplesPerSec ;
   u_long   nAvgBytesPerSec ;
   u_short  nBlockAlign ;
   u_short  wBitsPerSample ;
   char     DataID [4] ;
   u_long   nDataBytes ;
} wave_header_t;

static  wave_header_t  wave_header =
{  { 'R', 'I', 'F', 'F' },
      0,
   { 'W', 'A', 'V', 'E' },
   { 'f', 'm', 't', ' ' },
      16,
      PCM_WAVE_FORMAT,
      0,
      0,
      0,
      0,
      0,
   { 'd', 'a', 't', 'a' },
      0
};

어차피 Wave 파일을 저장할 것이므로 Wave를 위한 초기값을 지정했습니다.

Wave 파일로 저장하기 위해서는 Wave 파일을 어떻게 만들었는지 wav의 속성을 담은 헤더 부분을 먼저 저장해야 겠습니다. 그래서 녹음 을 스테레오로 녹음했는지 모노로 녹음했는지에 대한 정보나 비트 레이트, 샘플링 비트 수 같은 정보를 담아서 헤더 정보로 먼저 저장합니다.

당연히 헤더 정보는 미리 사운드카드에 설정한 값이 되겠지요. 예제에서도 먼저 마이크로 녹음하는 방법을 모노에, 8000hz, 16비트 녹음으로 설정했습니다.

   soundcard_set_stereo( 0);
   soundcard_set_data_bit_size( 16);
   soundcard_set_bit_rate( 8000);

그러므로 이와 같이 wave 파일의 헤더 정보를 저장합니다.

soundcard_write_wav_header( fd_wavfile, 1, 8000, 16, 10 * 8000);

인수로 10 * 8000한 이유는 10초간의 녹음 파일임을 말합니다. 이제 sound_write_wav_header() 함수의 내용을 보겠습니다.

int  soundcard_write_wav_header( int _fd, int _channels, u_long _samplerate, int _sampbits, u_long _samples)
{  u_long      databytes ;
   u_short     blockalign ;

   if ( _fd < 0 )
      printx( "bad file descriptor?");

   _sampbits   = (_sampbits == 16) ? 16 : 8 ;
   blockalign  = ( (_sampbits == 16) ? 2 : 1) * _channels ;
   databytes   = _samples * (u_long) blockalign ;

   wave_header.RiffSize        = sizeof ( wave_header_t) + databytes - 8 ;
   wave_header.wFormatTag      = PCM_WAVE_FORMAT ;
   wave_header.nChannels       = _channels ;
   wave_header.nSamplesPerSec  = _samplerate ;
   wave_header.nAvgBytesPerSec = _samplerate * (u_long) blockalign ;
   wave_header.nBlockAlign     = blockalign ;
   wave_header.wBitsPerSample  = _sampbits ;
   wave_header.nDataBytes      = databytes;

   if (  sizeof ( wave_header_t) != write (_fd, &wave_header, sizeof ( wave_header_t)))
      printx( "write header errror");

   return 0 ;
};

대부분이 wave 파일의 헤더에 맞추어 스트럭쳐의 내용을 구성하고 스트럭쳐를 그대로 파일에 저장했습니다. 주의해서 보실 것은 인수로 받은 _samples는 녹음 시간(초)* 샘플링 비트 레이트로서 Hz 값입니다. 헤더 정보에는 사운드 부분의 바이트 개수가 들어 가기 때문에 _samples에 스테레오면 2배를 모노이면 _samples 값으로 사운드 데이터 부분의 바이크 개수를 계산하고 헤더에 저장합니다.

int  soundcard_write_wav_header( int _fd, int _channels, u_long _samplerate, int _sampbits, u_long _samples)
{
   _sampbits   = (_sampbits == 16) ? 16 : 8 ;
   blockalign  = ( (_sampbits == 16) ? 2 : 1) * _channels ;
   databytes   = _samples * (u_long) blockalign ;

                    :
					
   wave_header.nDataBytes      = databytes;

   if (  sizeof ( wave_header_t) != write (_fd, &wave_header, sizeof ( wave_header_t)))
                     :
};

헤더를 저장했으므로 이전 방법에 따라 마이크로 부터 사운드 값을 입력받아 그대로 파일로 저장하면 됩니다.

   soundcard_write_wav_header( fd_wavfile, 1, 8000, 16, 10 * 8000);

   while( TRUE)
   {
                :
      read_size   = read( fd_soundcard, sound_buff, sound_buff_size);
      write( fd_wavfile, sound_buff, read_size);
                :
   }

전체 소스를 올립니다. 컴파일하신 후에 실행하시면 test.wav 파일이 생성됩니다. 생성된 파일을 이전 시간의 wav_player 프로그램으로 재생해 보십시오. 예제라서 10초간 녹음하는 부분을 단순하게 처리했습니다. 이점 양해를 부탁드립니다. ^^

// 이 소스는 http://www.hitsquad.com/smm/programs/WavPlay/ 에서 구한
// WavPlay 1.0 by Warren W. Gay VE3WWG 의 소스를 참고하여 작성되었습니다.

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>
#include <sys/ioctl.h>
#include <linux/soundcard.h>

#define  SCERR_NO_PROC_DEVICE                      -1    // /proc/device 가 존재하지 않는다.
#define  SCERR_DRIVER_NO_FIND                      -2    // /proc/device 에서 드라이버를 찾지 못함
#define  SCERR_NO_SOUNDCARD                        -3    // 사운드 카드가 없음
#define  SCERR_NO_MIXER                            -4    // 믹서가 없음
#define  SCERR_OPEN_SOUNDCARD                      -5    // 사운드 카드를 여는데 실패 했다.
#define  SCERR_OPEN_MIXER                          -6    // 사운드 카드를 여는데 실패 했다.
#define  SCERR_PRIVILEGE_SOUNDCARD                 -7    // 사운드 카드를 사용할 권한이 없음
#define  SCERR_PRIVILEGE_MIXER                     -8    // 미서를 사용할 권한이 없음

#define  SCERR_NO_FILE                             -10   // 파일이 없음
#define  SCERR_NOT_OPEN                            -11   // 파일이 열 수 없
#define  SCERR_NOT_WAV_FILE                        -12   // WAV 파일이 아님
#define  SCERR_NO_WAV_FORMAT                       -13   // WAV 포맷 정보가 없음

#define  TRUE                 1
#define  DSP_DEVICE_NAME      "/dev/dsp"
#define  MIXER_DEVICE_NAME    "/dev/mixer"
#define  PCM_WAVE_FORMAT      1


typedef  struct
{
   char     RiffID [4] ;
   u_long   RiffSize ;
   char     WaveID [4] ;
   char     FmtID  [4] ;
   u_long   FmtSize ;
   u_short  wFormatTag ;
   u_short  nChannels ;
   u_long   nSamplesPerSec ;
   u_long   nAvgBytesPerSec ;
   u_short  nBlockAlign ;
   u_short  wBitsPerSample ;
   char     DataID [4] ;
   u_long   nDataBytes ;
} wave_header_t;

static  wave_header_t  wave_header =
{  { 'R', 'I', 'F', 'F' },
      0,
   { 'W', 'A', 'V', 'E' },
   { 'f', 'm', 't', ' ' },
      16,
      PCM_WAVE_FORMAT,
      0,
      0,
      0,
      0,
      0,
   { 'd', 'a', 't', 'a' },
      0
};

static int            fd_soundcard     = -1;
static int            fd_mixer         = -1;       // volume 제어용 파일 디스크립터

//------------------------------------------------------------------------------
// 설명 : 메시지를 출력하고 프로그램 종료
// 인수 : format     : 출력할 문자열 형식 예) "%s%d"
//        ...        : 형식에 필요한 인수
//------------------------------------------------------------------------------
void  printx( const char *_format, ...)
{
   char     *bar  = "---------------------------------------------------------";
   va_list   parg;
   int       count;

   printf( "%s:ERRORn", bar);

   va_start( parg,_format);
   count = vprintf(_format, parg);
   va_end( parg);

   printf( "n%sn", bar);
   exit( -1);
}

//------------------------------------------------------------------------------
// 설명 : 파일에 Wave 파이의 헤더를 출력
// 인수 : _fd        : Wave 파일의 디스크립터
//        _channels  : 1 = 모노
//                     2 = 스테레오
//        _samplerate: 비트 레이트
//        _sampbits  : 16 또는 8
//        _samples   : 녹음 tlrks(초) * _samplerate
//        ...        : 형식에 필요한 인수
//------------------------------------------------------------------------------
int  soundcard_write_wav_header( int _fd, int _channels, u_long _samplerate, int _sampbits, u_long _samples)
{  u_long      databytes ;
   u_short     blockalign ;

   if ( _fd < 0 )
      printx( "bad file descriptor?");

   _sampbits   = (_sampbits == 16) ? 16 : 8 ;
   blockalign  = ( (_sampbits == 16) ? 2 : 1) * _channels ;
   databytes   = _samples * (u_long) blockalign ;

   wave_header.RiffSize          = sizeof ( wave_header_t) + databytes - 8 ;
   wave_header.wFormatTag      = PCM_WAVE_FORMAT ;
   wave_header.nChannels       = _channels ;
   wave_header.nSamplesPerSec  = _samplerate ;
   wave_header.nAvgBytesPerSec = _samplerate * (u_long) blockalign ;
   wave_header.nBlockAlign     = blockalign ;
   wave_header.wBitsPerSample  = _sampbits ;
   wave_header.nDataBytes      = databytes;

   if (  sizeof ( wave_header_t) != write (_fd, &wave_header, sizeof ( wave_header_t)))
      printx( "write header errror");

   return 0 ;
};

//------------------------------------------------------------------------------
// 설명 : 사운드 출력을 위한 버퍼 크기를 구한다.
// 반환 : 사운드 출력 버퍼 크기
//------------------------------------------------------------------------------
int   soundcard_get_buff_size( void)
{
   int   size  = 1024;

   if ( 0 <= fd_soundcard)
   {
      ioctl( fd_soundcard, SNDCTL_DSP_GETBLKSIZE, &size);
      if ( size < 1024 )
         size  = 1024;
   }
   return size;
}

//------------------------------------------------------------------------------
// 설명 : 사운드 카드 출력을 스테레오로 설정
// 인수 : _enable - 1 : 스테레오
//                  0 : 모노
//------------------------------------------------------------------------------
void  soundcard_set_stereo( int _enable)
{
   if ( 0 <= fd_soundcard)    ioctl( fd_soundcard, SNDCTL_DSP_STEREO, &_enable);
}
//------------------------------------------------------------------------------
// 설명 : 사운드 카드 출력 비트 레이트를 지정
// 인수 : _rate   - 설정할 비트 레이트
//------------------------------------------------------------------------------
void  soundcard_set_bit_rate( int _rate)
{
   if ( 0 <= fd_soundcard)    ioctl( fd_soundcard, SNDCTL_DSP_SPEED, &_rate );
}

//------------------------------------------------------------------------------
// 설명 : 출력 사운드의 비트 크기 지정
// 인수 : _size   - 사운드 데이터 비트 크기
//------------------------------------------------------------------------------
void  soundcard_set_data_bit_size( int _size)
{
   if ( 0 <= fd_soundcard)    ioctl( fd_soundcard, SNDCTL_DSP_SAMPLESIZE, &_size);
}

//------------------------------------------------------------------------------
// 설명 : sound card 볼륨 지정
// 인수 : _channel - 변경할 채널 번호
//             헤드폰 볼륨 : SOUND_MIXER_WRITE_VOLUME
//             PCM    볼륨 : SOUND_MIXER_WRITE_PCM
//             스피커 볼륨 : SOUND_MIXER_WRITE_SPEAKER
//             라인   볼륨 : SOUND_MIXER_WRITE_LINE
//             마이크 볼륨 : SOUND_MIXER_WRITE_MIC
//             CD     볼륨 : SOUND_MIXER_WRITE_CD
//             PCM2   볼륨 : SOUND_MIXER_WRITE_ALTPCM    주) ESP-MMI의 스피커 음량
//             IGain  볼륨 : SOUND_MIXER_WRITE_IGAIN
//             라인 1 볼륨 : SOUND_MIXER_WRITE_LINE1
//       _left : 볼륨의 좌측 값 또는 하위 값
//       _right: 볼륨의 우측 값 또는 상위 값
//------------------------------------------------------------------------------
void soundcard_set_volume( int _channel, int _left, int _right )
{
   int volume;

   if ( 120 < _left  ) _left  = 120;
   if ( 120 < _right ) _right = 120;

   volume = 256 *_right +_left;
   ioctl( fd_mixer, _channel, &volume );
}

//--------------------------------------------------------------------
// 설명: 사운드카드 사용을 종료하기 위해 닫기
//--------------------------------------------------------------------
void soundcard_close( void)
{
   close( fd_soundcard);
   close( fd_mixer    );
}

//--------------------------------------------------------------------
// 설명: 사운드카드 사용을 위한 열기
// 인수: _mode - PLAYER    : 재생 전용
// 인수: _mode - RECODER   : 녹음 전용
// 인수: _mode - AUDIO     : 재생과 녹음 모두 실행
// 반환: 사운드카드 파일 디스크립터
//--------------------------------------------------------------------
int   soundcard_open(int _mode)
{
   char  *dsp_devname   = DSP_DEVICE_NAME;
   char  *mixer_devname = MIXER_DEVICE_NAME;

   // 사운드 카드 장치 열기
   if ( 0 != access( dsp_devname, W_OK ) )
      return SCERR_PRIVILEGE_SOUNDCARD;

   fd_soundcard = open( dsp_devname,_mode);
   if ( 0 > fd_soundcard)
      return SCERR_OPEN_SOUNDCARD;

   // MIXER 열기

   if ( 0 != access( mixer_devname, W_OK ) )
      return SCERR_PRIVILEGE_MIXER;

   fd_mixer = open( mixer_devname, O_RDWR¦O_NDELAY );
   if ( 0 > fd_soundcard)
      return SCERR_OPEN_MIXER;

   return fd_soundcard;
}

//--------------------------------------------------------------------
// 설명: 사운드 카드를 이용하여 10초간 녹음하여 test.wav로 저장한다.
//--------------------------------------------------------------------
int main( int argc, char **argv )
{
   time_t   tm_start;
   time_t   tm_check;
   int      fd_soundcard;
   int      fd_wavfile;
   char    *sound_buff;                                                    // 사운드 출력을 위한 버퍼
   int      sound_buff_size;
   int      read_size;

   fd_soundcard   = soundcard_open( O_RDONLY ¦ O_NONBLOCK);
   switch( fd_soundcard)
   {
   case  SCERR_NO_PROC_DEVICE       :  printx( "/proc/device가 없음");
   case  SCERR_NO_SOUNDCARD         :  printx( "사운드 카드가 없음");
   case  SCERR_NO_MIXER             :  printx( "믹서가 없음");
   case  SCERR_PRIVILEGE_SOUNDCARD  :  printx( "사운드 카드를 사용할 권한이 없음");
   case  SCERR_PRIVILEGE_MIXER      :  printx( "믹서 장치를 사용할 권한이 없음");
   case  SCERR_OPEN_SOUNDCARD       :  printx( "사운드 카드를 열 수 없음");
   case  SCERR_OPEN_MIXER           :  printx( "믹서 장치를 열수 없음");
   }
   soundcard_set_volume( SOUND_MIXER_WRITE_ALTPCM, 120, 120);
   soundcard_set_volume( SOUND_MIXER_WRITE_MIC   , 80, 80);
   soundcard_set_volume( SOUND_MIXER_WRITE_IGAIN , 60, 60);

   soundcard_set_stereo( 0);
   soundcard_set_data_bit_size( 16);
   soundcard_set_bit_rate( 8000);
   sound_buff_size   = soundcard_get_buff_size();

   printf( "size=%dn", sound_buff_size);

   sound_buff  = ( char *)malloc( sound_buff_size);

   fd_wavfile  = open( "./test.wav", O_WRONLY ¦ O_CREAT ¦ O_TRUNC, 0644);
   if ( 0 > fd_wavfile)
      printx( "create wave file error");

   soundcard_write_wav_header( fd_wavfile, 1, 8000, 16, 10 * 8000);

   time( &tm_start);
   while( TRUE)
   {
      time( &tm_check);
      if ( 10.0 <= difftime( tm_check, tm_start))
         break;
      read_size   = read( fd_soundcard, sound_buff, sound_buff_size);
      write( fd_wavfile, sound_buff, read_size);
   }
   close( fd_wavfile);
   soundcard_close();
   return 0;
}
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2009/08/04 11:18

출처 : http://tong.nate.com/cookjava/49336451

마우스 오른쪽 버튼금지 2가지 방법

 
방법 1.
---------------------------------------------
<body oncontextmenu="return false" onselectstart="return false" ondragstart="return false">
완전히 오른쪽마우스가 안되게 하는 방법

<body bgcolor="#FFFFFF" text="#000000" oncontextmenu="return false">

드래그는 더되고  복사같은 기능 못쓰게  하는방법


<BODY onselectstart="return false" ondragstart="return false">
드래그만 안되고  복사 된는 기능



방법 2.
------------------------------------------------------------
<SCRIPT LANGUAGE=JAVASCRIPT>

/*

오른쪽 클릭 경고 박스 없이 못하게 하기(익스플로러/넷스케이프 모두)

*/

// 오른쪽 버튼 클릭을 못하게 하는 부분

if (window.Event) // 넷스케이프에서만 대문자 E.

document.captureEvents(Event.MOUSEUP); // mouse up 이벤트를 잡음

function nocontextmenu() // IE4에서만 적용, 다른 브라우저는 무시

{

event.cancelBubble = true

event.returnValue = false;

return false;

}

function norightclick(e) // 다른 모든 브라우저에서 작동

{

if (window.Event) // 다시, IE 또는 NAV ?

{

if (e.which == 2 || e.which == 3)

return false;

}

else

if (event.button == 2 || event.button == 3)

{

event.cancelBubble = true

event.returnValue = false;

return false;

}

}

document.oncontextmenu = nocontextmenu; // IE5+ 용

document.onmousedown = norightclick; // 다른 브라우저 용

</SCRIPT>

 마우스 오른쪽 메뉴 맘대로 만들기

 DHTM 을 이용한 마우스 오른쪽의 메뉴 만들기..  

<script language="JavaScript1.2">
<!--
var isie=0;
if(window.navigator.appName=="Microsoft Internet Explorer"&&window.navigator.appVersion.substring(window.navigator.appVersion.indexOf("MSIE")+5,window.navigator.appVersion.indexOf("MSIE")+8)>=5.5) {
isie=1;
}
else {
isie=0;
}
if(isie) {
var html="";
html+='<TABLE STYLE="border="0" WIDTH="140" HEIGHT="180" CELLPADDING="0" CELLSPACING="0"background="HTTP://F2SKY.KOR1.NET/mrneuback.gif">';
html+='<ST'+'YLE TYPE="text/css">\n';
html+='a:link {text-decoration:none;font-family:Arial;font-size:8pt;}\n';
html+='a:visited {text-decoration:none;font-family:Arial;font-size:8pt;}\n';
html+='td {font-size:8pt;}\n';
html+='</ST'+'YLE>\n';
html+='<SC'+'RIPT LANGUAGE="JavaScript">\n';
html+='\n<'+'!--\n';
html+='window.onerror=null;\n';
html+='/'+' -'+'->\n';
html+='</'+'SCRIPT>\n';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i0" ONMOUSEOVER="document.all.i0.style.background=\'#FFFFFF\';document.all.i0.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i0.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';"       ONCLICK="window.history.go(-1);"> <img SRC="HTTP://F2SKY.KOR1.NET/menuback.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 앞페이지로이동</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i1" ONMOUSEOVER="document.all.i1.style.background=\'#FFFFFF\';document.all.i1.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i1.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';"       ONCLICK="window.history.go(1);"> <img SRC="HTTP://F2SKY.KOR1.NET/menuforward.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 뒷페이지로이동</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i4" ONMOUSEOVER="document.all.i4.style.background=\'#FFFFFF\';document.all.i4.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i4.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';"       ONCLICK="window.parent.external.AddFavorite(window.top.location.href,window.top.document.title);"> <img SRC="HTTP://F2SKY.KOR1.NET/menufavorite.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 즐겨찾기에등록...</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i5" ONMOUSEOVER="document.all.i5.style.background=\'#FFFFFF\';document.all.i5.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i5.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';"       ONCLICK="window.parent.location=\'view-source:\'+window.parent.location.href;"> <img SRC="HTTP://F2SKY.KOR1.NET/menusource.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 소스보기</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i6" ONMOUSEOVER="document.all.i6.style.background=\'#FFFFFF\';document.all.i6.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i6.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';"       ONCLICK="window.print();"> <img SRC="HTTP://F2SKY.KOR1.NET/menuprint.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 프린트하기</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i7" ONMOUSEOVER="document.all.i7.style.background=\'#FFFFFF\';document.all.i7.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i7.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';"       ONCLICK="window.parent.location.href=window.parent.location.href;"> <img SRC="HTTP://F2SKY.KOR1.NET/menurefresh.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 새로고침</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i8" ONMOUSEOVER="document.all.i8.style.background=\'#FFFFFF\';document.all.i8.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i8.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';"       ONCLICK="if(window.parent.document.body.style.zoom!=0) window.parent.document.body.style.zoom*=1.6; else window.parent.document.body.style.zoom=1.6;"> <img SRC="HTTP://F2SKY.KOR1.NET/menuzoom.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 확대해서보기</TD></TR>';
html+='<TR><TD STYLE="border:0pt solid #FFFFFF" ID="i9" ONMOUSEOVER="document.all.i9.style.background=\'#FFFFFF\';document.all.i9.style.border=\'0pt solid #737B92\';" ONMOUSEOUT="document.all.i9.style.background=\'\';document.all.i0.style.border=\'0pt solid #CCCCCC\';"       ONCLICK="if(window.parent.document.body.style.zoom!=0) window.parent.document.body.style.zoom*=0.625; else window.parent.document.body.style.zoom=0.625;"> <img SRC="HTTP://F2SKY.KOR1.NET/menuzoom.gif" WIDTH="12" HEIGHT="12" BORDER="0" HSPACE="0" VSPACE="0" ALIGN="absmiddle"> 축소해서보기</TD></TR>';
html+='</TABLE>';
var oPopup = window.createPopup();
}
function dopopup(x,y) {
if(isie) {
var oPopupBody = oPopup.document.body;
oPopupBody.innerHTML = html;
oPopup.show(x, y, 140, 180, document.body);
}
}
function click(e) {
if(isie) {
if(document.all) {
if(event.button==2||event.button==3) {
dopopup(event.x-1,event.y-1);
}
}
}
}
if(isie) {
document.oncontextmenu = function() { dopopup(event.x,event.y);return false; }
document.onmousedown = click;
}
// -->
</script>
마우스 오른쪽을 눌러보세염

 배경을 고정하는 방법

 배경화면을 고정시켜 사이즈에 따라 배경화면의 위치가 바뀌는 것을 막는 방법입니다.

<BODY bgProperties=fixed bgColor=#ffffff leftMargin=0 background="http://iloverflash.co.kr/bg.gif" topMargin=0 marginwidth="0" marginheight="0">

 특정IP차단시키는 소스

 <script language="javascript">
var ip = '<!--#echo var="REMOTE_ADDR"-->'
if (ip == '차단할IP주소') {
alert("STOP! You are viewing this page from an IP address that is not allowed!");
alert("Why can't you guys just leave me alone?");
if (confirm("Do you want to leave peacefully? Or will I have to help you?"))
{location.href="http://iloveflash.co.kr" } else { ("OK you choose I don't care! Bye bye! Don't come back!"); {location.href="http://iloveflash.co.kr" }} }
</script>

 페이지가 용량이 많을때 읽는 중이라는 메시지보여주는 소스

 로딩소스

<body onload="hide()">

<script language=javascript>
<!--
n  = document.layers
ie = document.all
function hide() {
  if (ie || n) {
    if (n) document.Load.visibility = "hidden"
    else  Load.style.visibility    = "hidden"
  }
}

  if(ie || n) document.write('<div id=Load style=position:absolute;width:100%;height:100%;top:0;left:0;background-color:#ffffff;z-index:5 align=center>')
              document.write('<table border=0 height=100%>')
              document.write('<tr>')
              document.write('<td align=center><font size=4 color=gray face=굴림체>페이지를 읽고 있는 중입니다 ..... Loading...</font></td>')
              document.write('</tr>')
              document.write('</table>')
              document.write('</div>')
//-->
</script>

 화면가득 눈송이가 내리게 하는 소스

 눈송이의 크기, 모양, 갯수, 위치도 설정할수 있습니다

<!-- [1단계] 아래의 코드를 <body> 와 </body> 태그 사이에 붙여 넣으세요 -->

<script>

// 눈송이의 갯수 (30 - 40 개 이상은 권하지 않습니다)
var snowmax=20

// 눈송이의 색상을 설정 하세요(더 추가하실수 있습니다)
var snowcolor=new Array("#aaaacc","#ddddFF","#ccccDD")

// 눈송이(사실은 글자)의 글꼴을 설정 하세요
var snowtype=new Array("Arial Black","Arial Narrow","Times","Comic Sans MS")

// 눈송이 모양
var snowletter="★"; // 눈송이모양은 (*) 가 좋습니다

// 떨어지는 속도 (0.3 에서 2 까지 권장)
var sinkspeed=0.6

// 눈송이의 최대크기
var snowmaxsize=30

// 눈송이의 최소크기
var snowminsize=8

// 눈이 내릴 구역을 설정 하세요
// 1 전체화면,
// 2 왼쪽화면
// 3 가운데 부분
// 4 오른쪽 화면
var snowingzone=1

var snow=new Array()
var marginbottom
var marginright
var timer
var i_snow=0
var x_mv=new Array();
var crds=new Array();
var lftrght=new Array();
var browserinfos=navigator.userAgent
var ie5=document.all&&document.getElementById&&!browserinfos.match(/Opera/)
var ns6=document.getElementById&&!document.all
var opera=browserinfos.match(/Opera/)  
var browserok=ie5||ns6||opera

function randommaker(range) {                
        rand=Math.floor(range*Math.random())
    return rand
}

function initsnow() {
        if (ie5 || opera) {
                marginbottom = document.body.clientHeight
                marginright = document.body.clientWidth
        }
        else if (ns6) {
                marginbottom = window.innerHeight
                marginright = window.innerWidth
        }
        var snowsizerange=snowmaxsize-snowminsize
        for (i=0;i<=snowmax;i++) {
                crds[i] = 0;                      
            lftrght[i] = Math.random()*15;        
            x_mv[i] = 0.03 + Math.random()/10;
                snow[i]=document.getElementById("s"+i)
                snow[i].style.fontFamily=snowtype[randommaker(snowtype.length)]
                snow[i].size=randommaker(snowsizerange)+snowminsize
                snow[i].style.fontSize=snow[i].size
                snow[i].style.color=snowcolor[randommaker(snowcolor.length)]
                snow[i].sink=sinkspeed*snow[i].size/5
                if (snowingzone==1) {snow[i].posx=randommaker(marginright-snow[i].size)}
                if (snowingzone==2) {snow[i].posx=randommaker(marginright/2-snow[i].size)}
                if (snowingzone==3) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/4}
                if (snowingzone==4) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/2}
                snow[i].posy=randommaker(2*marginbottom-marginbottom-2*snow[i].size)
                snow[i].style.left=snow[i].posx
                snow[i].style.top=snow[i].posy
        }
        movesnow()
}

function movesnow() {
        for (i=0;i<=snowmax;i++) {
                crds[i] += x_mv[i];
                snow[i].posy+=snow[i].sink
                snow[i].style.left=snow[i].posx+lftrght[i]*Math.sin(crds[i]);
                snow[i].style.top=snow[i].posy
                
                if (snow[i].posy>=marginbottom-2*snow[i].size || parseInt(snow[i].style.left)>(marginright-3*lftrght[i])){
                        if (snowingzone==1) {snow[i].posx=randommaker(marginright-snow[i].size)}
                        if (snowingzone==2) {snow[i].posx=randommaker(marginright/2-snow[i].size)}
                        if (snowingzone==3) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/4}
                        if (snowingzone==4) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/2}
                        snow[i].posy=0
                }
        }
        var timer=setTimeout("movesnow()",50)
}

for (i=0;i<=snowmax;i++) {
        document.write("<span id='s"+i+"' style='position:absolute;top:-"+snowmaxsize+"'>"+snowletter+"</span>")
}
if (browserok) {
        window.onload=initsnow
}
</script>

 이미지 크기에 맞는 팝업창 띠우기

 
function popupImage(imageURL)
{
imageHandle=open("","popupForImage","toolbar=no,location=no,status=no,manubar=no,scrollbars=no,resizable=yes,width=100,height=100,top=100,left=50");
imageHandle.document.write("Image View");
imageHandle.document.write("");
imageHandle.document.write("*{margin:0;padding:0;border:0;}");
imageHandle.document.write("");
imageHandle.document.write("");
}


위의 스크립트를 <head>와 </head> 사이에 두고
<a href="javascript:popupImage('큰이미지')" onFocus="this.blur();"><img src="작은이미지"></a>  

 마우스 주위에 뱅글뱅글 도는 글 애니만들기

 ....

<SCRIPT LANGUAGE="xxJavaScript">
<!--
if (document.all) {
yourLogo = "라뷰해여~ 이쁜냔^-^!"; // 마우스 주위에 나타날 글자 를 써주세요.
logoFont = "돋움체"; // 글자체
logoColor = "#FDB7CE"; // 글자색
yourLogo = yourLogo.split('');
L = yourLogo.length;
TrigSplit = 360 / L;
Sz = new Array()
logoWidth = 30; // 장평 글자 간격입니다. 원의 크기 이겠죠!!
logoHeight = -30; // 글자의 크기 입니다. (여기서 - 는 반시계 반향 이고 지우면 시계방향으로 가요~)
ypos = 0;
xpos = 0;
step = 0.07; // 속도를 조절할 수 있습니다.
currStep = 0;
document.write('<div id="outer" style="position:absolute;top:0px;left:0px"><div style="position:relative">');
for (i = 0; i < L; i++) {
document.write('<div id="ie" style="position:absolute;top:0px;left:0px;'
+'width:10px;height:10px;font-family:'+logoFont+';font-size:12px;'
+'color:'+logoColor+';text-align:center">'+yourLogo[i]+'</div>'); }
document.write('</div></div>');
function Mouse()
{ ypos = event.y;
xpos = event.x - 5; }
document.xxonmousemove=Mouse;
function animateLogo() {
outer.style.pixelTop = document.body.scrollTop;
for (i = 0; i < L; i++) {
ie[i].style.top = ypos + logoHeight * Math.sin(currStep + i * TrigSplit * Math.PI / 180);
ie[i].style.left = xpos + logoWidth * Math.cos(currStep + i * TrigSplit * Math.PI / 180);
Sz[i] = ie[i].style.pixelTop - ypos;
if (Sz[i] < 5) Sz[i] = 5;
ie[i].style.fontSize = Sz[i] / 1.7; }
currStep -= step;
setTimeout('animateLogo()', 20); }
window.xxonload = animateLogo; }
//-->
</script>

 페이지 오픈시 자동으로 시작페이지 설정하기

 아래 소스를 사용하면 페이지를 오픈할 때 시작페이지를 자동으로 바꾸게 할 수 있습니다.

<html XMLNS:IE>
<head>
<script>
function MyStartHome()  
  {  
    if(!StartHomePage.isHomePage('http://www.filebest.com'))  
      StartHomePage.setHomePage('http://www.filebest.com');
  }
</script>

<STYLE>
@media all { IE\:HOMEPAGE {behavior:url(#default#homepage)} }
</STYLE>
<IE:HOMEPAGE ID="StartHomePage" />
</head>


<body Onload="MyStartHome();" >
.....
</body>
</html>

 홈페이지대문을 풀스크린 전체화면으로 뜨게 하기

 첫화면을 풀스크린으로 뜨게하는 예제

아래 소스를 그냥 HTML 파일로 만들면 됩니다.

설명:

단, 아래 소스는 약간의 편법으로 만들어 진 것으로
먼저 기본 HTML에서 풀스크린으로 뛰울 HTML을 오픈하고 자기 자신은 창을 닫는 방식을 사용했습니다.
이 소스는 장점은 어떤 첫화면 풀스크린만들기 소스보다 소스가 간단합니다.
단점은 약간의 시간이 걸리고 또 중간에 다른창이 떳다가 사라지는 것 같은 화면이 잠시 나타납니다.

* 전체화면으로 뜬 창은 Alt+F4 키를 누르면 나갈 수 있습니다. 그러나
  사용자들이 이것을 모르는 경우가 많기때문에 "닫기"버튼을 하나 만들어 주는 것이 좋습니다.  닫기 버튼은 이 게시판에서 "닫기"로 검색하면 찾을 수 있습니다.


예제:
<script>
popup=window.open("http://www.filebest.com","_blank","fullscreen,scrollbars")
</script>
<script>window.opener = window.location.href; self.close();</script>

공식

<script>
popup=window.open("연결할 URL경로","_blank","fullscreen,scrollbars")
</script>
<script>window.opener = window.location.href; self.close();</script>


위에서 하나 알 수 있느 것은 전체화면으로 뛰우기 위해서는 창옵션을 "fullscreen,scrollbars") 으로 하라는 것입니다.

 마우스 따라다니는 정렬된 예쁜 글자들

 [HTML ] 마우스 따라다니는 정렬된 예쁜 글자들


이름
:  Uploader1   작성일 : 2004-01-17 10:43:15  조회 : 120  





과정1)

헤드와 헤드사이에 삽입
<head>
............
............
    <style type="text/css">
.spanstyle {position:absolute; visibility:visible; top:-50px; font-size:9pt; font-family:돋움; color:blue;}
</style>


<script>

/*
Cursor Trailor Text- By Peter Gehrig (http://www.24fun.ch/)
Permission given to Dynamicdrive.com to feature script in it's archive.
*/

var x,y
var step=20
var flag=0

// Your snappy message. Important: the space at the end of the sentence!!!
var message="여기에 원하는 글을 쓰세요~"
message=message.split("")

var xpos=new Array()
for (i=0;i<=message.length-1;i++) {
        xpos[i]=-50
}

var ypos=new Array()
for (i=0;i<=message.length-1;i++) {
        ypos[i]=-50
}

function handlerMM(e){
        x = (document.layers) ? e.pageX : document.body.scrollLeft+event.clientX
        y = (document.layers) ? e.pageY : document.body.scrollTop+event.clientY
        flag=1
}

function makesnake() {
        if (flag==1 && document.all) {
        for (i=message.length-1; i>=1; i--) {
                        xpos[i]=xpos[i-1]+step
                        ypos[i]=ypos[i-1]
        }
                xpos[0]=x+step
                ypos[0]=y
        
                for (i=0; i<message.length-1; i++) {
                var thisspan = eval("span"+(i)+".style")
                thisspan.posLeft=xpos[i]
                        thisspan.posTop=ypos[i]
        }
        }
        
        else if (flag==1 && document.layers) {
        for (i=message.length-1; i>=1; i--) {
                        xpos[i]=xpos[i-1]+step
                        ypos[i]=ypos[i-1]
        }
                xpos[0]=x+step
                ypos[0]=y
        
                for (i=0; i<message.length-1; i++) {
                var thisspan = eval("document.span"+i)
                thisspan.left=xpos[i]
                        thisspan.top=ypos[i]
        }
        }
                var timer=setTimeout("makesnake()",30)
}

</script>

............
............
</head>




과정2)

<Body> 태그를 아래와 같이 수정해주세요.

<body onload="makesnake()" style="width:100%; overflow-x:hidden; overflow-y:scroll">




과정3)

<Body> </Body> 사이에 아래를 넣어주세요.

<body>
..............
<script>
<!-- Beginning of JavaScript -

for (i=0;i<=message.length-1;i++) {
    document.write("<span id='span"+i+"' class='spanstyle'>")
        document.write(message[i])
    document.write("</span>")
}

if (document.layers){
        document.captureEvents(Event.MOUSEMOVE);
}
document.onmousemove = handlerMM;

// - End of JavaScript - -->
</script>
............
</body>



위에서 ............는 이것저것 다른 소스를 의미합니다.

 링크 클릭시 사운드 효과

 [HTML] 링크 클릭시 사운드 효과


이름
:  Uploader1   작성일 : 2004-01-17 11:21:57  조회 : 60  




과정1- 해드와 해드사이에 넣어주세요.

<head>

<bgsound id=music loop="1">
<script>
function bgsoundcall(str)
{
eval(str);
}
</script>
</head>

옵션- 위 소스에서 <bgsound id=music loop="1">에서 "1"은 사운드 연주 횟수입니다. 1이면 1회 지요...


과정2- 바디에 넣어주세요.

<body>
<a OnClick="bgsoundcall('music.src=사운드파일명'');">연결하기</a>

출처 : Tong - cookjava님의 셈틀 통통

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2009/07/14 10:42

pancho <pan...@tee.com> wrote:
>Hello

>I would like to know if there is a way to know my ip address of each
>interface from a C program, if them are up or down...

>Of course, I can do it scanningf the output of "ifconfig", (more
>concretelly "ifconfig ppp0 | grep inetaddr"), but it would be great if
>exists the possibility of reading a structure with this information with a
>system call, just like sysinfo allows me to know how many free memory I
>have, for example.

>I have looked for such a function, but I havent found it. (I also have
>tried to look at the ifconfig code for a hint, but for me it is too
>complicated).

Below is a demo program that has been posted a few times previously.

/* display info about network interfaces */

#define _BSD_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <arpa/inet.h>

#define inaddrr(x) (*(struct in_addr *) &ifr->x[sizeof sa.sin_port])
#define IFRSIZE   ((int)(size * sizeof (struct ifreq)))

static int
get_addr(int sock, char * ifname, struct sockaddr * ifaddr) {

  struct ifreq *ifr;
  struct ifreq ifrr;
  struct sockaddr_in sa;

  ifr = &ifrr;
  ifrr.ifr_addr.sa_family = AF_INET;
  strncpy(ifrr.ifr_name, ifname, sizeof(ifrr.ifr_name));

  if (ioctl(sock, SIOCGIFADDR, ifr) < 0) {
    printf("No %s interface.\n", ifname);
    return -1;
  }

  *ifaddr = ifrr.ifr_addr;
  printf("Address for %s: %s\n", ifname, inet_ntoa(inaddrr(ifr_addr.sa_data)));
  return 0;

}

int
main(void)
{
  unsigned char      *u;
  int                sockfd, size  = 1;
  struct ifreq       *ifr;
  struct ifconf      ifc;
  struct sockaddr_in sa;

  if (0 > (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP))) {
          fprintf(stderr, "Cannot open socket.\n");
    exit(EXIT_FAILURE);
  }

  ifc.ifc_len = IFRSIZE;
  ifc.ifc_req = NULL;

  do {
    ++size;
    /* realloc buffer size until no overflow occurs  */
    if (NULL == (ifc.ifc_req = realloc(ifc.ifc_req, IFRSIZE))) {
      fprintf(stderr, "Out of memory.\n");
      exit(EXIT_FAILURE);
    }
    ifc.ifc_len = IFRSIZE;
    if (ioctl(sockfd, SIOCGIFCONF, &ifc)) {
      perror("ioctl SIOCFIFCONF");
      exit(EXIT_FAILURE);
    }
  } while  (IFRSIZE <= ifc.ifc_len);

  /* this is an alternate way to get info... */
  {
    struct sockaddr ifa;
    get_addr(sockfd, "ppp0", &ifa);
  }

  ifr = ifc.ifc_req;
  for (;(char *) ifr < (char *) ifc.ifc_req + ifc.ifc_len; ++ifr) {

    if (ifr->ifr_addr.sa_data == (ifr+1)->ifr_addr.sa_data) {
      continue;  /* duplicate, skip it */
    }

    if (ioctl(sockfd, SIOCGIFFLAGS, ifr)) {
      continue;  /* failed to get flags, skip it */
    }

    printf("Interface:  %s\n", ifr->ifr_name);
    printf("IP Address: %s\n", inet_ntoa(inaddrr(ifr_addr.sa_data)));

    /*
      This won't work on HP-UX 10.20 as there's no SIOCGIFHWADDR ioctl. You'll
      need to use DLPI or the NETSTAT ioctl on /dev/lan0, etc (and you'll need
      to be root to use the NETSTAT ioctl. Also this is deprecated and doesn't
      work on 11.00).

      On Digital Unix you can use the SIOCRPHYSADDR ioctl according to an old
      utility I have. Also on SGI I think you need to use a raw socket, e.g. s
      = socket(PF_RAW, SOCK_RAW, RAWPROTO_SNOOP)

      Dave

      From: David Peter <dave.pe...@eu.citrix.com>
     */

    if (0 == ioctl(sockfd, SIOCGIFHWADDR, ifr)) {

      /* Select which  hardware types to process.
       *
       *    See list in system include file included from
       *    /usr/include/net/if_arp.h  (For example, on
       *    Linux see file /usr/include/linux/if_arp.h to
       *    get the list.)
       */
      switch (ifr->ifr_hwaddr.sa_family) {
      default:
        printf("\n");
        continue;
      case  ARPHRD_NETROM:  case  ARPHRD_ETHER:  case  ARPHRD_PPP:
      case  ARPHRD_EETHER:  case  ARPHRD_IEEE802: break;
      }

      u = (unsigned char *) &ifr->ifr_addr.sa_data;

      if (u[0] + u[1] + u[2] + u[3] + u[4] + u[5]) {
        printf("HW Address: %2.2x.%2.2x.%2.2x.%2.2x.%2.2x.%2.2x\n",
             u[0], u[1], u[2], u[3], u[4], u[5]);
      }
    }

    if (0 == ioctl(sockfd, SIOCGIFNETMASK, ifr) &&
        strcmp("255.255.255.255", inet_ntoa(inaddrr(ifr_addr.sa_data)))) {
      printf("Netmask:    %s\n", inet_ntoa(inaddrr(ifr_addr.sa_data)));
    }

    if (ifr->ifr_flags & IFF_BROADCAST) {
      if (0 == ioctl(sockfd, SIOCGIFBRDADDR, ifr) &&
          strcmp("0.0.0.0", inet_ntoa(inaddrr(ifr_addr.sa_data)))) {
        printf("Broadcast:  %s\n", inet_ntoa(inaddrr(ifr_addr.sa_data)));
      }
    }

    if (0 == ioctl(sockfd, SIOCGIFMTU, ifr)) {
      printf("MTU:        %u\n",  ifr->ifr_mtu);
    }

    if (0 == ioctl(sockfd, SIOCGIFMETRIC, ifr)) {
      printf("Metric:     %u\n",  ifr->ifr_metric);
    }
    printf("\n");
  }

  close(sockfd);
  return EXIT_SUCCESS;

}
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2009/01/19 18:54
iperf 설치

 -.리눅스 OS

 

iperf can be installed on Debian or ubuntu 로 세팅시

 

apt-get install iperf

 

and on CentOS 로 세팅시

 

yum install iperf

 

-.윈도우 OS

 

다운로드 받아서 알맞게 압축을 풀은후 시작-실행-cmd 창에서 압축풀어논 자리로 가서

 

iperf -s (서버모드)

iperf -c xxx.xxx.xxx.xxx (클라이언트모드)

이렇게 하시면 됩니다. 다음은 예제입니다.

 

예제) 리눅스컴퓨터(192.168.0.2)

        윈도우컴퓨터(192.168.0.3)

 

리눅스를 서버모드로 윈도우를 클라이언트로 가정했을경우

 

리눅스 : iperf -s 엔터

 

윈도우 : iperf -c  192.168.0.2(리눅스아이피) 엔터

 

이렇게 하시면 리눅스와 윈도우 컴간의 속도가 나옵니다.

하지만 이렇게 하면 재미가 없겠죠? ^^

그래서 다음 옵션을 복사해서 붙여넣기를 하셔서 재미나게? 보시기 바랍니다.

 

리눅스 : iperf -s -P 0 -i 1 -p 5001 -l 8K -f m -t 10 엔터

 

윈도우 : iperf -c 192.168.0.2 -P 1 -i 1 -p 5001 -l 8K -f m -t 10 -L 5001 엔터

 

윗예제로 하시면 다양하게 속도가 측정이 되어서 나옵니다.^^; 자세한건 help명령어나 해당사이트참조바랍니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2008/11/28 20:31

*윈도우 XP 정품인증 받기*
 
대부분 집의 컵퓨터는 정품을 안쓰고 비품을 쓰고 계시더군요.
간단하게 "윈도우 XP 정품인증"을 받을수가 있거든요.
 xp정품인증 따라해보세요
시작 - 실행 - regedit  -확인 -  다음에 경로로 이동합니다.
 
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
windows NT
CurrentVersion
WPAEvents
보면은 oobetimer 라는게 있을 것입니다.
그걸 더블 클릭하면 편집이 뜨는데 첫째줄에 보면은 0000하고
몇칸 띄었고 그 다음에 숫자하고 영어하고 섞여있는게 보일겁니다.
맨앞에(0000다음에) ca 를 붙여주고 확인 누르시면 끝.
이제 재부팅 하시고...
시작>>실행>>oobe/msoobe /a 를 적고 <엔터>하여 정품인증 됐나 보세요.
정품인증 됐다고 나올껍니다.
그럼윈도우 업그레이드로 들어가셔서 무료로 업데이트하시고 여러가지 좋은것을 깔으세요.^*^
 
필요 하신분 유용하게 쓰세요.(씨디키는 "프루나" 에서 다운 받아서 쓰세요..)

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2008/10/20 00:05
출 처 : http://home.postech.ac.kr/~lionbaeg/cs499/research.htm 

Research

1. Web 2.0

미래의 웹 혹은 인터넷 환경 변화에 대한 방향성을 제시한 일종의 패러다임으로, 특정한 기술을 지칭하는 말은 아니다. Web 2.0에서는 단순한 website의 집합체를 web 1.0으로 보고, web application을 제공하는 하나의 완전한 플랫폼으로의 발전을 web 2.0이라고 지칭한다. Web 2.0이라는 용어는 'O'Reilly Media'에서 2004년에 사용되기 시작하면서 대중화 되었다.

Web 2.0의 기본 철학 = 참여, 개방, 공유

2. AVI Format


기본적으로 AVI도 마이크로소프트의 WAV 사운드 파일처럼 RIFF 포맷의 일부이다. 다른 RIFF 파일과 마찬가지로 AVI 파일도 하나의 RIFF 헤더와 여러 개의 chunk와 list로 구성되어 있다. RIFF 헤더, chunk, list의 기본 구조도는 다음과 같다.

위치 이름 크기 의미
0x00 groupID 4 RIFF 파일을 나타낸다. "RIFF"가 저장되어 있음.
0x04 groupSize 4 헤더 8바이트를 제외한 파일 크기.
0x08 riffType 4 AVI 파일을 나타낸다. "AVI"가 저장되어 있음.
헤더의 구조

위치 이름 크기 의미
0x00 chunkID 4 어떤 종류의 chunk인지를 나타낸다.
0x04 chunkSize 4 ID와 size 8바이트를 제외한 실제 저장된 데이터 크기.
0x08 Data n 실제 저장된 데이터
Chunk의 구조

위치 이름 크기 의미
0x00 groupID 4 LIST임을 나타내는 문자열. "LIST"가 저장되어 있다.
0x04 listSize 4 ID와 size 8바이트를 제외한 실제 저장된 데이터 크기.
0x08 listType 4 어떤 종류의 list인지를 나타내는 문자열.
0x0C Data n 실제 저장된 데이터. Chunk또는 또 다른 list가 올 수 있다.
List의 구조
< RIFF 헤더, chunk, list 블록의 구조 >

다음은AVI 파일의 구조도이다.


<AVI 파일 구조>

그림에서 보듯이 list 안에는 여러 개의 chunk 블록과 또 다른 list들이 들어 있을 수 있다. 맨 처음 RIFF 헤더가 오고 다음에는 동영상 재생과 관련된 여러 가지 정보를 담고 있는 헤더 리스트가 온다. 그리고 파일 크기를 일정하게 만들기 위한 JUNK 블록이 오는데 이는 선택 사항으로 없을 수도 있다. 그 다음 실제 오디오/비디오 데이터를 담고 있는 audio/video data list가 온다.

헤더 리스트의 구조는 다음과 같다.

위치 이름 크기 의미
0x00 groupID 4 "LIST"
0x04 listSize 4 헤더 8바이트를 제외한 리스트 크기.
0x08 ListType 4 "strl"
0x0C ListData n 오디오/비디오 스트림 헤더(strh)와 오디오/비디오 스트림 포맷(strf)가 들어있다.
< 헤더 리스트의 구조 >

헤더 리스트 안에는 AVI 헤더(avih)와 AVI 스트림 list(strl)가 들어 있는데 각각의 구조는 다음과 같다.

위치 이름 크기 의미
0x00 chunkID 4 “avih”
0x04 chunkSize 4 헤더 8바이트를 제외한 데이터 크기.
0x08 MicroSecPerFrame 4 프레임과 프레임 사이 시간 간격. 단위는 밀리초
MaxBytesPerSec 4 최대 초당 전송 바이트 수.
Reserved 4  
Flags 4 플래그. 인덱스 유무 등을 나타낸다.
TotalFrames 4 총 프레임 수
InitialFrames 4 시작 프레임
Streams 4 스트림 개수. 하나의 오디오와 비디오가 있는 경우 스트림 수는 2.
SuggestedBufferSiz 4 파일을 읽을 때 사용할 버퍼 크기
Width 4 이미지 폭. 픽셀 단위.
Height 4 이미지 높이.픽셀 단위.
Reserved 16  
AVI 헤더

위치 이름 크기 의미
0x00 groupID 4 “LIST”
0x04 listSize 4 헤더 8바이트를 제외한 리스트 크기.
0x08 ListType 4 어떤 헤더 리스트인가를 나타내는 문자열 “hdrl”이 들어 있다.
0x0C ListData n AVI 헤더(avih)와 AVI 스트림 list(strl)가 온다.
AVI 스트림
< AVI 헤더와 AVI 스트림 리스트의 구조 >

AVI 스트림 리스트 안에는 스트림 개수에 따라 하나 또는 그 이상의 오디오/비디오 스트림 헤더와 오디오/비디오 스트림 포맷이 들어 있다. 다음은 오디오/비디오 스트림 헤더와 포맷의 구조이다. 오디오/비디오 스트림 포맷은 코덱에 따라 차이가 날 수 있다.

위치 이름 크기 의미
0x00 chunkID 4 “strh”
0x04 chunkSize 4 헤더 8바이트를 제외한 데이터 크기.
0x08 fccType 4 스트림의 유형. “vids”는 비디오 스트림을 나타내고 “auds”는 오디오 스트림을 나타낸다.
fccHandler 4 데이터 핸들러를 가리키는 문자열. 보통 사용한 오디오/비디오 코덱을 나타낸다.
Flags 4 플래그.
Priority 2 중요도. 여러 개의 스트림이 있을 때 중요도가 가장 높은 스트림이 디폴트 스트림이 된다.
Language 2 언어.
InitialFrames 4 오디오 데이터가 비디오 데이터에 비해 얼마나 앞서 있는가를 나타냄
Scale 4 Rate / Scale = 초당 샘플링 수.
Rate 4
Start 4 시작 시간
Length 4 길이
SuggestedBufferSize 4 버퍼 크기
Quality 4 화질 또는 음질. 0에서 10,000 사이의 값을 가진다. –1이면 디폴트 값을 사용한다.
SampleSize 4 샘플 데이터의 크기
Frame 16 비디오가 출력될 윈도우 크기.
< 오디오/비디오 스트림 헤더 >

위치 이름 크기 의미
0x00 chunkID 4 “strf”
0x04 chunkSize 4 헤더 8바이트를 제외한 데이터 크기.
0x08 Data n 오디오/비디오 스트림 포맷 데이터
< 표 6 오디오/비디오 스트림 포맷 >

그 다음에 실제 오디오/비디오 데이터가 저장된 비디오/오디오 데이터 리스트가 온다. “movi” 리스트 안에 여러 개의 오디오/비디오 데이터 chunk가 들어있다. 이들 데이터 chunk들은 다시 “rec” 리스트로 묶여 있을 수 있다.

위치 이름 크기 의미
0x00 groupID 4 “LIST”
0x04 groupSize 4 헤더 8바이트를 제외한 리스트 크기.
0x08 ListType 4 “movi”
0x0C groupID 4 “LIST”
0x10 groupSize 4 헤더 8바이트를 제외한 리스트 크기.
0x14 ListType 4 “rec”. 참고: “rec” 리스트는 생략될 수 있다.
0x18 listID 4 “##wb” 또는 “##dc” 또는 “##db”
0x1C groupSize 4 헤더 8바이트를 제외한 데이터 크기.
0x20 data 4 실제 오디오/비디오 데이터
: : : :         :
< 데이터 리스트 >
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2008/09/28 18:03

작년 세계 시장 조사기관인 JP프리먼의 발표 자료에 따르면 IP camera 산업의 전망은 밝은 것으로 보입니다.


JP프리먼은 최근 보고서를 통해 2009년까지 IP서베일런스(IP서베일런스(IP surveillance)는 CCTV와 DVR 등 영상보안 장비들을 IP기반 네트워크 시스템으로 구성한 것을 말하며 IT 카메라도 이에 해당합니다.)에 들어가는 IP카메라와 비디오 서버 시장이 15배 이상 성장할 것으로 전망하였습니다. 반면, 현 영상보안 시장의 핵심인 디지털영상저장장치(DVR)는 2008년 이후 성장 정체될 것으로, 아날로그 카메라와 아날로그 저장장치는 이미 시장 축소 단계에 있는 것으로 조사 되었습니다.


특히, 주요 제품 가운데 통신과 융합된 영상보안 시장의 주력장비로 꼽히는 IP 카메라와 비디오 서버는 향후 5년간 각각 15배, 19배 성장할 것으로 예상되었습니다. 지난해 4400만달러 수준였던 IP카메라 시장은 올해 8000만달러로 성장하고 2009년에는 6억5000만달러 규모에 이를 것으로, 비디오서버 시장 역시 2004년 1500만달러에서 5년 후에는 2억8000만달러 규모로 초고속 성장이 가능할 것으로 예측됐습니다. 다음 자료는 2005년 JP 프리먼에서 발표한 것으로 세계 시장 규모는 통상 미국의 두 배로 추정합니다.

<표. 미국 주요 영상보안 장비 시장전망(단위:백만달러) >

     구분  2004년  2005년  2006년  2007년  2008년  2009년

     IP카메라  44    80    150   250    410    650

    비디오서버 15    30    50   100    170    280

      DVR  100   140    160   180    180    170

    아날로그 240   260    250   230    180    100
     카메라

    아날로그  65    48   30    18    12    5
     리코더


최근 IP camera 사업에 박차를 가하고 있는 기업은 아이디스, 윈포넷, 어드밴텍, KT 등이 있습니다.
아이디스(대표 김영달)는 이미 IP카메라, 비디오 서버 등의 제품군 개발은 마친 상태라고 말한바 있습니다. 또 현재 판매중인 주력 DVR 제품군은 모두 IP 원격제어 및 저장·전송 기능을 갖췄다고 설명하였습니다. 단, 아직까지 DVR 매출이 좋은 상태로 향후 시장 상황을 고려해 IP기반 제품군 대응 수위를 조절한다는 계획에 있습니다.


윈포넷(대표 권오언)은 전용 비디오 서버와 네트워크 연계 DVR(NDR), IP와 연동한 영상전용 스토리지를 최근 출시했습니다. 모두 IP 기반에서 활용도를 높인 제품으로, 회사는 IP 환경에서 장비의 성능을 극대화할 수 있는 전용 소프트웨어도 자체 개발, 판매에 돌입했습니다. 권오언 윈포넷 사장은 "GE·펠코 등 해외 주요 매출처를 중심으로 IP연동 제품에 대한 납품 및 개발 요구가 크게 늘고 있다"며 "영상보안 시장의 네트워크화는 대세로 이에 맞는 제품 개발을 통해 시장에 대처하겠다”고 밝혔습니다.


어드밴텍(대표 최영준)은 KT와 영상보안장비 공동 마케팅을 벌이는 등 IP기반 제품 개발에 적극적입니다. IP카메라와 비디오 서버 이외에 다양한 IP기반 제품군을 선보이고 있습니다다. VoIP 등에 활용되는 프로토콜인 SIP(Session Initiation Protocol)를 탑재해 영상을 보고 상대방과 대화가 가능한 전용서버 개발을 마치고 출시를 준비중입니다다. 단순히 사물의 동작에 반응하는 것이 아니라 프로그램화된 특정 행위만을 감시할 수 있는 인텔리전트 DVR도 개발하고 있습니다. 신제품은 영상정보의 실시간 데이터 분석도 가능할 것이라고 회사 측은 설명합니다.



투자 가능성에 대한 전문적은 지식은 아니지만, IP camera 시장에 대한 전반적인 이해에는 도움이 되실 것 같아서 이렇게 답변 드립니다. 여러가지를 고려하여 좋은 선택 하시길 바랍니다. ^^
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2008/08/26 10:04

XMLHttpRequest(XHR) 객체는 Internet Explore5에서 ActiveX 컴포넌트 형식으로 가장 먼저 제공되었기때문에, 모질라와 사파리 웹브라우저에서 이 객체를 도입하기전까지 사실 많은 개발자들이 XMLHttpRequest 객체의 사용을 꺼려했다.

XHR은 W3C 표준이 아니기때문에 브라우저마다 작동방식에 있어서 다소나마 차이가 존재했었지만 현재 대부분의 브라우저들은 XHR 기능을 서로 비슷하게 구현하고 있다.
현존하는 브라우저들 중에서 XHR을 지원하지 않는 브라우저는 거의 없을정도로 대부분의 브라우저들은 현재 XHR 을 지원하고 있다.

ajax 구현의 시작은 XHR 객체의 생성에서 시작한다.
XHR 은 W3C 의 표준이 아니므로, 인터넷익스플로어에서는 ActiveX Component 형식으로 구현되었고, 그 밖에 다른 브라우저들(FireFox, Safari, Opera)은 native javascript 객체로 구현되었다.
이런 차이점을 고려해서 XHR 객체를 얻어오는 자바스크립트 코드를 다음과 같이 작성할 수 있다.

var xmlHttp;

function createXMLHttpRequest() {
     if(window.ActiveXObject) {
          xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
     } else if(window.XMLHttpRequest) {
          xmlHttp = new XMLHttpRequest();
     }
     return xmlHttp;
}

window.ActiveXObject 는 ActiveXObject를 지원하는 브라우저라면 오브젝트를 리턴하고 그렇지 않다면 null를 리턴하게 된다.
따라서 오브젝트가 존재하면 if 구문은 true 를 반환하고 xmlHttp 값은 ActiveXObject 객체가 할당되어진다. if 구문이 false 를 반환하면 else 구분으로 이동하여 xmlHttp 값은 navtive javascript 객체가 할당될 것이다.
따라서 위 코드를 이용하면 브라우저가 다르더라도 하나의 메소드로 XHR 객체를 생성할 수 있다.


XHR 오브젝트의 메소드

void open(method, url, [async, [user, [ password ]]])
     요청을 초기화한다.

     method : GET/POST
     url : 요청대상 URL
     async : 비동기 true, 동기 false (default : true)
     user : 인증페이지에서 사용될 사용자 이름
     password : 인증페이지에서 사용될 암호

async 을 false 로 설정하면 요청은 동기로 처리되기 때문에 서버에서 응답을 받을때까지 프로세스는 기다린다.
XHR 을 사용하는 가장 큰 이점중의 하나인 비동기 처리를 위해서는 asynch 항목을 true 로 설정해야 한다.
false 를 설정한다면 XHR 을 사용하는 이점이 그만큼 줄어든다.


void send(content)
실질적으로 요청을 서버로 보낸다.
요청이 비동기이면 이 메소드는 바로 리턴되지만 요청이 동기이면 서버에서 응답을 받을때까지 계속 대기한다.
content 는 선택사항이며, DOM 객체이거나 input stream, string 값으로 설정할 수 있으며 HttpRequest body 의 한 부분으로 서버로 전달된다.
(※content 에 값을 넘기려면 open() 메소드는 반드시 POST 로 설정해야 하며, GET 방식으로 요청하려면 null 을 설정하면 된다.)

open(), send() 메소드가 가장 많이 사용되는 메소드들이다.
나머지 메소드에 대해서도 알아보자.

void setRequestHeader(string header, string value)
     header 에 해당하는 value 값으로 HttpRequest  헤더에 값을 설정하는 메소드이다.
     반드시 open() 메소드 다음에 위치해야 한다.

void abort()
     요청을 중지한다.

string getAllResponseHeaders()
     요청에 대응되는 응답의 헤더정보를 리턴한다.
     즉, Content-Length, Date, URI 등을 포함하는 헤더정보를 string 형식으로 반환한다.

string getResponseHeader(string header)
     응답의 헤더정보중에서 header 에 대응되는 값을 string 형식으로 반환한다.


XHR 속성중에서 중요한 몇가지 속성

onreadystatechange
     자바스크립트 콜백함수(funtion pointer)를 저장한다.
     콜백함수는 readyState 값이 변할때 마다 호출된다.
     요청이 서버로 보내지면 readyState 는 5가지 숫자값으로 계속 변화가 일어나게 된다.

readyState
     요청의 상태를 의미한다.

     0 : UNINITIALIZED : 오브젝트는 작성되어 있으나 아직 초기화되어 있지 않다.(open()이 불리지 않았음)
     1 : LOADING : 오브젝트가 작성되었으나 아직 send()가 불리지 않았다.
     2 : LOADED : send()가 불렸지만 ststus와 header가 아직 도착하지 않았다.
     3 : INTERACTIVE : data일부를 받았다.
     4 : COMPLETED : data전부를 받았다. 완전한 데이터가 이용가능

responseText
     서버의 응답을 string 형식으로 나타낸다.

responseXML
     서버의 응답을 XML 로 나타낸다.
     이 속성은 DOM 객체로 파싱할 수 있다.

status
     서버로부터의 HTTP 상태코드이다.(예 200(OK), 404(NOT Found) 등등)

statusText
     HTTP 상태코드에 대한 텍스트 값이다.(예 OK, NOT Found 등등)

------------------------------------------------------------------------------------------
구현예제


function getHttprequest( URL, post_val )
{
 var xmlhttp = null;

try
{
 if(window.XMLHttpRequest)
 {
  xmlhttp = new XMLHttpRequest();
 }
 else
 {
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
 }
 
 var method = (post_val)? "POST":"GET";
 
 xmlhttp.open( method, URL,false);
 xmlhttp.onreadystatechange = function()
 {
  if(xmlhttp.readyState==4 && xmlhttp.status == 200 && xmlhttp.statusText=='OK')
  {
   responseText = xmlhttp.responseText;
  }
 }
 
 if( method == "POST" )
  xmlhttp.send( post_val );
 else
  xmlhttp.send('');

} catch(E)
{
 return "FALSE";
}

 return responseText = xmlhttp.responseText;
}


function BootCheck()
{
 var strCommand = "http://" + document.domain;
 strCommand +=  "/cgi-bin/Reboot";

 var post_val = "cmd=BootCheck";
 var rev_data_t = getHttprequest( strCommand , post_val);
 
 if( rev_data_t == "OK")
 {
  show_waiting(false);
  alert("REBOOT DONE!");  
  document.location.href = "/frame_intro.html";
 }

 setTimeout("BootCheck()", 1000); // 1sec unit
}

function Reboot()
{
 show_waiting(true);
 
 var strCommand = "http://" + document.domain;
 strCommand +=  "/cgi-bin/Reboot";
 
 var post_val = "cmd=Reboot";
 
 //alert(strCommand);
 var rev_data_t = getHttprequest( strCommand , post_val);
 
 if( rev_data_t != "OK")
 {
  show_waiting(false);
  alert("ERROR:: System reboot.");
 }
 
 setTimeout("BootCheck()", 1000); // 1sec
}


위 코드는 임베디드 시스템에서 웹을 통해 시스템을 리붓했을때 사용할 수 있는 루틴이다.
실제 이코드를 이용해서 시스템을 리붓한후 대기창을 뛰운다음 리붓이 다 되고나면

리붓이 끝났다는 메세지를 뛰워보일수 있다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2008/08/25 16:06
TAG ajax, reboot


하드 디스크 FAT32 포맷 유틸리티 3.0.1.28 입니다.
Windows 98, 98SE, ME, NT, 2000, XP, Vista 에서 사용할 수 있습니다.
 
[3.0.1.28 업데이트 정보]
- 일부 환경에서 대상 드라이브가 제대로 인식되지 않은 문제 해결
 
용도 : 외장 하드 디스크나 USB 메모리를 사용하는 경우에
NTFS 방식으로 포맷된 디스크는 NT 이전 버전이나
Mac에서 사용할 경우 제약이 많으므로
FAT32 방식의 포맷을 권장합니다.


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 롸이언
공부 이야기/컴퓨터 몽땅 l 2008/08/22 02:31
1 2 3 4 5 

카테고리

꼭대기 (82)
롸이언 이야기 (7)
가족 이야기 (0)
친구 이야기 (1)
공부 이야기 (51)
취미 이야기 (17)
노래 이야기 (1)

달력

«   2010/07   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Statistics Graph
tistory!get rss Tistory Tistory 가입하기! DNS Powered by DNSEver.com