티스토리 뷰

반응형

이전 글 TCP 소켓 프로그램에서 조금만 손 보면 UDP 통신 프로그램을 만들 수 있습니다.

 

빈 프로젝트를 만든 후 아래와 같이 코드를 입력 합니다.

 

LocalServer.h

#define MAX_BUFFER 1024

class LocalServer
{
public:
	// 기본 생성자와 소멸자
	LocalServer();
	~LocalServer();

	int startServer(int _port);
	int EchoData();

	WSADATA wsaData;
	SOCKET hSocket;
	SOCKET hClientSocket;
	SOCKADDR_IN servAddr;
	SOCKADDR_IN cilentAddr;
	int nclientAddr;
};

 

LocalServer.cpp

#include <iostream>

#include "LocalServer.h"

LocalServer::LocalServer()
{
	hSocket = 0;
	hClientSocket = 0;
	
	memset(&servAddr, 0x00, sizeof(SOCKADDR_IN));
	memset(&cilentAddr, 0x00, sizeof(SOCKADDR_IN));
	nclientAddr = 0;
}

LocalServer::~LocalServer()
{
}

int LocalServer::startServer(int _port)
{
	// 윈도우 소켓 초기화 버전 2,2
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		printf("윈도우 소켓 초기화 실패\r\n");
		return -1;
	}

	// UDP 연결을 받을 소켓을 생성.
	hSocket = socket(PF_INET, SOCK_DGRAM, 0);

	if (hSocket == INVALID_SOCKET)
	{
		printf("소켓 생성 실패\r\n");
		return -1;
	}

	// 서버 주소 체계 초기화
	memset(&servAddr, 0x00, sizeof(servAddr));
	servAddr.sin_family = AF_INET;
	inet_pton(AF_INET, "127.0.0.1", &servAddr.sin_addr); // 127.0.0.1 로컬 주소 입니다.
	servAddr.sin_port = htons(_port); // SOCKET PORT를 지정해 준다.

	// The bind function associates a local address with a socket.
	// 생성한 소켓과 주소를 지정해 줍니다.
	if (bind(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
	{
		printf("bind 실패\r\n");
		return -1;
	}

	printf("echo 서버 준비 완료\r\n");
	return 0;
}

int LocalServer::EchoData()
{
	// 프로그램을 종료 하기 위한 변수
	bool isExit = false;

	// 수신 받을 데이터 버퍼
	char recvData[MAX_BUFFER] = { 0, };

	int recvLen = 0;

	while (!isExit)
	{
		// 수신 버퍼를 비워둡니다.
		memset(recvData, 0x00, sizeof(recvData));

		// 데이터를 수신을 기다립니다.
		nclientAddr = sizeof(cilentAddr);

		recvLen = recvfrom(hSocket, recvData, MAX_BUFFER, 0, (SOCKADDR*)&cilentAddr, &nclientAddr);

		// 수신 받은 데이터가 bye인지 확인 합니다.
		if (recvData[0] == 'b' && recvData[1] == 'y' && recvData[2] == 'e' && strlen(recvData) == 3)
		{
			// 수신 받은 데이터가 bye 일 경우 See You로 응답을 대신 후 프로그램을 종료 합니다.
			sendto(hSocket, "See You", strlen("See You"), 0, (SOCKADDR*)&cilentAddr, sizeof(cilentAddr));
			isExit = true;
			continue;
		}
		
		// 수신 받은 데이터를 돌려 줍니다. ( ECHO 기능 )
		sendto(hSocket, recvData, recvLen, 0, (SOCKADDR*)&cilentAddr, sizeof(cilentAddr));
	}

	// 소켓을 닫습니다.
	closesocket(hSocket);

	return 0;
}

 

반응형

 

main.cpp

#include <iostream>
#include "LocalServer.h"

int main()
{
	// Echo Server 클래스를 선언 합니다.
	LocalServer echoServer;

	// 포트 번호 9123으로 UDP 서버를 초기화 합니다.
	if (echoServer.startServer(9123) == -1)
	{
		return -1;
	}

	// ECHO 기능을 시작합니다.
	echoServer.EchoData();

	// 프로그램이 종료 됩니다.
	printf("프로그램을 종료 합니다.\r\n");
	return 0;
}

 

TCP와 다른 점은 소켓 생성 시 SOCK_STREAM 대신 SOCK_DGRAM 사용 그리고 listen를 사용하지 않습니다.

	// UDP 연결을 받을 소켓을 생성.
	hSocket = socket(PF_INET, SOCK_DGRAM, 0);

그리고 패킷 송.수신을 위하여 send, recv에서 sendto, recvfrom 함수를 사용하였습니다.

함수 사용에 대해서는 따로 정리하도록 하겠습니다.

 

이어서 클라이언트 소스를 확인해 보겠습니다.

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함