본문 바로가기

네트워크/리눅스 기반 강의

2010년 12월 13일 월요일 (TCP/IP 기초)

리눅스 기반 네트워크 프로그래밍
강사 : 강정열


서버 소스
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

void error_handle(char *message);

int main()
{
  int serv_sock;
  int clnt_sock;
  int clnt_addr_size;
  char message[]="Hello World! \n";
  
  struct sockaddr_in serv_addr;
  struct sockaddr_in clnt_addr;

  /* Server Socket */
  serv_sock = socket(PF_INET, SOCK_STREAM, 0);
  if(serv_sock == -1)
  {
    error_handle("소켓 생성 에러");
  }
  memset(&serv_addr, 0sizeof(serv_addr));
  serv_addr.sin_family=AF_INET;
  serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
  serv_addr.sin_port=htons(9190);   // 포트설정

  /* Socket Address */
  if(bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
  {
    error_handle("주소 할당 에러");
  }

  /* 연결 요청 대기상태로 진입 */
  if(listen(serv_sock, 5== -1)
  {
    error_handle("연결 요청 대기 에러");
  }

  /* 연결 요청 수락 */
  clnt_addr_size = sizeof(clnt_addr);
  clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr, &clnt_addr_size);
  if(clnt_sock == -1)
  {
    error_handle("연결 요청 수락 에러");
  }
  
  /* Data Send */
  write(clnt_sock, message, sizeof(message));

  /* 연결 종료 */
  close(clnt_sock);
  return 0;
}

void error_handle(char* message)
{
  fputs(message, stderr);
  fputc('\n', stderr);
  exit(1);
}
클라이언트 소스
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

void error_handle(char *message);

int main()
{
  int iSock;
  int str_len;
  char message[30];
  struct sockaddr_in serv_addr;
  
  /* Server Socket */
  iSock = socket(PF_INET, SOCK_STREAM, 0);
  if(iSock == -1)
  {
    error_handle("소켓 생성 에러");
  }
  memset(&serv_addr, 0sizeof(serv_addr));
  serv_addr.sin_family=AF_INET;
  serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");   // 서버주소
  serv_addr.sin_port=htons(9190);   // 포트설정(서버와 같은 포트가 되야한다.)

  /* 서버 연결 요청 */
  if(connect(iSock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
  {
    error_handle("서버 연결 요청 에러");
  }
  
  /* Data Receive */
  str_len=read(iSock, message, sizeof(message)-1);
  if(str_len == -1)
  {
    error_handle("데이터 수신 실패");
  }
  message[str_len]=0;
  printf("Message from server : %s \n", message);
  
  /* 연결 종료 */
  close(iSock);
  
  return 0;
}

void error_handle(char* message)
{
  fputs(message, stderr);
  fputc('\n', stderr);
  exit(1);
}