Busan IT/공장내 Network2015. 8. 26. 10:09

==================================Outline====================================
Select함수를 사용한 채팅 서버
----------------------------------------------------------------------------



/*** server.c ***/

#include "smartsock.h"
#include <unistd.h>

int main(void)
 {
   int iSock;   //소켓 함수의 반환 값을 받는 변수
  int icSock[MAX_USER];   //accept의 반환 값을 받는 변수
  int iRtn;
   struct sockaddr_in stAddr;
   socklen_t uiSockLen=sizeof(struct sockaddr);
   char cBuf[BUF_SIZE];
   const char * cP;
   fd_set fdRead;
   unsigned int uiUser;
   unsigned int uiCnt, uiCnt2;
   int iMSock;  //store greatest number in file descriptors


   iSock = socket(AF_INET, SOCK_STREAM, 0);    //AF_INET = 2, 
   if(0 > iSock)
   {
     perror("socket : ");
     return -1;
   }
   // stAddr구조체에 socket연결을 위한 필수 정보 입력  setting
   bzero(&stAddr, sizeof(stAddr));            //구조체 비우기(0으로 채우기)
   stAddr.sin_family = AF_INET;               //#define AF_INET 2 /* IP protocol family. */
   stAddr.sin_addr.s_addr = inet_addr(IP);    //IP와 PORT값은 헤더파일에 정의되어 있다.
   stAddr.sin_port = htons((PORT));

   iRtn = bind(iSock, (struct sockaddr *)&stAddr,sizeof(stAddr));
   if(iRtn < 0)
   {
     perror("bind : ");
     close(iSock);

     return -2;
   }
   iRtn = listen(iSock, 5);
   if(iRtn != 0)
   {
     perror("listen : ");
     close(iSock);

     return -3;
   }
   uiUser = 0;
   while(1
   {
     // setting fd_set
     FD_ZERO(&fdRead);    //fdRead 변수 1024byte 전부 0으로 세팅 
     FD_SET(0&fdRead);  //키보드 입력 감시
     FD_SET(iSock, &fdRead);  //접속 소켓 감시
     iMSock = iSock;      //소켓의 최대값 저장 -> select함수 첫번째 인자는 감시하는 파일 값 + 1기 때문이 이에 대한 최대값 저장

     for(uiCnt = 0; uiCnt < uiUser; ++uiCnt)  //사용자가 접속하면 해당 Fd를 set해주고 가장 높은 fd값을 저장
    {
       FD_SET(icSock[uiCnt], &fdRead);  //접속한 사용자수만큼의 icSock배열에 소켓 값이 들어있음으로 이를 감시 
       if(iMSock < icSock[uiCnt])
       {
         iMSock = icSock[uiCnt];  //iMSock에 소켓의 최대값 저장
       }      
     }

     select((iMSock+1), &fdRead, 000);//select 함수를 사용하여 감시해준다.(입력이 있을때까지 무한대기)

     if0 != FD_ISSET(iSock, &fdRead) ) //랑데뷰 소켓이 set(1)되어 있으면(사람이 접속하면) accept함수를 받아서 대화 소켓을 열어준다.
     {
       icSock[uiUser] = accept(iSock, (struct sockaddr *)&stAddr, &uiSockLen); //대화 소켓 값을 icSock배열에 저장해준다.
       if(icSock[uiUser] < 0)
       {
         perror("Accept : ");
         continue;
       }
       printf("Incoming Client \n");
       printf("Client IP :%s\n", inet_ntoa(stAddr.sin_addr));      //사용자가 접속하면 IP를 출력시켜준다.
       write(icSock[uiUser], "Welcome :)"sizeof("Welcome :)"));    //접속자에게 "Welcome" 메세지 전송
       ++uiUser;                //사용자 수 +
     }
     if(0 != FD_ISSET(0&fdRead))                //서버에서 입력 값이 있을 경우에
    {  
       iRtn = read(0, cBuf, MSG_SIZE);            //키보드 값을 읽어 cBuf에 저장
       cBuf[iRtn - 1= 0;              //\n\r을 제거하기 위해 문자열 끝에 0을 강제 삽입
       for(uiCnt = 0; uiCnt < uiUser; ++uiCnt)
       {
         write(icSock[uiCnt], cBuf, MSG_SIZE);//모든 사용자에게 보낸다.    //접속한 클라이언트에게 메세지 전송
       }
     }
     for(uiCnt = 0; uiCnt < uiUser; ++uiCnt)          //접속 클라이언트 대화 소켓을 순회하면서 대화내용이 있는지 확인
     {  
       if0 != FD_ISSET(icSock[uiCnt], &fdRead))
       {
         read(icSock[uiCnt], cBuf, MSG_SIZE);          //대화가 있으면 읽어들임
         for(uiCnt2 = 0; uiCnt2 < uiUser; ++uiCnt2)
         {
           if(uiCnt != uiUser)      
             write(icSock[uiCnt2] ,cBuf, MSG_SIZE);        //모든 클라이언트들에게 내용을 전송
         }
         if0 == strncmp(cBuf,MSG_END, strlen(MSG_END)) )       //클라이언트가 종료 메세지를 입력할 경우
         {          
           close(icSock[uiCnt]);            //해당 소켓을 닫고          
           --uiUser;                //uiUser 수를 줄여주고
           icSock[uiCnt] = icSock[uiUser];          //빠져나간 자리에 가장 마지막에 들어온 유저의 소켓 번호를 넣어준다
         }
       }
     }

   }
   for(uiCnt = 0; uiCnt < uiUser; ++uiCnt)          //종료시 열린 소켓을 모두 닫아준다.
   {
     close(icSock[uiCnt]);  
   }
   close(iSock);
   return 0;
 }
   
  


반응형
Posted by newind2000
Busan IT/공장내 Network2015. 8. 24. 17:45

==================================Outline====================================

select함수를 사용한 채팅 프로그램

----------------------------------------------------------------------------


select함수를 사용하여 멀티프로세스가 아닌 파일 디스크럽터 감시로 다중화 입출력을 처리한다. select함수의 단점은 채널의 수가 210승개(1024)로 제약된다는 점이다.


select함수로 감시할 파일을 지정하기 위해 FD_ZERO, FD_SET을 사용한다. 이 함수들을 사용하기 위해서 우선 fd_set 구조체를 선언해주어야 한다. FD_ZERO와 FD_SET의 인자로 생성한 fd_set구조체의 주소를 던져주어야 하기 때문이다.




fork함수를 활용하여 멀티 프로세스로 코딩하였던 채팅 프로그램을 select함수를 사용하여 만들어보자.


/*** client.c ***/

#include "smartsock.h"

