client , server 연습 ..

게임 서버 프로그래밍/윈도우 소켓 프로그래밍

2020. 2. 22. 18:31

Server
#include <iostream>
#include <WinSock2.h>
#include <string>
#pragma comment (lib, "ws2_32.lib")

void ErrorHandling(const char* errMsg)
{
	std::cout << "error msg : " << errMsg << std::endl;
	std::cout << "error No : " << WSAGetLastError() << std::endl;
	exit(1);
}

int main(void)
{
	SOCKET mSocket, mClntSocket;
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		ErrorHandling("wsastartup() error");

	if ((mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
		ErrorHandling("socket() error");

	SOCKADDR_IN msockAddr;
	ZeroMemory(&msockAddr, sizeof(msockAddr));

	msockAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	msockAddr.sin_family = AF_INET;
	msockAddr.sin_port = htons(32000);

	if (bind(mSocket, (const SOCKADDR*)&msockAddr, sizeof(msockAddr)) == SOCKET_ERROR)
		ErrorHandling("bind() error !");

	if (listen(mSocket, 5) == SOCKET_ERROR)
		ErrorHandling("listen() error !");

	SOCKADDR_IN mclntsockAddr;
	int clntSize = sizeof(mclntsockAddr);

	ZeroMemory(&mclntsockAddr, sizeof(mclntsockAddr));
	mClntSocket = accept(mSocket, (sockaddr*)&mclntsockAddr, &clntSize);
	if (mClntSocket == INVALID_SOCKET)
		ErrorHandling("accept() error!");
	char buf[1024] = { 0, };
	std::cin >> buf;
	send(mClntSocket, buf, sizeof(buf), 0);

	closesocket(mSocket);
	closesocket(mClntSocket);

	WSACleanup();
}
Client
#define _WINSOCK_DEPRECATED_NO_WARNINGS

#include <iostream>
#include <WinSock2.h>

#pragma comment (lib, "ws2_32.lib")

void ErrorHandling(const char* errMsg)
{
	std::cout << "error msg : " << errMsg << std::endl;
	std::cout << "error No : " << WSAGetLastError() << std::endl;
	exit(1);
}

int main(void)
{
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		ErrorHandling("wsastartup() error!");
	SOCKET mSocket;
	if ((mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
		ErrorHandling("socket() ERROR!");

	SOCKADDR_IN msockAddr;
	memset(&msockAddr, 0, sizeof(msockAddr));
	msockAddr.sin_addr.S_un.S_addr = inet_addr("192.168.208.157");
	msockAddr.sin_family = AF_INET;
	msockAddr.sin_port = htons(32000);

	if (connect(mSocket, (const SOCKADDR*)&msockAddr, sizeof(msockAddr)) == SOCKET_ERROR)
		ErrorHandling("connect error!");
	char buf[1024] = { 0, };
	int strLen = recv(mSocket, buf, sizeof(buf) - 1, 0);
	if (strLen > 0)
	{
		std::cout << buf << std::endl;
	}
	else
		ErrorHandling("recv() error!");

	closesocket(mSocket);
	WSACleanup();
}

 

세 번 정도 클라-서버의 간단한 구현을 해 본 것 같은데 할 때마다 헷갈린다 ..

외울 필요는 없어 보이지만 이론을 토대로 코드로 바로 옮길 수 있는 게 마음이 편하다.

 

비동기 I/O 예제 코드를 작성하고 있었는데 ㅋㅋ..

select()와 ioctlsocket()은 별개로 쓰는 줄 알고 계속 헤맸다.

다음에는 비동기 관련 함수 예제를 작성해야겠습니다.

'게임 서버 프로그래밍 > 윈도우 소켓 프로그래밍' 카테고리의 다른 글

패킷과 직렬화  (0) 2021.02.15
Serializer 제작  (0) 2020.09.15
getaddrinfo()  (0) 2020.02.22