Busan IT/공장내 Network2015. 7. 14. 17:36

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

Echo Server

Echo Client(진행 중)

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

Echo Server

 

listen 함수 인자에 소켓 번호와 backlog(동시 접속자 대기수)를 지정해 준다.

 

 

accept 함수 인자에 소켓 번호와 사용자의 접속 정보를 담을 구조체, 그리고 그 구조체의 크기를 넣어준다.

 

accept함수는 scanf처럼 입력 값이 있을 때까지 프로그램의 흐름을 멈추게 한다.

 

accept함수까지 완성한 후에 실행시켜보자. accept함수를 통과했는지 확인하기 위해 printf를 사용하여 'Incoming Client'라는 문자열을 넣어주자.

 

프로그램을 실행 시킨 후 도스 커맨트 창을 띄워서 'telnet_IP_PORT#'를 넣어주면 프로그램이 accept함수를 수행하고 다음 단계로 넘어갔음을 알 수 있다.

client가 접속하여 accept가 되면 접속한 client의 IP와 PORT번호를 출력하고 입력하는 값이 그대로 다시 전송되게 하는 echo server를 만들어보자.

/*** 소스 ***/

#include "smartsock.h"

int main(void)
{
    int iSock;   //소켓 함수의 반환 값을 받는 변수
  int icSock;   //accept의 반환 값을 받는 변수
    int iRet;
    struct sockaddr_in stAddr;
  socklen_t uiSockLen=sizeof(struct sockaddr);
  unsigned char ucBuff;
  const char * cP;

    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;
  }

  icSock = accept(iSock, (struct sockaddr *)&stAddr, &uiSockLen); //접속자의 정보가 stAddr에 입력된다.

  if(icSock < 0)
  {
        perror("Accept : ");
        close(iSock);

        return -4;
  }

  close(iSock);
  write(icSock, "Go to hell..."sizeof("Go to hell..."));

  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));  
  

  while(1)
  {
    /*** echo server ***/
    read(icSock, &ucBuff, 1);
    write(icSock, &ucBuff, 1);
    if('Q' == ucBuff)
    {
      break;
    }
  }

  close(icSock);
    return 0;
}

 

 

 

 

echo: telnet에서 읽어들인 문자를 다시 전송한다.

 


 

 

Echo Client

 

Server의 코딩을 참조하여 socket생성, sockaddr_in 구조체 세팅, connect 함수를 만들어보자.




/*** 소스 ***/

#include "smart_socket.h"

int main(void)
{
  struct sockaddr_in sockAddr;
  int iSock;
  int iRet;
  
  iSock = socket(AF_INET, SOCK_STREAM, 0);
  if(0 > iSock)
  {
    perror("socket : ");
    return -1;
  }

  bzero(&stAddr, sizeof(stAddr));
  stAddr.sin_family = AF_INET;
  stAddr.sin_addr.s_addr = inet_addr(IP);
  stAddr.sin_port = htons((PORT));

  iRet = connect(iSock, (struct sockaddr *)&stAddr, &uiSockLen);
  if(0 > iRet)
  {
    perror("connect : ");
    return -2;
  }
    return 0;
}

반응형

'Busan IT > 공장내 Network' 카테고리의 다른 글

TCP 추출(진행중)  (0) 2015.07.16
Echo Server/Client  (0) 2015.07.15
Server/Client socket 프로그램 만들기  (0) 2015.07.13
소켓 연결  (0) 2015.07.07
네트워크 연결  (0) 2015.07.06
Posted by newind2000