int main(void)
{
  int iFd;
  struct sockaddr_in stAddr;
  int iLen;
  int iRtn;
  char cBuf[BUF_SIZE];  
  fd_set fdRead;


  /*** socket ***/
  iFd = socket(AF_INET, SOCK_STREAM, 0);
  if(-1 == iFd)
  {
    perror("socket:");
    return 100;
  }

  /*** structure setting ***/
  stAddr.sin_family = AF_INET;
  stAddr.sin_addr.s_addr = inet_addr(IP);
  stAddr.sin_port = htons(PORT);

  iLen = sizeof(struct sockaddr_in);

  /*** connect ***/
  iRtn = connect(iFd, (struct sockaddr *)&stAddr, iLen);
  if(-1 == iRtn)
  {
    perror("connect:");
    close(iFd);
    return 200;
  }

  while(1)
  {
    FD_ZERO(&fdRead);  
    FD_SET(0&fdRead);
    FD_SET(iFd, &fdRead);      
    select(iFd+1,&fdRead, 000);

    if(0 == (FD_ISSET(0&fdRead) ) )
    {
      memset(cBuf, 0, MSG_SIZE);
      iRtn = read(0, cBuf, MSG_SIZE);      
      cBuf[iRtn - 1= 0;
      write(iFd, cBuf, MSG_SIZE);
      printf("[Send MSG]: [%s]\n", cBuf);    
    }
    if(0 == (FD_ISSET(iFd, &fdRead) ))
    {
      memset(cBuf, 0, MSG_SIZE);
      iRtn = read(iFd, cBuf, MSG_SIZE);      
      printf("[Server]: [%s]\n", cBuf);    
    }
    if(0 == strncmp(cBuf, MSG_END, strlen(MSG_END)))
    {
      break;
    }    
  }

  

  /*** read & write ***/
  //memset(cBuf, 0, BUF_SIZE);
  //iRtn = read(0, cBuf, BUF_SIZE);
  

  close(iFd);
  return 0;
}

/*** server.c ***/

#include "smartsock.h"
#include <unistd.h>

int main(void)
{
  int iSock;   //소켓 함수의 반환 값을 받는 변수
  int icSock[MAX_USER];   //accept의 반환 값을 받는 변수
  int iRet;
  struct sockaddr_in stAddr;
  socklen_t uiSockLen=sizeof(struct sockaddr);
  char cBuff[BUF_SIZE];
  const char * cP;
  fd_set fdRead;
  unsigned int uiUser;
  unsigned int uiCnt;

  iSock = socket(AF_INET, SOCK_STREAM, 0);    //AF_INET = 2, 
  if(0 > iSock)
  {
    perror("socket : ");
    return -1;
  }
  // stAddr구조체에 socket연결을 위한 필수 정보 입력  setting
  bzero(&stAddr, sizeof(stAddr));            //구조체 비우기(0으로 채우기)
  stAddr.sin_family = AF_INET;               //#define AF_INET 2 /* IP protocol family. */
  stAddr.sin_addr.s_addr = inet_addr(IP);    //IP와 PORT값은 헤더파일에 정의되어 있다.
  stAddr.sin_port = htons((PORT));

  iRet = bind(iSock, (struct sockaddr *)&stAddr,sizeof(stAddr));
  if(iRet < 0)
  {
    perror("bind : ");
    close(iSock);

    return -2;
  }
  iRet = listen(iSock, 5);
  if(iRet != 0)
  {
    perror("listen : ");
    close(iSock);

    return -3;
  }
  uiUser = 0;
  while(1
  {
    FD_ZERO(0,&fdRead);
    FD_SET(0&fdRead);
    FD_SET(iSock, &fdRead);
    for(uiCnt = 0; uiCnt <= uiUsert; ++uiCnt)
    {
      FD_SET(icSock[uiCnt], &fdRead)
      
    }
    select((iSock+1+uiCnt), &fdRead, 000);

    if0 != FD_ISSET(iSock))
    {
      icSock[uiUser] = accept(iSock, (struct sockaddr *)&stAddr, &uiSockLen); //접속자의 정보가 stAddr에 입력된다.
      if(icSock[uiUser] < 0)
      {
        perror("Accept : ");
        continue;
      }
      ++uiUser;
      


    }




    if(pid ==  0)  
    {
      break;
    }
  }
  close(iSock);

  printf("Incoming Client \n");
  //cP = inet_ntoa(stAddr.sin_addr);
  printf("Client IP :%s\n", inet_ntoa(stAddr.sin_addr));
  printf("Client Port : %d\n", ntohs(stAddr.sin_port));  

  write(icSock, "Welcome :)"sizeof("Welcome :)"));

  while(1)
  {
    read(icSock, cBuff, MSG_SIZE);
    printf("[client]: [%s]\n", cBuff);

    write(icSock, cBuff, MSG_SIZE);
    if(0 == strncmp(MSG_END, cBuff, strlen(MSG_END) ) )
      break;

  }
  close(icSock);
  return 0;
}


/*** smartsock.h ***/


#ifndef __SMARTSOCK_H__
#include <sys/select.h>
#define __SMARTSOCK_H__

#include <stdio.h>
#include <string.h>
#include <strings.h>
// socket & bind & listen & accept & connect
#include <sys/types.h>
#include <sys/socket.h>

// sockaddr_in
#include <netinet/in.h>

// read & write
#include <unistd.h>

// htonl
#include <arpa/inet.h>

// errno, perror
#include <errno.h>

// open
#include <fcntl.h>
#include <sys/stat.h>

//select
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/select.h>

#define PORT      7777
#define IP        "192.168.0.173"

#define MSG_SIZE  255
#define BUF_SIZE  (MSG_SIZE+1)
#define MSG_END    "quit"

#define MAX_USER 30

#endif /* __SMARTSOCK_H__ */

client.c


server.c


smartsock.h


반응형
Posted by newind2000
Busan IT/Assembly2015. 8. 21. 17:31

==================================Outline====================================

디버깅

명령어의 표현과 구조

----------------------------------------------------------------------------

디버깅

 

asm 파일 컴파일 시 디버그 기능 추가

 

- 컴파일

ml /c /coff /Zi *.asm

 

- 링크

link /debug /subsystem:console /entry:start /out:*.exe *.obj kernel32.lib

 

 

디버그를 위한 툴 'windbg'

 

 

 

새창으로 windbg가 열리면 메뉴에서 File -> Open Excutable...

실행 파일을 선택한다.

 

실행 창과 command 창이 뜬다.

F8 또는 'step into' 아이콘을 눌러 프로그램을 진행 시킨다.

이 때 메모리와 레지스터의 상태를 보고 싶다면 메뉴->View에서 원하는 것을 선택한다.

 

 

프로그램이 실행되면 소스가 적힌 코드 창이 뜬다. 여기에 노란줄로 실행되고 있는 코드 영역이 표시 된다.

 

 

 

메모리를 볼 때 원하는 변수명을 앞에 ‘&’와 같이 붙혀 주면 해당 변수의 시작점부터 메모리를 볼 수 있다.

'step into' 버튼을 눌러가며 메모리와 레지스터의 변화를 살펴본다.

 

//EIP는 실행되고 있는 명령어 주소를 가리키는 레지스터이다.

 

 

 

 

명령어의 표현과 구조

 

 

컴파일 시 '/Fl' 옵션을 추가하면 ‘lts'파일이 생성된다.

 

lst파일은 가장 좌측에는 메모리 시작점에서 떨어진 주소를 16진수 8자리 숫자로 표시하고,

그 다음 숫자는 기계어를 나타낸다.

 

//어셈블리에서는 대소문자를 구분하지 않는다.

 

mask BYTE 7dh -> char mask = 125;


변수에 값을 직접적으로 넣는 것을 direct 방식, 간접적으로 넣는 방식을 indirect방식이라고 한다.

 

indirect 방식을 사용할 때 ‘[]’를 사용한다. C에서 포인터 방식이라고 생각하면 된다. indirect 방식은 레지스터에만 사용 가능하다.

 

데이터 복사 명령어

 

number of Byte는 컴파일 후 생성되는 명령어의 길이다.

//immediate는 레지스터 혹은 변수에 들어가는 실제 값


/*** lst 코드 ***/


Microsoft (R) Macro Assembler Version 6.11        08/21/15 16:17:23
sample1.asm                 Page 1 - 1


        ; Sample code for dummy

        .386
        .MODEL FLAT

        ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD

        INCLUDE io.h
            C ; IO.H -- header file for I/O macros
            C ; 32-bit version for flat memory model
            C ; R. Detmer   last revised 8/2000
            C .NOLIST     ; turn off listing
            C .LIST        ; begin listing
            C 

 = 0000000D      cr EQU 0dh
 = 0000000A      Lf EQU 0ah

        .STACK 4096

 00000000      .DATA
 00000000 00000000    number1   DWORD  ?
 00000004 00000000    number2   DWORD  ?
 00000008 45 674 65 72  prompt1   BYTE  "Enter first number: "0
     20 66 69 72 73
     74 20 675 6D
     62 65 72 320
     00
 000000145 674 65 72  prompt2   BYTE  "Enter second number: "0
     20 73 65 63 6F
     664 20 675
     662 65 72 3A
     20 00
 00000033  00000028 [    string    BYTE  40 DUP (?)
      00
     ]
 00000050054 68 65  labell    BYTE  cr, Lf, "The sum is "
     20 73 75 620
     69 73 20
 00000068  0000000B [    sum     BYTE  11 DUP (?)
      00
     ]
 00000073  0000        BYTE  cr, Lf, 0

 00000000      .CODE

        ;entry point
 00000000      _start:
          output  prompt1    ;a printf call in C, output is a function made from the provider
          input  string, 40  ;a scanf call in C, percieve as ASCII code
          atod  string    ;convert ASCII to DWORD and store to eax
 0000002E  A3 00000000 R    mov  number1, eax  ;number1 = eax

          output  prompt2
          input  string, 40
          atod  string
 00000061  A3 00000004 R    mov  number2, eax  

 00000066  A1 00000000 R    mov  eax, number1
 0000006B  03 05 00000004 R    add  eax, number2  ; eax = eax + number2 // result of algebric operation is stored at eax
          dtoa  sum, eax
          output  labell

          INVOKE  ExitProcess, 0

        PUBLIC _start

        END



Microsoft (R) Macro Assembler Version 6.11        08/21/15 16:17:23
sample1.asm                 Symbols 2 - 1




Macros:

                N a m e                 Type

atod . . . . . . . . . . . . . .  Proc
atoi . . . . . . . . . . . . . .  Proc
dtoa . . . . . . . . . . . . . .  Proc
input  . . . . . . . . . . . . .  Proc
itoa . . . . . . . . . . . . . .  Proc
output . . . . . . . . . . . . .  Proc


Segments and Groups:

                N a m e                 Size     Length   Align   Combine Class

FLAT . . . . . . . . . . . . . .  GROUP
STACK  . . . . . . . . . . . . .  32 Bit   00001000 DWord    Stack    'STACK'   
_DATA  . . . . . . . . . . . . .  32 Bit   00000076 DWord    Public  'DATA'  
_TEXT  . . . . . . . . . . . . .  32 Bit   00000097 DWord    Public  'CODE'  


Procedures,  parameters and locals:

                N a m e                 Type     Value    Attr

ExitProcess  . . . . . . . . . .  P Near   00000000 FLAT  Length= 00000000 External STDCALL


Symbols:

                N a m e                 Type     Value    Attr

@CodeSize  . . . . . . . . . . .  Number   00000000h   
@DataSize  . . . . . . . . . . .  Number   00000000h   
@Interface . . . . . . . . . . .  Number   00000000h   
@Model . . . . . . . . . . . . .  Number   00000007h   
@code  . . . . . . . . . . . . .  Text      _TEXT
@data  . . . . . . . . . . . . .  Text      FLAT
@fardata?  . . . . . . . . . . .  Text      FLAT
@fardata . . . . . . . . . . . .  Text      FLAT
@stack . . . . . . . . . . . . .  Text      FLAT
Lf . . . . . . . . . . . . . . .  Number   0000000Ah   
_start . . . . . . . . . . . . .  L Near   00000000 _TEXT  Public
atodproc . . . . . . . . . . . .  L Near   00000000 FLAT  External
atoiproc . . . . . . . . . . . .  L Near   00000000 FLAT  External
cr . . . . . . . . . . . . . . .  Number   0000000Dh   
dtoaproc . . . . . . . . . . . .  L Near   00000000 FLAT  External
inproc . . . . . . . . . . . . .  L Near   00000000 FLAT  External
itoaproc . . . . . . . . . . . .  L Near   00000000 FLAT  External
labell . . . . . . . . . . . . .  Byte   0000005B _DATA  
number1  . . . . . . . . . . . .  DWord   00000000 _DATA  
number2  . . . . . . . . . . . .  DWord   00000004 _DATA  
outproc  . . . . . . . . . . . .  L Near   00000000 FLAT  External
prompt1  . . . . . . . . . . . .  Byte   00000008 _DATA  
prompt2  . . . . . . . . . . . .  Byte   0000001D _DATA  
string . . . . . . . . . . . . .  Byte   00000033 _DATA  
sum  . . . . . . . . . . . . . .  Byte   00000068 _DATA  

     0 Warnings
     0 Errors

반응형
Posted by newind2000
Busan IT/Assembly2015. 8. 20. 17:39

==================================Outline====================================

어셈블리어의 구성요소

----------------------------------------------------------------------------

 

어셈블리어의 구성요소

 

에셈블리어 자체의 문법은 간단하지만 알고리즘 구현은 까다롭다.

 

 

 

Directive(.)는 행동을 명령할 때 사용된다.

 

 

 

에셈블리어는 name, mnemonic 그리고 operand로 구성된다.

 

//mov 데이터를 삽입할 때 사용한다. C에서 '='와 같은 연산자이다.

 

간단한 어셈블리어 코드를 보고 기본 문법을 익혀 보자.

 


/*** 코드 해석 ***/


.386 ; 386에서 수행되는 명령어를 사용, 일반적으로 코딩 시 386을 사용한다.

.MODEL FLAT ; 데이터가 구역 없이 메모리에 저장되는 방식 <-> SEGMENT

 

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD ; Exit함수 호출: 원상복구 시키며 종료

 

INCLUDE io.h ; 헤더 파일 추가

 

 

cr EQU 0dh ; #define cr 0dh //16진수를 사용할 때, ‘0*h’로 표현해준다.

Lf EQU 0ah ; #define Lf 0ah

 

.STACK 4096 ; 4kbyte 스택를 확보한다.

 

.DATA ; 변수 선언. 데이터 영역 확보(전역변수)

number1 DWORD ? ; 4byte number1 초기화 없이 선언

number2 DWORD ? ; 4byte number2 초기화 없이 선언

 

prompt BYTE "Enter first number: ", 0; 문자열 선언 //어셈블리는 문자열에서 NULL을 포함시키지 않기 때문에 NULL을 추가시켜 주어야 한다.

prompt BYTE "Enter first number: ", 0;

 

string BYTE 40 DUP (?) ; 40BYTE 쓰레기 값을 복사하여 string에 넣어라.

labell BYTE cr, Lf, "The sum is " ; 13, 10, The sum islabell에 넣어라.

sum BYTE 11 DUP(?) ; 11BYTE 쓰레기 값을 복사하여 sum에 넣어라.

BYTE cr, Lf, 0 ; 1byte cr, Lf, 0 생성

 

 

컴파일 명령어 : ml /c /coff example.asm

 

 

링크 명령어 : link /subsystem:console /entry:start /out:example.exe example.obj io.obj kernel32.lib

 

//WORD = 2BYTE

//DWORD = double word, 4BYTE


/*** 코드 ***/

; Sample code for dummy

.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD

INCLUDE io.h

cr EQU 0dh
Lf EQU 0ah

.STACK 4096

.DATA
number1   DWORD  ?
number2   DWORD  ?
prompt1   BYTE  "Enter first number: "0
prompt2   BYTE  "Enter second number: "0
string    BYTE  40 DUP (?)
labell    BYTE  cr, Lf, "The sum is "
sum     BYTE  11 DUP (?)
    BYTE  cr, Lf, 0

.CODE

;entry point
_start:
  output  prompt1    ;a printf call in C, output is a function made from the provider
  input  string, 40  ;a scanf call in C, percieve as ASCII code
  atod  string    ;convert ASCII to DWORD and store to eax
  mov  number1, eax  ;number1 = eax

  output  prompt2
  input  string, 40
  atod  string
  mov  number2, eax  

  mov  eax, number1
  add  eax, number2  ; eax = eax + number2 // result of algebric operation is stored at eax
  dtoa  sum, eax
  output  labell

  INVOKE  ExitProcess, 0

PUBLIC _start

반응형
Posted by newind2000
Busan IT/ARM Controller2015. 8. 19. 16:43

==================================Outline====================================

Interrupt Code

초음파 센서 SRF05

Timer/Counter

----------------------------------------------------------------------------

Interrupt Code


#include <project.h>


unsigned char DBGU_RX()
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_RXRDY) );  //reciever inactive status holding here

  return *AT91C_DBGU_RHR;    //Data read from DBGU_RHR register  
}

