1. WinSock 초기화
WSAStartup(MAKEWORD(2, 2), &wsaData);
Windows 는 소켓을 라이브러리로 제공함
필수
2. 서버 소켓 생성
SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, 0);
AF_INET >> IPv4
SOCK_STREAM >> TCP
3. 서버 주소 설정
serverAddr.sin_port = htons(9000);
htons >> Host TO Network Short
네트워크는 Big Endian
4. bind / listen
bind(listenSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
listen(listenSocket, SOMAXCONN);
5. accept
SOCKET clientSocket = accept(listenSocket, (SOCKADDR*)&clientAddr, &addrSize);
클라이언트 접속 전까지 무한 대기
>>
accept 는 TCP 연결 요청이 들어올 때까지 커널 레벨에서 대기 한다.
블로킹 함수.
recv
recv(clientSocket, (char*)&value, sizeof(int), 0);
recv 는 수신 버퍼에 데이터가 도착하는 순간 풀림
>>
recv 가 풀리는 조건
1. 커널 수신 버퍼에 데이터가 1바이트라도 도착
2. 상대방이 연결을 종료 (FIN 수신)
3. 에러 발생
sizeof(int)
>>
TCP 는 데이터 타입을 모름
몇 바이트를 읽어야 할지 서버가 알 방법이 없음
"4바이트 정수" 라는 명시적 약속
서버
// SB002_Server.cpp
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN serverAddr = {};
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(9000);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(listenSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
listen(listenSocket, SOMAXCONN);
printf("서버 시작\n");
while (true)
{
printf("클라이언트 접속 대기...\n");
SOCKADDR_IN clientAddr = {};
int addrSize = sizeof(clientAddr);
SOCKET clientSocket = accept(listenSocket, (SOCKADDR*)&clientAddr, &addrSize);
printf("클라이언트 접속됨\n");
int value = 0;
recv(clientSocket, (char*)&value, sizeof(int), 0);
printf("수신 값: %d\n", value);
closesocket(clientSocket);
}
closesocket(listenSocket);
WSACleanup();
return 0;
}
클라
// SB001_Client.cpp
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN serverAddr = {};
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(9000);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sock, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
int value = 1234;
send(sock, (char*)&value, sizeof(int), 0);
closesocket(sock);
WSACleanup();
return 0;
}
'C++ > Win32' 카테고리의 다른 글
| [Win32] IOCP 서버 (0) | 2025.12.27 |
|---|---|
| [Win32] select 서버 (0) | 2025.12.27 |
| [Win32] 네트워크 메시지 경계 처리 - Length Prefix (0) | 2025.12.27 |
| [Win32] 서버 확장 : Thread 도입 (0) | 2025.12.27 |
| [Win32] Windows Socket 기초 - recv 무한 대기 방지 (0) | 2025.12.27 |