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 |