void DBGU_TX(char ucData)
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_TXRDY) );  //transmitter inactive status holding here

  *AT91C_DBGU_THR = ucData;    //put data into THR register

  return;
}

void DBGU_STR(const char * cpStr)
{
  while0 != *cpStr)
  {
    DBGU_TX(*cpStr);
    ++cpStr;
  }
}

void DBGU_Init_Polling()      //initiating
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter    
}
void DBGU_Menu()
{
  DBGU_STR("1. LCD Print\n\r");
  DBGU_STR("m. Menu Print\n\r");    
}

void DBGU_RX_ISR()
{  
  //while(*AT91C_DBGU_RHR == 0);
  switch((*AT91C_DBGU_RHR & 0x000000FF))
  {
    default   :  DBGU_STR("Wrong Instruction\n\r");
          DBGU_Menu();
          break;
          
    case 'M'  :  DBGU_Menu();
          break;    
      
    case 'm'  :  DBGU_Menu();
          break;    
          
    case '1'  :  LCD_Inst(LCD_INST_CLR);
          LCD_Print("Hello World");
          break;
          
  }
  
  //RX TX Enable
}

void DBGU_Init_ISR()      //initiating RX with interrupt
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting


  *AT91C_AIC_IDCR  = 1<<AT91C_ID_SYS;    // SYS인터럽트 핀 커맨드 비 활성화 
  
  AT91C_AIC_SVR[AT91C_ID_SYS] = (unsigned int)DBGU_RX_ISR;  // 핸들러 등록  
  AT91C_AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE|
                  AT91C_AIC_PRIOR_LOWEST;        // 동작모드 및 우선순위 결정
  *AT91C_AIC_ICCR  = 1<<AT91C_ID_SYS;    // 커맨드 레지스터 클리어    
  *AT91C_DBGU_IER  = AT91C_US_RXRDY;  //RXRDY 레지스터 활성화  
  *AT91C_AIC_IECR   = 1<<AT91C_ID_SYS;  // SYS 인터럽트 핀 인터럽트 활성화
  
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter      

}




