앞서 작성했었던 Echo Server를 멀티 쓰레드 환경으로 변경해보자.
main.c
accept를 담당하고, 클라와 연결 되면 해당 클라와 통신하기 위한 쓰레드를 생성해준다.
// 클라 연결을 받고 새로운 소켓을 생성한다.
while((hClient = ::accept(hSocket,
(SOCKADDR*)&clientaddr,
&nAddrLen)) != INVALID_SOCKET)
{
// 새 클라와 통신하기 위한 쓰레드를 생성한다.
// 클라가 접속할 때마다 쓰레드가 하나씩 생성된다.
hThread = ::CreateThread(
NULL, // 쓰레드를 생성한 프로세스의 보안속성을 상속받는다.
0, // 스택 메모리를 기본 크기 값으로 가진다. ( 1MB )
ThreadFunction, // 쓰레드로 실행할 함수의 이름을 적는다.
(LPVOID)hClient, // 새로 생성된 클라 소켓을 넘긴다.
0, // 생성 플래그는 기본값을 사용한다.
&dwThreadID); // 생성된 쓰레드 ID가 저장될 변수의 주소를 담는다.
::CloseHandle(hTread);
}
ThreadFunction
클라의 recv, send를 담당할 쓰레드
DWORD WINAPI ThreadFunction(LPVOID pParam)
{
char szBuffer[128] = { 0 };
int nReceive = 0;
SOCKET hClient = (SOCKET)pParam;
puts("새 클라이언트가 연결되었습니다.");
while((nReceive = ::recv(
hClient, szBuffer, sizeof(szBuffer), 0)) > 0)
{
::send(hClient, szBuffer, sizeof(szBuffer), 0);
puts(szBuffer);
memset(szBuffer, 0, sizeof(szBuffer));
}
puts("클라이언트 연결이 끊어졌습니다.");
::closesocket(hClient);
return 0;
}
'네트워크' 카테고리의 다른 글
[네트워크] 멀티 쓰레드 채팅 클라이언트 (0) | 2025.04.14 |
---|---|
[네트워크] 멀티쓰레드 채팅 서버 (0) | 2025.04.13 |
[네트워크] 소켓에서 버퍼링을 하는 이유 (0) | 2025.04.10 |
[네트워크] Nagle's Algorithm ( 네이글 알고리즘 ) (0) | 2025.04.09 |
[네트워크] Echo Server, Echo Client (0) | 2025.04.09 |