UDP 통신

김상우·2022년 7월 6일
0

Docker

목록 보기
8/8
post-thumbnail

지난번 포스트에서는 tcp로 통신하는 c++ 소스를 작성하고 makefile을 작성하여 컴파일했다.
이번 포스트에서는 tcp 통신이 아닌 udp 통신으로 소스를 작성해 보았다.

파일 생성

  • 파일 생성
cd /study
vim udp_server.cpp
  • udp 통신 소스 작성
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define BUF_SIZE 50
#define MAX_BUF 32
using namespace std;

int main(int argc, char*argv[])
{
	int server_fd, client_fd;
	char buffer[BUF_SIZE], sendbuf[BUF_SIZE];
	struct sockaddr_in server_addr, client_addr;
	char temp[20];
	int msg_size;
	socklen_t len;
	
	if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 1)
	{
		cout << "Server : Can't open stream socket \n";
		exit(0);
	}
	
	memset(&server_addr, 0x00, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	server_addr.sin_port = htons(9000);
	
	if(bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0)
	{
		cout << "Server : Can't bind local address.\n";
		exit(0);
	}
	if(listen(server_fd, 5) < 0)
	{
		cout << "Server : Can't listening connect.\n";
		exit(0);
	}
	memset(buffer, 0x00, sizeof(buffer));
	len = sizeof(client_addr);
	cout << "Server : waiting connection request.\n";
	client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &len);
	inet_ntop(AF_INET, &client_addr.sin_addr.s_addr, temp, sizeof(temp));
	
	cout << "Server : %s client connected.\n", temp;
	
	while(1)
	{
		if(client_fd < 0)
		{
			cout << "Server : accept failed.\n";
			return 0;
		}
		msg_size = read(client_fd, buffer, 1024);
		
		sprintf(sendbuf, buffer, "->msg rcv\n");
		cout << buffer << endl;
		
		if(!strncmp(buffer, "fin", 3))
		{
			cout << "fin\n";
			sprintf(sendbuf, buffer, "->msg fin rv\n");
			close(server_fd);
			return 0;
		}
		
		if(send(client_fd, sendbuf, strlen(sendbuf), 0) < 0)
		{
			if(write(client_fd, sendbuf, strlen(sendbuf)) < 0)
			{
				puts("Send failed");
				return 1;
			}
		}
		memset(buffer, 0x00, sizeof(buffer));
		memset(sendbuf, 0x00, sizeof(sendbuf));
	}
	close(server_fd);
	return 0;
}

tcp 통신과 마찬가지로 수업시간에 활용했던 기억을 더듬어 udp로 통신하는 소스를 작성했다.

  • Makefile 수정
# Makefile

CC = g++

# tcp_server.exe : tcp_server.o
#    g++ -g tcp_server.o -o tcp_server.exe

udp_server.exe : udp_server.o
	g++ -g udp_server.o -o udp_server.exe

# tcp_server.o : tcp_server.cpp
#    g++ -c tcp_server.cpp

udp_server.o : udp_server.cpp
	g++ -c udp_server.cpp

clean :
    rm -rf *.o

tcp 파일을 컴파일 하기 위해 작성했던 Makefile을 수정했다.
tcp 관련 문장은 모두 주석처리 후 udp 파일에 대한 컴파일 과정을 작성했다.

  • 실행 결과
make
make clean
./udp_server.exe

컴파일 후 생성된 목적파일을 제거한 후 실행파일을 실행했다.

사진에서 보이는 것처럼 같은 노트북에서 http로localhost:9000으로 접속하여 연결을 확인했고, 포트는 tcp와 똑같은 9000번으로 설정했기 때문에 지난 포스트와 동일한 것처럼 보일 것이다. 오늘의 것을 실행하기 전 tcp를 실행하지 않았기 때문에 9000번 포트는 사용하지 않는 상태였다.

profile
아침엔 운동하고 밤엔 잠을 잔다.

0개의 댓글