void DBGU_Init()
{
  DBGU_Init_ISR();
}

 

초음파 센서 SRF05

 

센서는 센서의 감지 값을 직접 변환하여 사용해야 하지만 센서 모듈은 사용자가 직접 프로그래밍 과정을 거치지 않고 작동 원리를 알지 않아도 사용자가 바로 사용할 수 있도록 제공된다.

 

 

//음속 : 340m/s

 

 

 

Timer/Counter

 

초음파 센서를 작동시키기 위해서는 Timer/Counter와 인터럽트를 사용해야 한다.

 

ARMTimer/Counter에 대해서 배워보자.


 

Timer/Counter를 사용하기 위해 PMC에서 클럭을 공급해 주어야 한다. TC_CMR을 사용하아 T/C를 조작해야 한다.


 

카운터가 최대 값에 도달한 후 0으로 떨어질 수도 있지만 숫자가 서서히 감소할 수도 있다.

이를 이용하여 다양한 파형을 만들 수 있다.

반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

Timer/Counter  (0) 2015.09.07
주파수와 ARM 메모리맵  (0) 2015.08.28
ARM UART Interrupt  (0) 2015.08.14
ARM USART(2)  (0) 2015.08.12
ARM USART  (0) 2015.08.11
Posted by newind2000
Busan IT/공장내 Network2015. 8. 18. 16:54

==================================Outline====================================

select 함수

select함수를 사용한 채팅프로그램 작성

----------------------------------------------------------------------------

select 함수 



 

 

#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>

#include <stdio.h>

 

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

 

fd_set 구조체가 인자로 사용된다. fd_set 구조체의 크기는128byte, 1024bit이다. byte단위가 아닌 flag형식인 bit 단위로 1024bit를 1(set)과 0으로 조작한 후 select함수에 넣어 사용하게 될 것이다.

 

인자들(Arguments)

 

nfds

[입력] 버클리 소켓과 호환되는 소켓을 제외 하고는 이 매개변수는 무시됩니다. 버클리 소켓에서 이 매개변수는 I/O 변화를 감지 할 총 소켓의 갯수+1 의 값을 지정하는 용도로 사용합니다.

 

readfds

[/출력] 읽기상태의 변화를 감지할 소켓을 지정합니다.

 

writefds

[/출력] 쓰기상태의 변화를 감지할 소켓을 지정합니다.

 

exceptfds

[/출력] 예외상태 변화를 감지할 소켓을 지정합니다.

 

timeout

[입력] select 함수가 기다리기 위한 시간입니다. NULL 일경우 지정한 I/O변화가 발생했을 때까지 계속 기다립니다.


fd_set구조체 조작 함수들


FD_ZERO: fd_set 구조체에서 모든 비트를 0으로 채우는 함수

FE_SET: fd_set 구조체에서 선택 비트를 1로 채우는 함수

FD_CLR: fd_set 구조체에서 선택 비트를 0으로 채우는 함수 

FD_ISSET: fd_set 구조체해서 해당 비트의 상태를 반환하는 함수


select 함수

select함수의 Read, Write, Error 중에서 값이 set으로 된 것들만 감시하게 된다.

 

select는 블록킹 함수로써(scanf같은) 감시하던 파일들에서 이벤트가 발생 했을 때 블록 상태가 풀리게 된다.

 

select의 마지막 인자는 블록킹 대기 상태의 시간을 나타내며 ‘0’을 입력 시 무한대기 상태가 된다.

 

select 함수는 등록된 파일 중 데이터 변화가 생긴 개수를 반환하고 함수 실패 시 -1을 반환한다.

 

첫 번째 인자에서 감시하는 수에서 가장 큰 수에 +1 한 값을 넣어주면 된다.

 

select함수를 사용한 채팅프로그램 작성

 

select함수를 사용하면 멀티 프로세스 없이 채팅 프로그램을 작성할 수 있다.

 

전에 작성하던 헤더파일만 사용하고 serverclient채팅 프로그램을 다시 작성해보자.

 

우선 클라이언트부터 만든다.

 

클라이언트 채팅 프로그램을 만들기 위한 흐름은 아래와 같다.

 

socket() -> connect() -> read() & write() -> close()


/*** 소스 ***/

#include "smartsock.h"

int main(void)
{
  int iFd;
  struct sockaddr_in stAddr;
  int iLen;
  int iRtn;
  char cBuf[BUF_SIZE];
  fd_set fdRead;

  /*** socket ***/
  iFd = socket(AF_INET, SOCK_STREM, 0);
  if(-1 == iFd)
  {
    perror("socket:");
    return 100;
  }

  /*** structure setting ***/
  stAddr.sin_family = AF_INET;
  stAddr.sin_addr.s_addr = inet_addr(IP);
  stAddr.sin_port = htons(PORT);

  iLen = sizeof(struct sockaddr_in);

  /*** connect ***/
  iRtn = connect(iFd, (struct sockaddr *)&stAddr, iLen);
  if(-1 == iRtn)
  {
    perror("connect:");
    close(iFd);
    return 200;
  }

  while(1)
  {
    FD_ZERO(&fdRead);  
    FD_SET(0&fdRead);
    FD_SET(iFd, &fdRead);  //    
  }
  

  /*** read & write ***/
  memset(cBuf, 0, BUF_SIZE);
  iRtn = read(0, cBuf, BUF_SIZE);
  

  close(iFd);
  return 0;
}

 

반응형
Posted by newind2000
Busan IT/Assembly2015. 8. 17. 17:37

