// ClientPart.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include
#include
#include
#pragma comment (lib, "Ws2_32.lib")
// https://docs.microsoft.com/en-us/windows/win32/winsock/complete-server-code
#define DEFAULT_BUFLEN (1024 * 1024 * 10) // 10MB
#define DEFAULT_PORT "15000"
void print(char buf[], int len)
{
for (int i = 0; i < len; i++)
{
printf("%c", buf[i]);
}
printf("\n");
}
int main()
{
WSADATA wsaData;
int iResult;
SOCKET ListenSocket = INVALID_SOCKET;
SOCKET clntSocket = INVALID_SOCKET;
struct addrinfo* result = NULL;
struct addrinfo hints;
int iSendResult;
char* recvbuf = (char*)malloc(DEFAULT_BUFLEN); // 테스트의 편의상 delete 생략
int recvbuflen = DEFAULT_BUFLEN;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed with error: %d\n", iResult);
return 1;
}
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
// Resolve the server address and port
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
if (iResult != 0) {
printf("getaddrinfo failed with error: %d\n", iResult);
WSACleanup();
return 1;
}
// Create a SOCKET for connecting to server
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (ListenSocket == INVALID_SOCKET) {
printf("socket failed with error: %ld\n", WSAGetLastError());
freeaddrinfo(result);
WSACleanup();
return 1;
}
// Setup the TCP listening socket
iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
if (iResult == SOCKET_ERROR) {
printf("bind failed with error: %d\n", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
WSACleanup();
return 1;
}
freeaddrinfo(result);
iResult = listen(ListenSocket, SOMAXCONN);
if (iResult == SOCKET_ERROR) {
printf("listen failed with error: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
int errorCode;
while (true)
{
errorCode = 0;
clntSocket = accept(ListenSocket, NULL, NULL);
printf("Press any key to call recv");
getchar();
int totalReceive = 0;
while (true)
{
iResult = recv(clntSocket, recvbuf, DEFAULT_BUFLEN, 0);
if (iResult == -1 || iResult == 0)
{
errorCode = WSAGetLastError();
printf("recv: %d(%d)\n", iResult, errorCode);
break;
}
totalReceive += iResult;
printf("recvLen: %d (total: %d)\n", iResult, totalReceive);
}
iResult = closesocket(clntSocket);
errorCode = WSAGetLastError();
printf("closesocket: %d(%d), totalRecv = %d\n", iResult, errorCode, totalReceive);
}
// No longer need server socket
closesocket(ListenSocket);
WSACleanup();
return 0;
}
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]