지난번 포스트에서는 tcp로 통신하는 c++ 소스를 작성하고 makefile을 작성하여 컴파일했다.
이번 포스트에서는 tcp 통신이 아닌 udp 통신으로 소스를 작성해 보았다.
cd /study
vim udp_server.cpp
#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
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번 포트는 사용하지 않는 상태였다.