==================================Outline====================================

자료형과 컴퓨터 시스템

----------------------------------------------------------------------------

 

ARM이나 ATmegaI/O Mapped Memory 방식을 사용하여 C의 포인터로 메모리를 사용할 수 있었으나 I/O Mapped I/O방식은 포인터로 조작할 수 없음으로 어셈블러를 사용해야 한다.

 

데이터 레지스터 혹은 일반 레지스터는 EAX, EBX, ECX, EDX이다.

 

EAX(Extended Accumulator Register) 속도가 빠르기 때문에 계산에 사용되면 이를 누산기(accumulator)라고 부른다. EAX4byte이며 하위 2byteAX라고 부른다.

AX에서 가장 하위 비트를 AL 한 단계 상위 비트를 AH로 부른다.

 

유니온 구조체로 표현하자면,

 

union Reg

{

int EAX;

short AX;

char AH;

char AL;

}

 

EBX(Extended Base Register), ECX(Extended Count Register), EDX(Extended Data Register)

 

과거 2byte체제에서는 확장되지 않은 레지스터들이(AX, BX, CX, DX) 존재했다.

386체제부터는 4byte로 확장되었다.

 

추가적인 4개의 레지스터들이 존재한다.

 

ESIEDI는 인덱스 레지스터이다. 인덱스를 사용하여 데이터를 복사하는데 사용한다.

ESP는 스택 포인터이고 EBP는 베이스 포인터이다.

 

6개의 구역을 나누는 레지스터도 존재한다: CS, DS, ES, FS, GS, SS

 

4byte 명령어 포인터 EIP(Extended Instruction Pointer)

 

EIP = PC(Program Counter) -> 명령어가 수행되는 Code영역의 주소를 가지고 있다.

 

EFLAGS는 상태레지스터로 사용된다.

 

//위에 표는 다음에 사용될테니 잘 보아두자.

mnemonic은 특정한 명령어, 지시어 혹은 명령이다. 한 개 이상의 연산이 있을 때 연산은 쉼표(,)로 구분된다.

 

ex) add eax, 158 -> 05 00 00 00 9E






 

 

반응형
Posted by newind2000
Busan IT/ARM Controller2015. 8. 14. 17:06

==================================Outline====================================

ARM UART Interrupt 

----------------------------------------------------------------------------

 

수신 인터럽트를 만들어서 데이터 통신을 해보자.

 

 

구현하고자하는 내용은 키보드에 ‘m' 또는 ’M'을 입력하였을 때 ARM에서 메뉴를 표시하게 하고 그 이 외의 값을 입력했을 때는 잘못 입력되었음을 출력하는 것이다.

 

기존에 있던 DBGU_Init 함수를 복사하여 DBGU_Init_ISR을 만들고 난 후 DBGU_Init_Polling으로 이름을 바꾼 후 코딩을 하자.

 

DBGU_Init_ISR에서 인터럽트를 사용하기 위한 코드를 추가해야 한다.

송수신을 활성화 시키는 코드를 가장 밑으로 내리고 그 바로 위에 코딩을 해보자.

 

void DBGU_Init_ISR()      //initiating RX with interrupt
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting


  *AT91C_AIC_IDCR  = 1<<AT91C_ID_SYS;    // SYS인터럽트 핀 커맨드 비 활성화 
  
  AT91C_AIC_SVR[AT91C_ID_SYS] = (unsigned int)DBGU_RX_ISR;  // 핸들러 등록  
  AT91C_AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE|
                  AT91C_AIC_PRIOR_LOWEST;        // 동작모드 및 우선순위 결정
  *AT91C_AIC_ICCR  = 1<<AT91C_ID_SYS;    // 커맨드 레지스터 클리어    
  *AT91C_DBGU_IER  = AT91C_US_RXRDY;  //RXRDY 레지스터 활성화  
  *AT91C_AIC_IECR   = 1<<AT91C_ID_SYS;  // SYS 인터럽트 핀 인터럽트 활성화
  
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter      

} 


interrupt 핸들러에 등록되어 있는 함수를 만들자. 간단하게 메뉴를 띄우는 함수이다.


void DBGU_Menu()
{
  DBGU_STR("1. LCD Print\n\r");
  DBGU_STR("m. Menu Print\n\r");    
}

void DBGU_RX_ISR()
{  
  //while(*AT91C_DBGU_RHR == 0);
  switch((*AT91C_DBGU_RHR & 0x000000FF))
  {
    default   :  DBGU_STR("Wrong Instruction\n\r");
          DBGU_Menu();
          break;
          
    case 'M'  :  DBGU_Menu();
          break;    
      
    case 'm'  :  DBGU_Menu();
          break;          
  }
  
  
  
  //RX TX Enable
}




/*** 전체 소스 코드 ***/


#include <project.h>


unsigned char DBGU_RX()
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_RXRDY) );  //reciever inactive status holding here

  return *AT91C_DBGU_RHR;    //Data read from DBGU_RHR register  
}

void DBGU_TX(char ucData)
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_TXRDY) );  //transmitter inactive status holding here

  *AT91C_DBGU_THR = ucData;    //put data into THR register

  return;
}

void DBGU_Init_Polling()      //initiating
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter    
}
void DBGU_Menu()
{
  DBGU_STR("1. LCD Print\n\r");
  DBGU_STR("m. Menu Print\n\r");    
}

void DBGU_RX_ISR()
{  
  //while(*AT91C_DBGU_RHR == 0);
  switch((*AT91C_DBGU_RHR & 0x000000FF))
  {
    default   :  DBGU_STR("Wrong Instruction\n\r");
          DBGU_Menu();
          break;
          
    case 'M'  :  DBGU_Menu();
          break;    
      
    case 'm'  :  DBGU_Menu();
          break;          
  }
  
  
  
  //RX TX Enable
}

void DBGU_Init_ISR()      //initiating RX with interrupt
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting


  *AT91C_AIC_IDCR  = 1<<AT91C_ID_SYS;    // SYS인터럽트 핀 커맨드 비 활성화 
  
  AT91C_AIC_SVR[AT91C_ID_SYS] = (unsigned int)DBGU_RX_ISR;  // 핸들러 등록  
  AT91C_AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE|
                  AT91C_AIC_PRIOR_LOWEST;        // 동작모드 및 우선순위 결정
  *AT91C_AIC_ICCR  = 1<<AT91C_ID_SYS;    // 커맨드 레지스터 클리어    
  *AT91C_DBGU_IER  = AT91C_US_RXRDY;  //RXRDY 레지스터 활성화  
  *AT91C_AIC_IECR   = 1<<AT91C_ID_SYS;  // SYS 인터럽트 핀 인터럽트 활성화
  
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter      

}


void DBGU_STR(const char * cpStr)
{
  while0 != *cpStr)
  {
    DBGU_TX(*cpStr);
    ++cpStr;
  }
}

void DBGU_Init()
{
  DBGU_Init_ISR();
}


반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

주파수와 ARM 메모리맵  (0) 2015.08.28
Interrupt Code, 초음파 센서 SRF05, Timer/Counter  (0) 2015.08.19
ARM USART(2)  (0) 2015.08.12
ARM USART  (0) 2015.08.11
AIC(2)  (0) 2015.07.31
Posted by newind2000
Busan IT/정보처리기사2015. 8. 14. 13:50

 

<데이터 통신>




 

비트 방식의 데이터링크 프로토콜이 아닌 것은?

[정답율: 23%]

HDLC

SDLC

LAPB

BSC

 

 

슬라이딩 윈도우(Sliding window)제어 방식에 대한 설명으로 옳지 않은 것은?

[정답율: 11%]

X.25 패킷 레벨의 프로토콜에서도 사용되고 있으며, 수신 통지를 이용하여 송신 데이터의 양을 조절하는 방식이다.

송신측과 수신측 실체(entity)간에 호출설정 시 연속적으로 송신 가능한 데이터 단위의 최대치를 절충하는 방식이다.

