Make 사용하기

김상우·2022년 7월 5일
0

Docker

목록 보기
7/8
post-thumbnail

지난 포스트에서 Make / Makefile을 공부해보았다.
그래서 이번에는 Makefile을 간단하게 작성해보았다.

make 할 파일 작성

tcp 통신을 make 해보기 위해 폴더를 따로 생성하고 소스를 작성했다.

  • 사전 작업
mkdir study
apt-get install g++
cd study
  • tcp 통신 소스 작성
#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;
}

위 소스는 c++파일로 수업 때 tcp 통신을 했던 기억이 있어 그 당시 사용했던 소스를 다시 활용했다.

  • Makefile 작성
# Makefile

CC = g++

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

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

clean :
    rm -rf *.o

앞서 말한 것처럼 c++로 소스를 작성했기 때문에 그에 맞는 컴파일러인 g++로 컴파일을 할 수 있게 했다.

  • make 실행 후 디렉토리 확인
make
ls -la

ls -al 명령어로 확인해보면 이렇게 tcp_server.exe와 tcp_server.o파일이 생성된 것을 확인할 수 있다.

이번에 진행해본 것은 Makefile로 컴파일을 하나의 소스만 했기 때문에 .o 파일이 하나만 생성 되었지만, 여러개의 소스를 한번에 컴파일한다면 그 만큼의 .o 파일이 생성될 것이다. 이럴 땐 Makefile에 clean을 정의했기 때문에 make clean 명령어를 입력하면 삭제된다.

  • make clean 후 확인
make clean
ls -al


.o 파일이 삭제된 것을 확인했다. 마지막으로 .exe 파일을 실행해 보았다.

  • 컴파일 후 생성된 실행파일 실행
./tcp_server.exe


tcp 통신이 가능한지 확인할 수단을 마련하지 않고 실행해버려서 그냥 http로 접속을 시도한 모습이며, 접속이 된 것을 확인할 수 있었다.

다음은 udp 통신으로 시도해볼 예정이다.

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

0개의 댓글