티스토리 뷰

반응형

이어서 UDP Echo 클라이언트 소스 입니다.

빈 프로젝트를 새롭게 여신 후 아래 코드를 입력 합니다.

 

LocalClient.h

#pragma once

// Window Socket API를 사용하기 위해 헤더 선언.
#include <WS2tcpip.h>

// 본 프로젝트에 Window Socket 라이브러리를 적용시킨다. 
#pragma comment(lib, "ws2_32.lib")

#define MAX_BUFFER 1024

class LocalClient
{
public:
	LocalClient();
	~LocalClient();

	int InitSocket(const char* ip, int port);
	int Running();

	WSADATA wsaData;
	SOCKET hClient;

	SOCKADDR_IN servAddr;
	int nservAddr;
};

 

LocalClient.cpp

#include "LocalClient.h"

#include <iostream>

LocalClient::LocalClient()
{
	hClient = 0;
	nservAddr = 0;
	memset(&servAddr, 0x00, sizeof(SOCKADDR_IN));
}

LocalClient::~LocalClient()
{

}

int LocalClient::InitSocket(const char* ip, int port)
{
	// 윈도우 소켓 초기화 버전 2,2
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
		printf("윈도우 소켓 초기화 실패\r\n");
		return -1;
	}

	// UDP 소켓을 생성
	hClient = socket(PF_INET, SOCK_DGRAM, 0);

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

	memset(&servAddr, 0, sizeof(servAddr));
	servAddr.sin_family = AF_INET;
	inet_pton(AF_INET, ip, &servAddr.sin_addr);
	servAddr.sin_port = htons(port); // PORT 번호를 설정해 줍니다.

	return 0;
}

int LocalClient::Running()
{
	bool isExit = false;
	char sendData[MAX_BUFFER] = { 0, };
	char recvData[MAX_BUFFER] = { 0, };
	
	nservAddr = sizeof(servAddr);

	while (!isExit)
	{
		// 항상 보낼 데이터를 비워줍니다.
		memset(sendData, 0x00, sizeof(sendData));
		memset(recvData, 0x00, sizeof(recvData));
		
		nservAddr = sizeof(servAddr);
		// 키보드 입력 전에 버퍼를 비워줍니다.
		//fflush(stdin);
		fseek(stdin, 0, SEEK_END);

		// 키보드로부터 보낼 데이터를 입력 받습니다.
		if (scanf_s("%[^\n]", sendData, MAX_BUFFER) == 0)
		{
			continue;
		}

		// 데이터를 전송합니다.
		sendto(hClient, sendData, strlen(sendData), 0, (SOCKADDR*)&servAddr, sizeof(servAddr));
		
		// 데이터를 수신 합니다.
		recvfrom(hClient, recvData, MAX_BUFFER, 0, (SOCKADDR*)&servAddr, &nservAddr);

		printf(recvData);
		printf("\r\n"); // 엔터를 넣어줍니다.

		if (sendData[0] == 'b' && sendData[1] == 'y' && sendData[2] == 'e' && strlen(sendData) == 3)
		{
			// bye 데이터를 보냈다면 프로그램을 종료 합니다.
			isExit = true;
			continue;
		}
	}

	closesocket(hClient);

	return 0;
}

 

main.cpp

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

int main()
{
	LocalClient echoClient;

	if (echoClient.InitSocket("127.0.0.1", 9123) == -1)
	{
		return -1;
	}

	echoClient.Running();

	return 0;
}

UDP 서버 와 같이 패킷 송.수신은 send, recv 함수에서 sendto, recvfrom 함수로 변경해서 사용했습니다.

TCP 클라이언트와 달리 connect함수를 사용하지 않습니다.

 

소켓 생성 시 SOCK_STREAM 대신 SOCK_DGRAM를 사용합니다.

 

이제 두 개 프로젝트를 실행 합니다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함