수신측으로 부터의 수신통지에 의해 윈도우는 이동하고 새로운 데이터 단위의 송신이 가능하다.

하나의 데이터 블록을 전송한 후 응답이 올 때까지 다음 데이터 블록을 전송하지 않고 대기하는 방식이다.

 

 

RTP(Real-time Transport Protocol) 헤더의 각 필드에 대한 설명으로 틀린 것은?

[정답율: 72%]

Padding(P) 필드가 세팅되어 있는 경우는 그 패킷의 끝에 전송하려는 데이터 외에 추가적인 데이터들이 포함되어 있다.

Marker(M) 필드는 패킷 스트림에서 프레임들 간의 경계에 존재하는 특별한 경우를 표시한다.

Extension(X) 필드가 세팅되어 있는 경우는 RTP헤더 앞에 확장 헤더가 있음을 의미한다.

Payload Type(PT) 필드는 데이터가 어떤 형식인지를 지정한다.

 

 

PSK(Phase Shift Keying) 방식이 적용되지 않은 변조 방식은?

[정답율: 76%]

QDPSK

QAM

QVM

DPSK

 

 

86. VAN의 주요 통신처리 기능 중 회선의 접속이나 제어 절차 등의 데이터를 전송할 때 다른 기종간의 통신이 가능 하도록 통신절차를 변환시키는 기능은?

[정답율: 11%]

프로토콜 변환 기능

미디어 변환 기능

포맷 변환 기능

데이터 교환 기능

 

 

87. CSMA/CD(Carrier Sensing Mulitiple Access/Collision Detection)에 대한 설명으로 틀린 것은?

[정답율: 72%]

전송 중에 충돌이 감지되면 패킷의 전송을 즉시 중단하고 충돌이 발생한 사실을 모든 스테이션들이 알 수 있도록 간단한 통보신호를 송신한다.

스테이션의 수가 많아지면 충돌이 많아져서 효율이 떨어진다.

충돌과 채널 경쟁을 위해 p-persistent 기법을 일반적으로 사용한다.

어느 한 기기에 고장이 발생하여도 다른 기기의 통신에 전혀 영향을 미치지 않는다.

 

88. X.25 프로토콜에 대한 설명으로 틀린 것은?

[정답율: 13%]

물리계층의 표준으로 X.21을 사용한다.

링크 계층의 표준은 LAPB을 사용한다.

패킷형 단말기를 패킷 교환망에 접속하기 위한 인터페이스 프로토콜이다.

물리 계층과 링크 계층인 2개의 계층으로 구성된다.

 

 

89. B-ISDN 프로토콜 참조 모델에 해당하지 않는 계층은?

[정답율: 10%]

Data Link Layer

Asynchronous Transfer Mode Layer

Asynchronous Transfer Mode Adaptation Layer

Physical Layer

 

90. 송신측에서 (1101)의 데이터를 전송하였으나, 수신측이 받은 데이터는 (1011)로 나타났다. 이 때 두 데이터간의 해밍거리로 옳은 것은?

[정답율: 14%]

1

2

3

4

 

 

92. LAN의 통신 구조가 가능한 한 호환성을 유지해야 한다는 필요성에 의해 OSI 참조 모델의 데이터 링크 계층을 2개의 서브 계층으로 나누었는데 이에 해당하는 것은?

[정답율: 6%]

상위 서브 계층 : LLC, 하위 서브계층 : LAPB

상위 서브 계층 : HDLC, 하위 서브계층 : MAC

상위 서브 계층 : HDLC, 하위 서브계층 : LAPB

상위 서브 계층 : LLC, 하위 서브계층 : MAC

 

 

95. 패킷교환 방식에서 패킷을 작게 분할할 경우의 단점이 아닌 것은?

[정답율: 9%]

헤더가 증가된다.

노드지연시간이 증가된다.

패킷의 분할/조립시간이 늘어난다.

전체적인 전송지연 시간이 증가한다.

 

 

97. TCP/IP 프로토콜 중 인터넷 계층에 대응하는 OSI 참조 모델의 계층은?

[정답율: 78%]

Physical Layer

Presentation Layer

Network Layer

Session Layer

 

 

81. IP(internet Protocol)의 설명 중 옳지 않은 것은?

[정답율: 43%]

비연결형 전송 서비스를 제공한다.

비신뢰성 전송 서비스를 제공한다.

데이터그램 이라는 데이터 전송형식을 갖는다.

스트림(stream) 전송 기능을 제공한다.

 

 

83. 다음이 설명하고 있는 데이터 교환 방식은?

[정답율: 43%]

메시지 교환 방식

공간분할 교환방식

가상회선 방식

데이터그램 방식

 

 

 

 

81. IP(internet Protocol)의 설명 중 옳지 않은 것은?

[정답율: 43%]

비연결형 전송 서비스를 제공한다.

비신뢰성 전송 서비스를 제공한다.

데이터그램 이라는 데이터 전송형식을 갖는다.

스트림(stream) 전송 기능을 제공한다.

 

 

88. Go-Back-N ARQSelective Repeat ARQ에 대한 설명으로 옳지 않은 것은?

[정답율: 40%]

Go-Back-N ARQ는 오류 발생 이후의 모든 프레임을 재요청 한다.

Selective Repeat ARQ는 버퍼의 사용량이 상대적으로 크다.

Go-Back-N ARQ는 프레임의 송신 순서와 수신 순서가 동일해야 수신이 가능하다.

Selective Repeat ARQ는 여러 개의 프레임을 묶어서 수신 확인을 한다.

 

 

89. LAN의 매체 접근 제어 방식인 CSMA/CD에 대한 설명으로 옳지 않은 것은?

[정답율: 20%]

버스 또는 트리 토플로지에서 가장 많이 사용되는 매체 접근 제어 방식이다.

각 호스트들이 전송매체에 경쟁적으로 데이터를 전송하는 방식이다.

토큰 패싱 방식에 비해 구현이 복잡하다.

프레임을 전송하면서 충돌여부를 조사한다.

 

 

 

94. HDLC(High-level Data Link Control) 정보 프레임의 용도 및 기능으로 가장 적합한 것은?

[정답율: 20%]

사용자 데이터 전달

흐름 제어

에러 제어

링크 제어

 

 

96. 점대점 링크를 통하여 인터넷 접속에 사용되는 프로토콜인 PPP(Point to Point Protocol)에 대한 설명으로 옳지 않은 것은?

[정답율: 15%]

재전송을 통한 오류 복구와 흐름제어 기능을 제공한다.

LCPNCP를 통하여 유용한 기능을 제공한다.

IP 패킷의 캡슐화를 제공한다.

동기식과 비동기식 회선 모두를 지원한다.

 

 

98. 회선교환과 패킷교환에 대한 설명으로 옳은 것은?

[정답율: 44%]

회선교환은 실시간 정송이 이루어지지 않는다.

패킷교환은 데이터 속도와 코드변환이 불가능하다.

회선교환은 호 설정 이후 에러 제어 기능을 제공한다.

패킷교환은 저장-전달 방식을 사용한다.

 

 

99. Stop-and-wait ARQ 방식에서 수신측이 4번 프레임에 대해 NAK를 보내왔다. 이에 대한 송신측의 행위로 옳은 것은?

[정답율: 46%]

1, 2, 3, 4번 프레임을 재전송 한다.

현재의 윈도우 크기만큼을 모두 전송한 후 4번 프레임을 재전송 한다.

5번 프레임부터 모두 재전송 한다.

4번 프레임만 재전송 한다.

 

 

82. OSI 7계층 중 암호화, 코드변환, 데이터 압축의 역할을 담당하는 계층은?

[정답율: 10%]

Data link Layer

Application Layer

Presentation Layer

Session Layer

 

 

83. 블루투스(Bluetooth)에 대한 설명으로 틀린 것은?

