MMOServer

SocketProgramming Basic(C++)

이야기prog 2025. 4. 1. 18:53

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_STREAM, 0);

	if (clientSocket == INVALID_SOCKET) {
		int32 errCode = ::WSAGetLastError();
		cout << "erroCode: " << 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

		this_thread::sleep_for(1ms);
	}


	::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")


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 listenSocket = ::socket(AF_INET, SOCK_STREAM, 0);

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

	//연결할 목적지는?
	SOCKADDR_IN serverAddr; // ipv4
	::memset(&serverAddr, 0, sizeof(serverAddr));
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_addr.s_addr = ::htonl(INADDR_ANY); // 알아서 세팅해줌 유동적으로 (127.0.0.1)도 되고, 자기 ip주소도 되고
	serverAddr.sin_port = ::htons(7777); // host to network short = big_endian으로 변환해줌

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


	if (::listen(listenSocket, 10) == SOCKET_ERROR) {
		int32 errCode = ::WSAGetLastError();
		cout << "erroCode: " << errCode << endl;
		return 0;

	} // 대기열 10명까지

	// 연결 성공 
	while (true) {
		//TODO
			//연결할 목적지는?
		SOCKADDR_IN clientAddr; // ipv4
		::memset(&clientAddr, 0, sizeof(clientAddr));
		int32 addrLen = sizeof(clientAddr);

		SOCKET clientSocket = ::accept(listenSocket, (SOCKADDR*)&clientAddr, &addrLen);
		if (clientSocket == INVALID_SOCKET) {
			int32 errCode = ::WSAGetLastError();
			cout << "Accept erroCode: " << errCode << endl;
			return 0;

		}

		//손님 입장
		char ipAddress[16];
		::inet_ntop(AF_INET, &clientAddr.sin_addr, ipAddress, sizeof(ipAddress));
		cout << "Client Connected! IP = " << ipAddress << endl;
	}

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

'MMOServer' 카테고리의 다른 글

UDP(C++)  (0) 2025.04.01
TCP(C++)  (0) 2025.04.01
ObjectPooling(C++)  (0) 2025.03.29
MemoryPool(C++)  (0) 2025.03.28
SList(C++) 불완전  (0) 2025.03.28