분류 전체보기 131

[Win32] IOCP 기반 + 길이 프레임 + Worker Thread 풀

IOCP + OVERLAPPED 기반 비동기 recv/send + 길이(4byte) + 데이터 프레임 + CPU 코어 기반 Worker Thread Win32 서버 구조main ├─ WSAStartup ├─ listen socket 생성 ├─ IOCP 생성 ├─ Worker Thread 풀 생성 ├─ accept loop │ ├─ ClientContext 생성 │ ├─ CreateIoCompletionPort (socket 등록) │ └─ 최초 WSARecv 요청 └─ 종료 처리 전체 구조MFC Project ├─ CMainDlg / CMainFrame (UI) ├─ IocpServer.h ├─ IocpServer.cpp └─ ClientContext.h ClientContext.h#..

C++/Win32 2025.12.27

[Win32] IOCP 서버

IOCP 는 Windows 전용 고성능 비동기 I/O 모델로, 정식 명칭은 I/O Completion Port. IOCP 객체 (Completion Port)HANDLE hIOCP = CreateIoCompletionPort(...);작업 완료 알림을 넣어두는 큐완료된 recv/send 결과가 쌓임 소켓을 IOCP에 등록CreateIoCompletionPort( (HANDLE)clientSocket, hIOCP, (ULONG_PTR)clientContext, 0); recv 요청WSARecv(sock, &buf, 1, NULL, &flags, &ov, NULL); IOCP 서버의 스레드while (true){ GetQueuedCompletionStatus( h..

C++/Win32 2025.12.27

[Win32] select 서버

Thread modelselect modelThread클라이엉트 수만큼1개recv블로킹준비된 소켓만구조직관적상태 기반확장성낮음중간select 는 recv 를 대신하는 게 아니라, recv 를 호출해도 되는 타이밍을 알려줌 select 서버 전체 흐름while (true){ select(...) for (읽기 가능한 소켓) { if (아직 길이 안 받음) recv 길이 else recv 데이터 }} select 서버에 필요한 구조체struct ClientInfo{ SOCKET socket; int expectedSize; // 다음에 받아야 할 데이터 크기 int receivedSize; // 지..

C++/Win32 2025.12.27

[Win32] 네트워크 메시지 경계 처리 - Length Prefix

[4바이트 길이][실제 데이터] recvAllint recvAll(SOCKET sock, char* buf, int totalSize){ int received = 0; while (received recv( sock, // 어느 소켓에서 buf + received, // 버퍼의 "다음 빈 자리" totalSize - received, // 아직 필요한 양 0); recv 시나리오100바이트 요청 >> 실제로는 40바이트만 옴recv #1 >> 40바이트 recv #2 >> 60바이트그래서 누적 수신이 필요함 buf + receivedbuf 시작 주소↓[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] ← totalS..

C++/Win32 2025.12.27

[Win32] Windows Socket 기초 - recv 무한 대기 방지

recv 타임아웃setsockopt + SO_RCVTIMEOint timeout = 5000; // 5초setsockopt(clientSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));5초동안 데이터 안 오면 recv() 실패 / 반환값 : SOCKET_ERRORWSAGetLstError() >> WSAETIMEDOUT 클라이언트 정보 출력inet_ntoa(clientAddr.sin_addr);ntohs(clientAddr.sin_port); recv 반환값int ret = recv(clientSocket, (char*)&value, sizeof(int), 0);ret > 0 : 받은 바이트 수ret == 0 : 상대방 정상 종료r..

C++/Win32 2025.12.27

[Win32] Windows Socket 기초 - TCP 연습

1. WinSock 초기화WSAStartup(MAKEWORD(2, 2), &wsaData);Windows 는 소켓을 라이브러리로 제공함필수 2. 서버 소켓 생성SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, 0);AF_INET >> IPv4SOCK_STREAM >> TCP 3. 서버 주소 설정serverAddr.sin_port = htons(9000);htons >> Host TO Network Short네트워크는 Big Endian 4. bind / listenbind(listenSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));listen(listenSocket, SOMAXCONN); 5. acceptSOCKE..

C++/Win32 2025.12.27

[MFC] ListBox

도구상자에서 List Box 추가 List Box 에서 오른쪽 버튼 클릭 후 변수 추가 이렇게하면 .h .cpp 응용예제 - 로그출력 화면처럼 표현void CDUMMYDlg::OnBnClickedButton1(){ // 에딧에 입력한거 CString msg; GetDlgItemText(IDC_EDIT2, msg); int index = m_listBox.InsertString(-1, msg); m_listBox.SetCurSel(index);} 현재 선택된 인덱int index = m_listBox.GetCurSel(); 아이템 추가 - AddString();m_listBox.AddString(L"Apple");m_listBox.AddString(L"Banana");m_listBox.AddStrin..

C++/MFC 2025.12.25

[MFC] Dialog 추가하기 - DoModal

화면 생성 리소스뷰 >> 프로젝트 솔루션 >> Dialog 오른쪽 버튼 >> 삽입 클래스 생성 새로운 대화상자 사용하기 위해서 클래스 생성대화상자 더블클릭하면 클래스 추가하는 창이 뜸 정형 Dialog (새로운 대화상자 활성화 시 기존 대화상자로 못 감) 대화상자 열기 - DoModal()#include "PopUp.h";void CDUMMYDlg::OnBnClickedPopupOpenBtn(){ PopUp popup; popup.DoModal();} 값을 양쪽으로 전달하기값 전달하기 위해서는 저장할 공간 필요>> 결국 값을 가지고 있을곳은 팝업창의 클래스 PopUp.h MainDlg.cpp#include "PopUp.h";void CDUMMYDlg::OnBnClickedPopupOpen..

C++/MFC 2025.12.25