MFC의 CAsyncSocket 대용 소켓.
며칠전에 발생했던 듀얼 씨피유에서 발생되던 패킷 에러 문제를 해결하기 위해 Winsock2 API를 사용하기로 했으나, 바꿔야할 소스의 양이 상당히 많다는 걸 깨달았다. 다행히도 문제가 된 프로그램은 구조적으로 CSocket를 상속한 클래스였기 때문에 , CSocket (정확히는 CAsyncSocket)을 대체하는 클래스를 만들어 해결했다.
앞으로 클라이언트 소켓 짤때 종종써야지~
사용법 :
1. stdafx.h에 아래의 코드를 추가한다.
#include <winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
2. 초기화 부분에
CString tmp = _T("");
WSADATA WsaData;
if(::WSAStartup(MAKEWORD(2, 2), &WsaData))
{
tmp.Format("윈속을 초기화 하는데 실패했습니다. [ERROR CODE:%d]",
::WSAGetLastError());
AfxMessageBox(tmp);
return FALSE;
}
를 추가한다.
3. CSocket을 상속받아 썼던 소켓클래스를 다음과 같이 변경했다.
class CDataSocket : public CSocket
-> class CDataSocket : public CAsyncSocketBase
동작 원리 : 별도의 Thread를 생성하여 WSAWaitForMultipleEvents으로 SOCEKT의 FD_READ와 FD_CLOSE를 잡아내어 OnClose, OnReceive 함수를 실행시킨다. virtual로 되어있어서
일반 CSocket사용과 동일하게 사용
1. stdafx.h에 아래의 코드를 추가한다.
#include <winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
2. 초기화 부분에
CString tmp = _T("");
WSADATA WsaData;
if(::WSAStartup(MAKEWORD(2, 2), &WsaData))
{
tmp.Format("윈속을 초기화 하는데 실패했습니다. [ERROR CODE:%d]",
::WSAGetLastError());
AfxMessageBox(tmp);
return FALSE;
}
를 추가한다.
3. CSocket을 상속받아 썼던 소켓클래스를 다음과 같이 변경했다.
class CDataSocket : public CSocket
-> class CDataSocket : public CAsyncSocketBase
동작 원리 : 별도의 Thread를 생성하여 WSAWaitForMultipleEvents으로 SOCEKT의 FD_READ와 FD_CLOSE를 잡아내어 OnClose, OnReceive 함수를 실행시킨다. virtual로 되어있어서
일반 CSocket사용과 동일하게 사용
1차 버젼으로 자주 쓰는 함수들만 작성해 놓았다.
그 외 CSocket(혹은 CAsyncSocket)에 있는 함수들은 시간날때 작성해 보도록 하자!
'프로그래밍 - Windows > MFC' 카테고리의 다른 글
| CListCtrl에서 전체 선택하도록 하는 법 (0) | 2007/08/17 |
|---|---|
| MFC의 CAsyncSocket 대용 소켓. (0) | 2007/07/06 |
| 클라이언트 프로그램 짤때의 충고!! (0) | 2007/07/03 |
AsyncSocketBase.zip