Super Kawaii Cute Cat Kaoani
본문 바로가기
💾 lecture/컴퓨터 네트워크

컴퓨터 네트워크 과제 UDP Echo server 구현

by wonee1 2024. 6. 5.
728x90

 
 
클라이언트가 보낸 메시지를 그대로 수신해주는 에코 프로그램을 구현
 
 
 
 
클라이언트가 Hello world!, This is me! 등의 문자열을 입력하면, 이를 서버가 수신하여 화면에 출력한 후, 다시 이를 그대로 클라이언트로 회신하여 클라이언트가 이를 다시 화면에 출력해주는 프로그램을 구현한다
 


 
 
 
구현코드 
 
 
client.c 

#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
int readline ( int fd, char *ptr, int maxlen )
{
   int n, rc;
   char c;
   for(n=1; n<maxlen; n++){
      if ( (rc = read(fd, &c, 1)) == 1 ){
         *ptr ++ = c;
         if ( c == '\n' ) break;
      } else if ( rc == 0 ){
         if ( n == 1 ) return 0;
         else break;
      }
   }

   *ptr = 0;
   return n;
}

int main(int argc, char *argv[]) {
	if ( argc < 2 ){
	 printf("Input : %s port number\n", argv[0]);
	 return 1;
	}

	int SERVER_PORT = atoi(argv[1]);
  /* localhost에서 통신할 것이므로 서버 ip주소도 그냥 localhost */
	const char* server_name = "localhost"; // 127.0.0.1
	struct sockaddr_in srv_addr; // Create socket structure
	memset(&srv_addr, 0, sizeof(srv_addr)); // Initialize memory space with zeros
	srv_addr.sin_family = AF_INET; // IPv4
	srv_addr.sin_port = htons(SERVER_PORT);
	inet_pton(AF_INET, server_name, &srv_addr.sin_addr);  // Convert IP addr. to binary


	int sock;
	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
		printf("Could not create socket\n");
		exit(1);
	}

	int n = 0;
	int maxlen = 1024;
	char RecvBuffer[maxlen];
  char SendBuffer[maxlen];

  struct sockaddr_in cli_addr;
  int cli_addr_len = sizeof(cli_addr);

	while(1){
		if ( readline(0, SendBuffer, maxlen) > 0 ){
			/*  Put sendto() here */
			sendto(sock, &SendBuffer, sizeof(SendBuffer), 0, (struct sockaddr*)&(srv_addr), sizeof(srv_addr));
		}

    /*  Put recvfrom() here */
		n = recvfrom(sock, &RecvBuffer, sizeof(RecvBuffer), 0, (struct sockaddr*)&(cli_addr), &cli_addr_len);
		if (n > 0) {
			RecvBuffer[n] = '\0'; // Null
			printf("%s", RecvBuffer);
		}
	}

	close(sock);
	return 0;
}

 
 
 
 
 
server.c
 

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
	if ( argc < 2 ){
	 printf("Input : %s port number\n", argv[0]);
	 return 1;
	}

	int SERVER_PORT = atoi(argv[1]);

	struct sockaddr_in srv_addr;
	memset(&srv_addr, 0, sizeof(srv_addr));
	srv_addr.sin_family = AF_INET;
	srv_addr.sin_port = htons(SERVER_PORT);
	srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

	int sock;
	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
		printf("Could not create listen socket\n");
		exit(1);
	}

	if ((bind(sock, (struct sockaddr *)&srv_addr, sizeof(srv_addr))) < 0) {
		printf("Could not bind socket\n");
		exit(1);
	}


  struct sockaddr_in cli_addr;
  int cli_addr_len = sizeof(cli_addr);

	int  maxlen = 1024;
	int n = 0;
	char RecvBuffer[maxlen];

	while (1) {
		/*  Put recvfrom() here */
		int n = recvfrom(sock, &RecvBuffer, sizeof(RecvBuffer), 0, (struct sockaddr*)&cli_addr, &cli_addr_len);
		if (n > 0) {
			RecvBuffer[n] = '\0'; // Null-terminate the received string
			printf("%s", RecvBuffer);

			sendto(sock, &RecvBuffer, sizeof(RecvBuffer), 0, (struct sockaddr*)&cli_addr, sizeof(cli_addr));
		}
	}
	close(sock);

	return 0;
}

 
 
 
 


 
 
 
☑️결과 

client 결과 

 
 
 

 

server 결과 

728x90