//GameServer.cpp
#include <WinSock2.h>
#include <MSWSock.h>
#include <WS2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
WSADATA wsaData;
if (::WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
return 0;
}
SOCKET listenSocket = ::socket(AF_INET, SOCK_STREAM, 0);
if (listenSocket == SOCKET_ERROR) {
int32 errorCode = ::WSAGetLastError();
cout << "Error Code : " << errorCode << endl;
return 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);
if (::bind(listenSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
int32 errorCode = ::WSAGetLastError();
cout << "Error Code : " << errorCode << endl;
return 0;
}
if (::listen(listenSocket, SOMAXCONN) == SOCKET_ERROR) {
int32 errorCode = ::WSAGetLastError();
cout << "Error Code : " << errorCode << endl;
return 0;
}
while (true) {
SOCKADDR_IN clientAddr;
::memset(&clientAddr, 0, sizeof(clientAddr));
int32 addrLen = sizeof(clientAddr);
SOCKET clientSocket = ::accept(listenSocket, (SOCKADDR*)&clientAddr, &addrLen);
if (clientSocket == INVALID_SOCKET) {
int32 errorCode = ::WSAGetLastError();
cout << "Error Code : " << errorCode << endl;
return 0;
}
char ipAddress[16];
::inet_ntop(AF_INET, &clientAddr.sin_addr, ipAddress, sizeof(ipAddress));
cout << "Client Connected! IP = " << ipAddress << endl;
}
}
//DummyClient.cpp
#include <winsock2.h>
#include <MSWSock.h>
#include <WS2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
this_thread::sleep_for(1s);
WSADATA wsaData;
if (::WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
return 0;
}
SOCKET clientSocket = ::socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == SOCKET_ERROR) {
int32 errorCode = ::WSAGetLastError();
cout << "Error Code : " << errorCode << endl;
return 0;
}
SOCKADDR_IN serverAddr;
::memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr);
serverAddr.sin_port = htons(7777);
if (::connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
int32 errorCode = ::WSAGetLastError();
cout << "Error Code : " << errorCode << endl;
return 0;
}
cout << "Connected to Server!" << endl;
}
//GameServer.cpp
int main() {
WSADATA wsaData;
if (::WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
return 0;
}
SOCKET listenSocket = ::socket(AF_INET, SOCK_STREAM, 0);
if (listenSocket == SOCKET_ERROR) {
int32 errorCode = ::WSAGetLastError();
cout << "Error Code : " << errorCode << endl;
return 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);
if (::bind(listenSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
int32 errorCode = ::WSAGetLastError();
cout << "Error Code : " << errorCode << endl;
return 0;
}
if (::listen(listenSocket, SOMAXCONN) == SOCKET_ERROR) {
int32 errorCode = ::WSAGetLastError();
cout << "Error Code : " << errorCode << endl;
return 0;
}
while (true) {
SOCKADDR_IN clientAddr;
::memset(&clientAddr, 0, sizeof(clientAddr));
int32 addrLen = sizeof(clientAddr);
SOCKET clientSocket = ::accept(listenSocket, (SOCKADDR*)&clientAddr, &addrLen);
if (clientSocket == INVALID_SOCKET) {
int32 errorCode = ::WSAGetLastError();
cout << "Error Code : " << errorCode << endl;
return 0;
}
char ipAddress[16];
::inet_ntop(AF_INET, &clientAddr.sin_addr, ipAddress, sizeof(ipAddress));
cout << "Client Connected! IP = " << ipAddress << endl;
while (true) {
char recvBuffer[1000];
int32 recvLen = ::recv(clientSocket, recvBuffer, sizeof(recvBuffer), 0);
if (recvLen <= 0) {
int32 errorCode = ::WSAGetLastError();
cout << "Recv Error : " << errorCode << endl;
return 0;
}
cout << "Recv Data! Data = " << recvBuffer << endl;
cout << "Recv Data! Len = " << recvLen << endl;
int32 resultCode = ::send(clientSocket, recvBuffer, recvLen, 0);
if (resultCode == SOCKET_ERROR) {
int32 errorCode = ::WSAGetLastError();
cout << "Send Error : " << errorCode << endl;
return 0;
}
}
}
::WSACleanup();
}
//DummyClient.cpp
int main() {
this_thread::sleep_for(1s);
WSADATA wsaData;
if (::WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
return 0;
}
SOCKET clientSocket = ::socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == SOCKET_ERROR) {
int32 errorCode = ::WSAGetLastError();
cout << "Error Code : " << errorCode << endl;
return 0;
}
SOCKADDR_IN serverAddr;
::memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr);
serverAddr.sin_port = htons(7777);
if (::connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
int32 errorCode = ::WSAGetLastError();
cout << "Error Code : " << errorCode << endl;
return 0;
}
cout << "Connected to Server!" << endl;
while (true) {
char sendBuffer[100] = "Hello World!";
int32 resultCode = ::send(clientSocket, sendBuffer, sizeof(sendBuffer), 0);
if (resultCode == SOCKET_ERROR) {
int32 errorCode = ::WSAGetLastError();
cout << "Send Error : " << errorCode << endl;
return 0;
}
cout << "Send Data! Len = " << sizeof(sendBuffer) << endl;
char recvBuffer[1000];
int32 recvLen = ::recv(clientSocket, recvBuffer, sizeof(recvBuffer), 0);
if (recvLen <= 0) {
int32 errorCode = ::WSAGetLastError();
cout << "Recv Error : " << errorCode << endl;
return 0;
}
cout << "Recv Data! Data = " << recvBuffer << endl;
cout << "Recv Data! Len = " << recvLen << endl;
this_thread::sleep_for(1s);
}
::WSACleanup();
}
0x12345678을 저장할 때 Little Endian인지 Big Endian인지에 따라 저장하는 방식이 다릅니다
낮은 주소 [0x78][0x56][0x34][0x12] 높은 주소 -> Little Endian
낮은 주소 [0x12][0x34][0x56][0x78] 높은 주소 -> Big Endian
저장하는 방식이 다르기 때문에 만약 어떤 방식으로 데이터를 읽을지 제대로 지정해주지 않으면 의도한 데이터를 읽지 못합니다.
보통 인텔 CPU를 사용할 경우는 Little Endian 방식을 사용합니다.
그러나 네트워크에서는 보통 Big Endian을 사용하기 때문에
htons() //host to network
ptons() //protocol to network
해당 명령어로 어떤 방식을 사용할지 지정해줍니다.
추가적으로 TCP와 UDP에 대해 알아봅시다.