지난 포스트에서 Make / Makefile을 공부해보았다.
그래서 이번에는 Makefile을 간단하게 작성해보았다.
tcp 통신을 make 해보기 위해 폴더를 따로 생성하고 소스를 작성했다.
mkdir study
apt-get install g++
cd study
#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
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
ls -la
ls -al 명령어로 확인해보면 이렇게 tcp_server.exe와 tcp_server.o파일이 생성된 것을 확인할 수 있다.
이번에 진행해본 것은 Makefile로 컴파일을 하나의 소스만 했기 때문에 .o 파일이 하나만 생성 되었지만, 여러개의 소스를 한번에 컴파일한다면 그 만큼의 .o 파일이 생성될 것이다. 이럴 땐 Makefile에 clean을 정의했기 때문에 make clean 명령어를 입력하면 삭제된다.
make clean
ls -al
.o 파일이 삭제된 것을 확인했다. 마지막으로 .exe 파일을 실행해 보았다.
./tcp_server.exe
tcp 통신이 가능한지 확인할 수단을 마련하지 않고 실행해버려서 그냥 http로 접속을 시도한 모습이며, 접속이 된 것을 확인할 수 있었다.
다음은 udp 통신으로 시도해볼 예정이다.