[정답율: 9%]

양방향 통신을 위해 FDD 방식을 사용한다.

2.4GHzISM 밴드를 이용한다.

회로 구성을 간략화 할 수 있다.

간섭에 비교적 강한 주파수 호핑 방식을 채용한다.

 

 

86. HTTP(Hyper Text Transfer Protocol)에 대한 설명으로 틀린 것은?

[정답율: 9%]

클라이언트 프로그램과 서버 프로그램으로 구현된다.

지속(persistent)연결과 비 지속(nonpersistent)연결 두 가지를 모두 허용한다.

HTTP 명세서 1.0(RFC 1945)1.6(RFC 2616)에서 HTTP의 메시지 형식을 정의한다.

WWW(World Wide Web)에서 데이터를 액세스하는데 이용되는 프로토콜이다.

 

 

93. 회선 교환(circuit switching)에 대한 설명으로 옳지 않은 것은?

[정답율: 43%]

송신스테이션과 수신스테이션 사이에 데이터를 전송하기 전에 먼저 교환기를 통해 물리적으로 연결이 이루어져야 한다.

음성이나 동영상과 같이 연속적이면서 실시간 전송이 요구되는 멀티미디어 전송 및 에러 제어와 복구에 적합하다.

현재 널리 사용되고 있는 전화시스템을 대표적인 예로 들 수 있다.

송신과 수신스테이션 간에 호 설정이 이루어지고 나면 항상 정보를 연속적으로 전송할 수 있는 전용 통신로가 제공되는 셈이다.

 

94. 비동기 전송에 대한 설명으로 틀린 것은?

[정답율: 45%]

비동기 전송에서 수신기는 자신의 클록 신호를 사용하여 회선을 샘플링하고 각 비트의 값을 읽어내는 방식이다.

문자 전송 시 맨 앞에 시작을 알리기 위한 start bit를 두고, 맨 뒤에는 종료를 알리는 stop bit를 둔다.

어떤 문자라도 전송되지 않을 때는 통신 회선은 휴지(idle) 상태가 된다.

송수신기의 클록 오차에 의한 오류 발생을 줄이기 위해 짧은 비트열은 전송하지 않음으로써 타이밍 오류를 피한다.

 

95. X.25 프로토콜의 계층 구조에 포함되지 않는 것은?

[정답율: 45%]

패킷 계층

링크 계층

물리 계층

네트워크 계층

 

 

96. IEEE 802 표준모델에 대해 옳게 연결된 것은?

[정답율: 41%]

802.2 ? 토큰버스

802.5 ? 토큰링

802.4 ? LLC

802.6 ? CSMA/CD

 

 

97. 프로토콜의 기본 구성 요소가 아닌 것은?

[정답율: 11%]

entity

syntax

semantic

timing

 

98. 협대역 ISDN에서 사용하는 D채널의 기능에 해당하는 것은?

[정답율: 11%]

회선 교환 방식을 위한 신호기능 정보의 전송

1536Kbps의 사용자 정보 전송

고속 팩시밀리, 화상 회의와 같은 고속정보 전송

패킷 교환방식에 의한 384Kbps 이하의 정보 전송

 

 

100. 다음 설명이 해당하는 다중접속방식은?

[정답율: 42%]

FDMA

CDMA

TDMA

SFMA

 

 

81. OSI-7계층 중 프로세스간의 대화 제어(dialogue control) 및 동기점(synchronization point)을 이용한 효율적인 데이터 복구를 제공하는 계층은?

[정답율: 67%]

Data Link layer

Network layer

Transport layer

Session layer

 

 

 

87. 다음이 설명하고 있는 것은?

[정답율: 21%]

핸드오프

모바일 IP

셀 채인지

헤더 변환

 

 

90. 외부 라우팅 프로토콜로서 AS(Autonomous System)간의 라우팅 테이블을 전달하는데 주로 이용되는 것은?

[정답율: 16%]

BGP

RIP

OSPF

LSA

 

 

95. 다중접속방식에 해당하지 않는 것은?

[정답율: 11%]

FDMA

SDMA

TDMA

CDMA

 

 

96. 데이터링크 프로토콜인 HDLC에서 프레임의 동기를 제공하기 위해 사용되는 구성 요소는?

[정답율: 20%]

플래그(Flag)

제어부(Control)

정보부(Information)

프레임 검사 시퀀스(Frame Check Sequence)

 

 

98. 도착한 메시지를 일단 저장한 후 다음 노드로 가는 링크가 비어 있으면 전송해 나가는 교환 방식은?

[정답율: 10%]

회선교환

메시지교환

데이터그램 패킷교환

가상회선 패킷교환

 

 

99. IEEE 802 표준에서는 데이터 링크 계층을 MAC, LLC 두 개의 부 계층으로 나누고 있다. 이 중에서 MAC 부 계층의 역할은?

[정답율: 56%]

논리적 주소의 결정

다른 통신망 형태에 프레임을 전송

상위계층과의 인터페이스

어느 노드에게 통신기회를 부여할 것인가를 결정

 

 

91. HDLC를 기반으로 하며, ISDND채널을 위한 링크 제어 프로토콜로 사용되는 것은?

[정답율: 23%]

LAP-B

LAP-M

LAP-D

LLC

 

 

92. ICMP(Internet Control Message Protocol)에 관한 설명으로 틀린 것은?

[정답율: 64%]

IP 프로토콜에서는 오류 보고와 수정을 위한 메커니즘이 없기 때문에 이를 보완하기 위해 설계되었다.

ICMP는 네트워크 계층 프로토콜이다.

ICMP 메시지는 하위 계층으로 가기 전에 IP 프로토콜 데이터그램 내에 캡슐화 된다.

ICMP 메시지는 4바이트의 헤더와 고정 길이의 데이터 영역으로 나뉜다.

 

93. RTCP(Real-Time Control Protocol)의 특징으로 옳지 않은 것은?

[정답율: 23%]

Session의 모든 참여자에게 컨트롤 패킷을 주기적으로 전송한다.

RTCP 패킷은 항상 16비트의 경계로 끝난다.

하위 프로토콜은 데이터 패킷과 컨트롤 패킷의 멀티플렉싱을 제공한다.

데이터 전송을 모니터링하고 최소한의 제어와 인증 기능을 제공한다.

 

94. IEEE 802.4의 표준안 내용으로 옳은 것은?

[정답율: 11%]

토큰 버스 LAN

토큰 링 LAN

CSMA/CD LAN

무선 LAN

 

95. 일반적으로 동기식 시분할 다중화 방식에서 음성전화 채널 당 8bit씩 매 125마다 할당한다면 데이터 전송률은?

[정답율: 21%]

32kbps

64kbps

1kbps

10kbps

 

 

 

96. X.25 프로토콜에 대한 설명으로 틀린 것은?

[정답율: 66%]

ITU-T에서는 1976년 패킷 교환망을 위한 표준 프로토콜인 X.25 권고안을 처음으로 발간하였다.

패킷형 단말기를 패킷 교환망에 접속하기 위한 인터페이스 프로토콜이다.

물리 계층과 링크 계층, 패킷 계층이라는 3개의 계층으로 구성되어 있다.

X.25에서는 가상회선을 가상 호와 반영구 가상회선의 두 가지로 나누어서 정의하며, 모든 패킷은 최소 1옥텟의 헤더를 가진다.

 

 

98. 채널용량(Channel Capacity)에 대한 설명으로 틀린 것은?

[정답율: 16%]

정해진 오류 발생률 내에서 채널을 통해 최대로 전송할 수 있는 정보의 양을 의미한다.

측정 단위는 초당 전송되는 비트수(bps)로 나타낸다.

샤논(Shannon)은 채널용량을 으로 나타내었다.

채널을 통해서 보내지는 데이터의 양은 그 채널의 대역폭(Bandwidth )과 비례한다.

 

 

