티스토리 뷰
Visual Studio 2012
멀티 스레드를 사용하여 소켓통신용 서버 프로그램을 만들어보자.
기존에 만들었던 소켓통신 채팅 서버프로그램에서 몇가지 수정하고 추가하면 된다.
1. CWinThread용 클래스 생성 및 구현
- 클래스 마법사에서 'MFC 클래스' 클릭
- 클래스 추가 - 기본클래스는 CWinThread으로 지정
- CSocketThread 클래스
- 필요 함수
- SetWnd : 다이얼로그의 핸들을 받기 위한 함수
- 함수 및 핸들 변수 선언
// CSocketThread.h
//
#include "ClientSocket.h" //ClientSocket 헤더 추가
#define WM_ACCEPT_SOCKET WM_USER+1 //ServerSocket에 있던 메시지 쓰레드로 이동
class CSocketThread : public CWinThread
{
...
public:
CClientSocket m_ClientSocket;
SOCKET m_hSocket;
HWND m_hWnd;
void SetWnd(HWND hWnd);
};
- 함수 구현
- 쓰레드에서 Client 매칭하는 소켓을 생성할거기 때문에 ServerSocket에 있던 Sendmessage를 이동시켰다.
// SocketThread.cpp : 구현 파일입니다.
//
void CSocketThread::SetWnd(HWND hWnd)
{
m_hWnd = hWnd;
}
BOOL CSocketThread::InitInstance()
{
// TODO: 여기에서 각 스레드에 대한 초기화를 수행합니다.
// 리슨 소켓으로부터 넘겨받은 소켓을 자신의 멤버 소켓에 붙인다.
m_ClientSocket.Attach(m_hSocket);
m_ClientSocket.m_pThread = this;
m_ClientSocket.SetWnd(m_hWnd);
//ServerSocket에서 활용하던 Sendmessage 이곳으로 이동
SendMessage(m_hWnd, WM_ACCEPT_SOCKET, 0, (LPARAM)&m_ClientSocket);
return TRUE;
}
2. Client 매칭 소켓 클래스
- 변수 추가 : 쓰레드 관련 변수 추가한다.
// ClientSocket.h : 헤더 파일입니다.
//
class CClientSocket : public CSocket
{
public:
...
//Thread
CWinThread *m_pThread;
};- 소스 추가
- OnClose()에 소켓 소멸시 쓰레드로 CLOSE 메시지 보내는 구문 추가
// ClientSocket.cpp : 구현 파일입니다.
//
void CClientSocket::OnClose(int nErrorCode)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
m_pThread->PostThreadMessage(WM_QUIT, 0, 0);
SendMessage(m_hWnd, WM_CLIENT_CLOSE, 0, (LPARAM)this);
CSocket::OnClose(nErrorCode);
}3. Listen 소켓 클래스
- OnAccept 소스 수정(기존과 완전 달라짐)
- 쓰레드 클래스에서 Client 매칭 소켓을 생성할거기 때문에 쓰레드 클래스의 인자를 포인터로 받아와서 쓰레드 실행 구문을 넣음.
- CSocket형 변수를 만들고 쓰레드 안에 만든 소켓과 Detach를 통해 매칭시킨다.
// ServerSocket.cpp : 구현 파일입니다.
//
#include "SocketThread.h" //스레드 클래스 헤더 추가
void CServerSocket::OnAccept(int nErrorCode)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
CSocket soc;
if(Accept(soc))
{
CSocketThread *pThread = (CSocketThread *)AfxBeginThread(RUNTIME_CLASS(CSocketThread),
THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
pThread->SetWnd(m_hWnd);
if(!pThread)
{
soc.Close();
AfxMessageBox(_T("ERROR : Thread could not be created."));
return;
}
//연결되면 클라이언트쪽에 메시지 보냄
soc.Send(_T("Connected with Server"),43);
// 접속한 소켓을 분리해서 소켓의 핸들을 스레드에게 넘겨준다
pThread->m_hSocket = soc.Detach();
// 생성한 스레드를 실행시킨다
pThread->ResumeThread();
}
CSocket::OnAccept(nErrorCode);
}소스코드 참조 : https://winx.kr/UdrpJd4qr5
'Programming > MFC(C++)' 카테고리의 다른 글
| [MFC] CListCtrl 클립보드 복사 구현하기(Ctrl+C 기능 구현) (1) | 2018.10.26 |
|---|---|
| [MFC] 람다 표현으로 CArray 정렬하기 (0) | 2018.10.22 |
| [MFC] 소켓통신 채팅 클라이언트 프로그램 만들기 (14) | 2018.07.19 |
| [MFC] 소켓통신 채팅 서버 프로그램 만들기 (21) | 2018.07.19 |
| [MFC] 콘솔창 대신 디버그창 활용하기(OutputDebugString) (0) | 2018.07.16 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 프로세스이름변경
- 항공알파벳
- ADODB
- c++
- Sticky Notes Loading
- sqlite3
- 모달리스
- 해외송금확인
- CMFCBUTTON
- 전자신고변환
- Modeless
- SendMessage
- 세금계산서합계표양식
- ADO
- MFC
- MSSQL
- #자동업데이트
- 법정동코드
- 부가가치세
- MXCOMPONENT
- 소켓
- 청년내일채움공제 만기신청
- MFC ADO
- MFC Modeless
- 스티커메모로드중
- 전자신고파일설명서
- 모달리스 다이얼로그
- 청년내일채움공제
- 부가가치세전산매체
- 스쿠트항공 환불받기
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함