Busan IT/공장내 Network2015. 7. 15. 16:16

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

Echo Server

Echo Client

makefile

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


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);
  char cBuff[Buf_Size];
  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);

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


Echo Client

/*** 소스 ***/


#include "smartsock.h"

int main(void)
{
  struct sockaddr_in stAddr;
  int iSock;
  int iRet;
  char cBuff[Buf_Size];
  socklen_t uiSockLen=sizeof(struct sockaddr);

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

  read(iSock, cBuff, MSG_Size); 
  printf("[server]: [%s]\n", cBuff);
  
  while(1)
  {

    iRet = read(0, cBuff, MSG_Size);
    cBuff[iRet-1= 0;
    write(iSock, cBuff, MSG_Size);
    read(iSock, cBuff, MSG_Size);
    printf("[server]: [%s]\n", cBuff);

    if(0 == strncmp(MSG_END, cBuff, strlen(MSG_END)))
      break;
  }
  close(iSock);
  return 0;
}


smartsock.h


/*** 소스 ***/

#ifndef __SMARTSOCK_H__
#define __SMARTSOCK_H__
#include <stdio.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <sys/stat.h>
#include <unistd.h>             //read&write 함수
#include <netinet/in.h>         
#include <arpa/inet.h>          
#include <stdlib.h>
#include <string.h>             
#include <errno.h>              //error 출력
#include <strings.h>            //bzero 함수

#define PORT 7777
#define IP "192.168.0.173"
#define MSG_Size 255      //버퍼 사이즈 정의
#define Buf_Size (MSG_Size+1

#define MSG_END "quit"

#endif // __SMARTSOCK_H__


makefile


/*** 소스 ***/


CC = gcc

CTRG = client

STRG = server

SSRC = server.c

CSRC = client.c

CFLAGS = --save-temps

all: ser cli

rebuild: clean all

ser:
  @$(CC) $(CFLAGS) -o $(STRG) $(SSRC)

cli:
  @$(CC) $(CFLAGS) -o $(CTRG) $(CSRC)

clean:
  @rm -rf $(STRG) $(STRG).o $(STRG).i $(STRG).s
  @rm -rf $(CTRG) $(CTRG).o $(CTRG).i $(CTRG).s

  
  



Packet Analyzer를 만들어보자.

netinet/in.h에 있는 파일을 들어가서 0번부터 17번까지 스위치문으로 정의해보자.




반응형

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

TCP analyzer(진행 중)  (0) 2015.07.17
TCP 추출(진행중)  (0) 2015.07.16
Echo Server, Echo Client(진행 중)  (0) 2015.07.14
Server/Client socket 프로그램 만들기  (0) 2015.07.13
소켓 연결  (0) 2015.07.07
Posted by newind2000