99. 다음 중 TCP 헤더에 포함되는 정보가 아닌 것은?

[정답율: 14%]

긴급 포인터

호스트 주소

순서 번호

체크섬

 

 

88. HDLC 에서 사용되는 프레임의 유형이 아닌 것은?

[정답율: 10%]

Information Frame

Supervisory Frame

Unnumbered Frame

Control Frame

 

 

90. 패킷 교환 방식 중 가상 회선 방식에 대한 설명으로 옳은 것은?

[정답율: 6%]

네트워크 내의 노드나 링크가 파괴되거나 상실되면 다른 경로를 이용한 전송이 가능하므로 유연성을 갖는다.

경로 설정에 시간이 소요되지 않으므로 한 스테이션에서 소수의 패킷을 보내는 경우에 유리하다.

매 패킷 단위로 경로를 설정하기 때문에 네트워크의 혼잡이나 교착 상태에 보다 신속하게 대처한다.

패킷들은 결오가 설정된 후 경로에 따라 순서적으로 전송되는 방식이다.

 

 

 

91. 토큰링 방식에 사용되는 네트워크 표준안은?

[정답율: 10%]

IEEE 802.2

IEEE 802.3

IEEE 802.5

IEEE 802.6

 

 

93. TCP/IP 모델에 해당하는 계층이 아닌 것은?

[정답율: 10%]

Network Access

Transport

Application

Session

 

 

95. TCP/IP 모델의 인터넷계층에 대한 설명으로 틀린 것은?

[정답율: 10%]

IP프로토콜을 사용한다.

경로선택과 독주제어 기능을 수행한다.

최선형의 비연결형 패킷 전달 서비스를 제공한다.

End to End의 통신서비스를 제공한다.

 

 

98. 라우팅 프로토콜인 OSPF(Open Shortest Path First)에 대한 설명으로 옳지 않은 것은?

[정답율: 14%]

OSPF 라우터는 자신의 경로 테이블에 대한 정보를 LSA라는 자료구조를 통하여 주기적으로 혹은 라우터의 상태가 변화되었을 때 전송한다.

라우터 간에 변경된 최소한의 부분만을 교환하므로 망의 효율을 저하시키지 않는다.

도메인내의 라우팅 프로토콜로서 RIP가 가지고 있는 여러 단점을 해결하고 있다.

경로수(Hop)16으로 제한되어 있어 대규모 네트워킹에 부적합하다.



82.LAN의 매체 접근 제어 방식인 CSMA/CD에 대한 설명으로 틀린 것은? 
[정답율: 24%]
① 버스 또는 트리 토폴로지에서 가장 많이 사용되는 매체 접근 제어 방식이다.
② MA(Multiple Access)는 네트워크가 비어 있으면 누구든지 사용 가능하다.
③ CS(Carrier Sense)는 네트워크에 데이터를 실어 보내는 기능을 담당한다.
④ CD(Collision Detection)는 프레임을 전송하면서 충돌 여부를 조사한다.
83.호스트의 물리 주소를 통하여 논리 주소인 IP 주소를 얻어오기 위해 사용되는 프로토콜은? 
[정답율: 20%]
① ICMP
② IGMP
③ ARP
④ RARP
84.핸드오프(Hand-off)시에 사용할 채널을 먼저 확보하여 연결한 후, 현재 사용 중인 채널의 연결을 끊는 방식은? 
[정답율: 48%]
① Soft Hand-off
② Hard Hand-off
③ Mobile Controlled Hand-off
④ Network Controlled Hand-off
85.다음은 OSI(Open System Interconnection) 7계층 중 어떤 계층에 대한 설명인가?
 
[정답율: 15%]
① 물리 계층
② 데이터 링크 계층
③ 전송 계층
④ 네트워크 계층

 

 

88.다음이 설명하고 있는 데이터 링크 제어 프로토콜은?
 
[정답율: 11%]
① HDLC
② PPP
③ LAPB
④ LLC

90.

전송 매체상의 전송 프레임마다 해당 채널의 시간 슬롯이 고정적으로 할당되는 다중화 방식은? 
[정답율: 18%]
① 주파수 분할 다중화
② 동기식 시분할 다중화
③ 통계적 시분할 다중화
④ 코드 분할 다중화

 

93.최초의 라디오 패킷(radio packet) 통신방식을 적용한 컴퓨터 네트워크 시스템은? 
[정답율: 15%]
① DECNET
② ALOHA
③ SNA
④ ARPANET


99.데이터 전송에 있어 데이터 그램 패킷 교환 방식으로 적합한 것은?w 
[정답율: 28%]
① 음성이나 동영상과 같이 연속적인 전송
② 응답시간이 별 문제가 되지 않는 전자 우편이나 파일 전송
③ 간헐적으로 발생하는 짧은 메시지의 전송
④ 최대 길이가 제한된 데이터 전송
100.HDLC(High-level Data Link Control)의 정보 프레임에 대한 용도 및 기능으로 가장 적합한 것은? 
[정답율: 50%]
① 사용자 데이터 전달
② 흐름 제어
③ 에러제어
④ 링크제어


반응형

'Busan IT > 정보처리기사' 카테고리의 다른 글

2015년 3회 정보처리기사 후기  (1) 2015.10.23
Posted by newind2000
Busan IT/공장내 Network2015. 8. 13. 17:04

==================================Outline====================================

Hacker School level 1

VMware 해커스쿨 서버 설치

----------------------------------------------------------------------------

 

C에서 네트워크를 구현하는 방식은 select함수를 사용하면 된다.

 

select 함수의 인자에 fd_set이라는 구조체가 필요하다

 

 

....에서 해커스쿨 해킹 트레이닝을 해보자.

 

Hacker School level 1


ID: level1 / PS: level1으로 접속한다.

 

 

ls -al 명령어를 사용하여 파일과 디렉토리를 확인해보면 'hint'라는 파일이 눈에 들어온다.

 

이 파일을 cat'명령어로 열어보자.

 

 

level2권한이 있는 파일을 찾기 위해서는 검색이 필요하다.

 

ls -alR / 2 >/dev/null | grep level2명령어를 사용하여 level2가 있는 폴더를 검색해보자.

 

 

 

 

 

필요 없는 목록이 보고 싶지 않다면 2>/dev/null'를 사용하면 된다.

 

해당 파일을 실행 시킨다.

원하는 명령은 bash를 입력하고 level2의 비밀번호를 알아내기 위해 my-pass를 입력한다.

 

 

그리하면 level2의 비밀번호인 "hacker or cracker"가 나온다.

 

 

VMware 해커스쿨 서버 설치

 

VMware를 사용하여 해커스쿨 서버를 설치해보자. VMware Workstation을 실행시킨다.

 

File -> Open에서,

 

 

압축을 푼 WMware_FHZ서버에 있는 Red Hat Linux.vmx를 선택한다.

 

 

초록색 플레이 버튼을 눌러 실행시킨다.

 

 

 

서버를 실행시킨 후 비밀번호를 설정해 주자.

 

 

비밀번호 변동 명령어는 passwd이다.

 

 

네트워크 설정을 위해 setting으로 들어간다.

 

 

네트워크 어댑터에서 bridged에 체크 표시를 해준다. 이것을 통해 가상 머신은 물리적 네트워크에 접속할 수 있는 권한을 갖는다.

 

 

'setup'명령으로 가상 머신에 네트워크 설정을 해주자.

 

아래와 같이 설정을 해주고 'OK'를 눌러준다.

 

네트워크 설정이 바로 적용되지 않음으로 '/etc/init.d/network restart' 명령어를 사용하여 네트워크를 재시작 시켜준다.

 

‘ping' 명령어를 사용하여 네트워크가 제대로 동작하는지 확인한다.

 

 

이제 설정이 끝났으니 윈도우에서 도스명령어창을 실행하여 가상머신으로 만든 hacker school에 접속해보자!

 

아주 잘 된다!

반응형
Posted by newind2000