MMOServer

UDP(C++)

이야기prog 2025. 4. 1. 22:44

client

 

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

#include <WinSock2.h>
#include <MSWSock.h>
#include <WS2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
	//윈도우 소켓 초기화
	// 관련 정보가 wsaData에 채워짐
	WSADATA wsaData;
	if (::WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		return 0;

	// socket : address_family:(ipv4, ipv6...), type(tcp, udp), protocol / return: descriptor
	SOCKET clientSocket = ::socket(AF_INET, SOCK_DGRAM, 0);

	if (clientSocket == INVALID_SOCKET) {
		int32 errCode = ::WSAGetLastError();
		cout << "errCode: " << errCode << endl;
		return 0;
	}

	//연결할 목적지는?
	SOCKADDR_IN serverAddr; // ipv4
	::memset(&serverAddr, 0, sizeof(serverAddr));
	serverAddr.sin_family = AF_INET;
	::inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr); // internet presentation to network
	serverAddr.sin_port = ::htons(7777); // host to network short = big_endian으로 변환해줌

	//if (::connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
	//	int32 errCode = ::WSAGetLastError();
	//	cout << "erroCode: " << errCode << endl;
	//	return 0;
	//}

	//========================
	// 연결 성공! 데이터 송수신 가능

	//cout << "Connected to Server" << endl;

	while (true) {

		//TODO
		char sendBuffer[100] = "Hello, World!";

		for (int i = 0; i < 10; ++i) {
			int32 resultCode = ::sendto(clientSocket, sendBuffer, sizeof(sendBuffer), 0,
				(SOCKADDR*)&serverAddr, sizeof(serverAddr));

			if (resultCode == SOCKET_ERROR) {
				int32 errCode = ::WSAGetLastError();
				cout << "errCode: " << errCode << endl;
				return 0;
			}

			cout << "Send Data! Len: " << sizeof(sendBuffer) << endl;
		}

	

		char recvBuffer[1000];
		SOCKADDR_IN recvAddr;
		::memset(&recvAddr, 0, sizeof(recvAddr));
		int32 recvLen = sizeof(recvAddr);


		int32 recvSize = ::recvfrom(clientSocket, recvBuffer, sizeof(recvBuffer), 0,
			(SOCKADDR*)&recvAddr, &recvLen);
		if (recvSize <= 0) {
			int32 errCode = ::WSAGetLastError();
			cout << "erroCode: " << errCode << endl;
			return 0;
		}

		cout << recvBuffer << endl;
		cout << "Receive Data! Len: " << recvSize << endl;
		this_thread::sleep_for(1s);
	}


	::closesocket(clientSocket); // 소켓 리소스 반환
	::WSACleanup(); // 윈속 종료
}

 

 

Server

 

#include "pch.h"
#include <thread>
#include <atomic>
#include <mutex>
#include <future>
#include "CorePch.h"
#include "ThreadManager.h"
#include "RefCounting.h"
#include "Memory.h"
#include "TypeCast.h"

#include <WinSock2.h>
#include <MSWSock.h>
#include <WS2tcpip.h>
#pragma comment(lib, "ws2_32.lib")

void HandleError(const char* str) {
	int32 errCode = ::WSAGetLastError();
	cout << str << " erroCode: " << errCode << endl;
}
int main() {
	//윈도우 소켓 초기화
// 관련 정보가 wsaData에 채워짐
	WSADATA wsaData;
	if (::WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		return 0;

	SOCKET serverSocket = ::socket(AF_INET, SOCK_DGRAM, 0);

	SOCKADDR_IN serverAddr;
	::memset(&serverAddr, 0, sizeof(serverAddr));

	serverAddr.sin_family = AF_INET;
	serverAddr.sin_addr.s_addr = ::htonl(INADDR_ANY);
	serverAddr.sin_port = ::htons(7777);

	int32 errCode = ::bind(serverSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
	if (errCode == INVALID_SOCKET) {
		HandleError("bind");
		return 0;
	}

	while (true) {

		SOCKADDR_IN clientAddr;
		::memset(&clientAddr, 0, sizeof(clientAddr));
		int32 recvLen = sizeof(clientAddr);

		this_thread::sleep_for(1s);

		char recvBuffer[1000];

		int32 dataSize = ::recvfrom(serverSocket, recvBuffer, sizeof(recvBuffer), 0,
			(SOCKADDR*)&clientAddr, &recvLen);

		if (dataSize <= 0) {
			HandleError("recvfrom");
			return 0;
		}

		cout << recvBuffer << endl;
		cout << "Receive Data! Len:" << dataSize << endl;

		int32 errCode = ::sendto(serverSocket, recvBuffer, dataSize, 0,
			(SOCKADDR*)&clientAddr, sizeof(clientAddr));

		if (errCode == SOCKET_ERROR) {
			HandleError("sendfrom");
			return 0;
		}

		cout << "Send Data! Len: " << dataSize << endl;
	}

	

	::WSACleanup(); // 윈속 종료
	return 0;
}

'MMOServer' 카테고리의 다른 글

Non-Blocking Socket(C++)  (0) 2025.04.02
sockopt(C++)  (0) 2025.04.02
TCP(C++)  (0) 2025.04.01
SocketProgramming Basic(C++)  (0) 2025.04.01
ObjectPooling(C++)  (0) 2025.03.29