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 |