[TCP/IP] Iterative 에코서버, 에코 클라이언트

2021. 9. 18. 17:07·Backend/Network

+ 에코 서버 : 클라이언트가 전송하는 문자열 데이터를 그대로 전송하는, 말 그대로 문자열 데이터를 에코시키는 서버


# 프로그램 기본 동작 방식

- 서버는 한 순간에 하나의 클라이언트와 연결되어 에코 서비스를 제공한다.

- 서버는 총 다섯 개의 클라이언트에게 순차적으로 서비스를 제공하고 종료한다.

- 클라이언트는 프로그램 사용자로부터 문자열 데이터를 입력 받아서 서버에 전송한다.

- 서버는 전송 받은 문자열 데이터를 클라이언트에게 재전송한다. 즉, 에코 시킨다

- 서버와 클라이어튼간의 문자열 에코는 클라이언트가 Q를 입력할 때까지 계속한다.

 

# echo_server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 1024
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int sock;
	char message[BUF_SIZE];
	int str_len;
	struct sockaddr_in serv_adr;

	if(argc!=3) {
	        printf("Usage : %s <IP> <port>\n", argv[0]);
	        exit(1);
	}
	
	sock=socket(PF_INET, SOCK_STREAM, 0);   
	if(sock==-1)
		error_handling("socket() error");
	
	memset(&serv_adr, 0, sizeof(serv_adr));
	serv_adr.sin_family=AF_INET;
	serv_adr.sin_addr.s_addr=inet_addr(argv[1]);
	serv_adr.sin_port=htons(atoi(argv[2]));
	
	if(connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1)
		error_handling("connect() error!");
	else
		puts("Connected...........");
	while(1)
	{
		fputs("Input message(Q to quit): ", stdout);
		fgets(message, BUF_SIZE, stdin);
		if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))
			break;
		write(sock, message, strlen(message));
		str_len=read(sock, message, BUF_SIZE-1);
		message[str_len]=0;
		printf("Message from server: %s", message);
		printf("str_len : %d\n",str_len);
	}
	
	close(sock);
	return 0;
}

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

 

# echo_client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 1024
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int sock;
	char message[BUF_SIZE];
	int str_len;
	struct sockaddr_in serv_adr;

	if(argc!=3) {
	        printf("Usage : %s <IP> <port>\n", argv[0]);
	        exit(1);
	}
	
	sock=socket(PF_INET, SOCK_STREAM, 0);   
	if(sock==-1)
		error_handling("socket() error");
	
	memset(&serv_adr, 0, sizeof(serv_adr));
	serv_adr.sin_family=AF_INET;
	serv_adr.sin_addr.s_addr=inet_addr(argv[1]);
	serv_adr.sin_port=htons(atoi(argv[2]));
	
	if(connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1)
		error_handling("connect() error!");
	else
		puts("Connected...........");
	while(1)
	{
		fputs("Input message(Q to quit): ", stdout);
		fgets(message, BUF_SIZE, stdin);
		if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))
			break;
		write(sock, message, strlen(message));
		str_len=read(sock, message, BUF_SIZE-1);
		message[str_len]=0;
		printf("Message from server: %s", message);
		printf("str_len : %d\n",str_len);
	}
	
	close(sock);
	return 0;
}

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

# 실행화면

'Backend > Network' 카테고리의 다른 글

[TCP/IP] TCP와 UDP  (0) 2021.09.18
[TCP/IP] 리눅스 저수준 파일 입출력과 파일 디스크립터  (0) 2021.09.05
[TCP/IP] 리눅스 환경에서 C언어로 Hello World 서버/클라이언트 구현하기  (0) 2021.09.05
[TCP_IP] VMware 설치방법  (0) 2021.08.30
'Backend/Network' 카테고리의 다른 글
  • [TCP/IP] TCP와 UDP
  • [TCP/IP] 리눅스 저수준 파일 입출력과 파일 디스크립터
  • [TCP/IP] 리눅스 환경에서 C언어로 Hello World 서버/클라이언트 구현하기
  • [TCP_IP] VMware 설치방법
min_sol
min_sol
  • min_sol
    비글개발연구소🐾
    min_sol
  • 전체
    오늘
    어제
    • 분류 전체보기 (281)
      • Programming (128)
        • Algorithm (52)
        • JAVA (40)
        • GIS (5)
        • PyQt (10)
        • C# (11)
        • Mobile (6)
        • AI (4)
      • Backend (38)
        • Spring (16)
        • JSP (11)
        • Network (5)
      • Frontend (29)
        • React (11)
        • Vue (13)
        • Next.js (4)
      • Database (10)
        • PostgreSQL (1)
        • Oracle (8)
        • Elasticsearch (1)
      • DevOps (8)
        • Linux (7)
        • Mac (1)
      • Tools (32)
        • IntelliJ (1)
        • VSCode (1)
        • GitHub (10)
        • RPA (20)
      • Security (9)
      • etc (22)
        • ERROR (5)
        • 세미나 | 교육 (11)
        • 자격증 (1)
        • 일상 (2)
        • 2021 (2)
  • 인기 글

  • 태그

    Java
    명품자바에센셜
    생능출판
    PyQt
    RPA
    코딩테스트
    계산기
    이클립스
    자동화
    vue.js
    백준
    VUE
    연습문제
    자료구조
    PyQt5
    spring
    jsp
    알고리즘
    자바
    스윙
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
min_sol
[TCP/IP] Iterative 에코서버, 에코 클라이언트
상단으로

티스토리툴바