관리 메뉴

드럼치는 프로그래머

[TCP/IP] Echo (에코) 프로그램 Client (리눅스) 본문

★─Programing/☆─TCP IP

[TCP/IP] Echo (에코) 프로그램 Client (리눅스)

드럼치는한동이 2008. 12. 13. 05:11

Echo (에코) 프로그램 Client (리눅스)

/* 헤더파일 선언 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

#define BUFSIZE 1024        // 메시지를 저장할 크기를 정의.
void error_handling(char *message);     // error_handling 함수 프로토타입 선언.

/* main 함수 */
int main(int argc, char **argv)      // ip주소와 port정보를 인자로 받음.
{
 int sock;          // 소켓생성 디스크립터를 저장할 변수.
 char message[BUFSIZE];       // 메시지를 저장할 배열선언.
 int str_len;         // 수신받은 데이터의 크기를 저장할 변수선언.
 struct sockaddr_in serv_addr;     // server의 주소정보를 저장할 구조체변수선언.

 if(argc != 3) {         // ip주소와 port정보가 올바르지않다면 if문 실행.
  printf("Usage : %s <IP> <port> \n", argv[0]);// error정보 출력.
  exit(1);         // 프로그램 강제종료.
 }

 sock = socket(PF_INET, SOCK_STREAM, 0);   // 소켓 생성.
 if(sock == -1)         // 소켓 생성 실패 if문 실행.
  error_handling("socket() error");   // error_handling 함수 실행.

 memset(&serv_addr, 0, sizeof(serv_addr));  // 인자로 전달된 구조체 변수를 0으로 초기화.
 serv_addr.sin_family = AF_INET;     // 프로토콜 체계 설정.
 serv_addr.sin_addr.s_addr = inet_addr(argv[1]); // 네트워크 바이트 순서 -> 32비트 ip값으로 변환.
 serv_addr.sin_port = htons(atoi(argv[2]));  // port정보를 네트워크 바이트 순서로 변환.

 if( connect(sock, (struct sockaddr*) &serv_addr,// 서버로 연결 요청, 연결 요청 실패시 -1 리턴.
  sizeof(serv_addr)) == -1) error_handling("connect() error!"); // error_handling 함수 실행.

 while(1) {          // 반복문 실행.
  /* 메시지 입력, 전송 */
  fputs("전송할 메시지를 입력하세요 (q to quit) : ", stdout); // fputs 함수로 출력.
  fgets(message, BUFSIZE, stdin);    // fgets 함수로 메시지 입력받음.
  
  if(!strcmp(message, "q\n")) break;   // 입력과 "q\n"이 같다면 반복문 탈출.
  write(sock, message, strlen(message));  // 입력받은 메시지 전송.

  /* 메시지 수신, 출력 */
  str_len = read(sock, message, BUFSIZE-1); // 메시지를 수신받아 그 크기를 리턴.
  message[str_len] = 0;      // 메시지의 크기만큼의 배열 마지막 0 (널)으로 초기화.
  printf("서버로부터 전송된 메시지 : %s \n", message); // printf함수로 출력.
  }
 
 close(sock);         // 연결 종료.
  
 return 0;          // 프로그램 정상종료.
}
 
/* error_handling 함수 */
void error_handling(char *message)     // 오류메시지를 매개변수로 전달받아 실행.
{
 fputs(message, stderr);       // 오류메시지를 출력.
 fputc('\n', stderr);
 exit(1);          // 프로그램 강제종료.
}

Comments