2008/09/18 08:58

편리한 Boost install - Windows binary package


Boost 의 Windows Binary Package를 제공해 주는 곳입니다.

VC버젼마다 별도의 인스톨 패키지를 제공해주니

편리하게 사용하실 수 있습니다.

VC 2008버젼까지 지원이 되는군요

http://www.boostpro.com/products/free

링크를 타주세요
Trackback 0 Comment 0
2008/08/29 10:06

IMarkupService 를 이용한 가벼운 MSHTML 파서

I have a lot of experience in programming low-level MSHTML and I always see questions on how one can use MSHTML to parse HTML and then access elements via the DOM.

Well, here it is. I use IMarkupServices provided by MSHTML. There is no need for an IOleClientSite or any sort of embedding. I think is is just about as light as anyone can get.

In future articles, I will be concentrating on the reuse of MSHTML in other aspects of programming. Such as using MSHTML as an editor, for example.

This code makes use of simple COM calls and nothing more. It can be easily adapted for ATL, MFC and VB, among other languages. Please don't ask me to provide samples in other languages. In order to build this you need the IE SDK

/******************************************************************
 * ParseHTML.cpp
 *
 *  ParseHTML: Lightweight UI-less HTML parser using MSHTML
 *
 *  Note: This is for accessing the DOM only. No image download,
 *        script execution, etc...
 *
 *  8 June 2001 - Asher Kobin (asherk@pobox.com)
 *
 *  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
 *  OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
 *  LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR
 *  FITNESS FOR A PARTICULAR PURPOSE.
 *
 *******************************************************************/

#include 
#include 

OLECHAR szHTML[] = OLESTR("Hello World!");

int __stdcall WinMain(HINSTANCE hInst,
                      HINSTANCE hPrev,
                      LPSTR lpCmdLine,
                      int nShowCmd)
{
  IHTMLDocument2 *pDoc = NULL;

  CoInitialize(NULL);

  CoCreateInstance(CLSID_HTMLDocument,
                   NULL,
                   CLSCTX_INPROC_SERVER,
                   IID_IHTMLDocument2,
                   (LPVOID *) &pDoc);

  if (pDoc)
  {
    IPersistStreamInit *pPersist = NULL;

    pDoc->QueryInterface(IID_IPersistStreamInit,
                       (LPVOID *) &pPersist);

    if (pPersist)
    {
      IMarkupServices *pMS = NULL;

      pPersist->InitNew();
      pPersist->Release();

      pDoc->QueryInterface(IID_IMarkupServices,
                              (LPVOID *) &pMS);

      if (pMS)
      {
        IMarkupContainer *pMC = NULL;
        IMarkupPointer *pMkStart = NULL;
        IMarkupPointer *pMkFinish = NULL;

        pMS->CreateMarkupPointer(&pMkStart);
        pMS->CreateMarkupPointer(&pMkFinish);

        pMS->ParseString(szHTML,
                         0,
                         &pMC,
                         pMkStart,
                         pMkFinish);

        if (pMC)
        {
          IHTMLDocument2 *pNewDoc = NULL;

          pMC->QueryInterface(IID_IHTMLDocument,
                              (LPVOID *) &pNewDoc);

          if (pNewDoc)
          {
            // do anything with pNewDoc, in this case
            // get the body innerText.

            IHTMLElement *pBody;
            pNewDoc->get_body(&pBody);

            if (pBody)
            {
              BSTR strText;

              pBody->get_innerText(&strText);
              pBody->Release();

              SysFreeString(strText);
            }

            pNewDoc->Release();
          }

          pMC->Release();
        }

        if (pMkStart)
            pMkStart->Release();

        if (pMkFinish)
          pMkFinish->Release();

        pMS->Release();
      }
    }

    pDoc->Release();
  }

  CoUninitialize();

  return TRUE;
}

* 출처 : http://www.codeguru.com/cpp/i-n/ieprogram/article.php/c4385/

Trackback 0 Comment 0
2008/08/27 20:49

mdb 암호깨기 소스

벼래별게 다 있다. MDB 암호깨기 소스 !!


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

FILE *mdb;

int XORTable97[14] =
{
    0x86,0xFB,0xEC,0x37,0x5D,0x44,0x9C,0xFA,
    0xC6,0x5E,0x28,0xE6,0x13,0xD8
};

int XORTable2000[20] = {
    0xffffffD3,0xffffffEC,0x8,0xffffff9C,0xffffff93,0x28,0x46,0xffffff8A,0x1,0x7b,
    0xffffffA0,0xffffffDF,0x22,0x13,0xffffff9A,0xffffffB1,0x61,0x79,0xffffffC7,0x7C
};

void Usage(char *szExe)
{
    printf("\n==================================================================");
    printf("\n\t이프로그램은 MS Acces97 및 2000에서 만들어진");
    printf("\n\t.mdb파일의 암호를 단방에 찾아내는 프로그램입니다.");
    printf("\n\tMS아이들 이프로그램보면 경악하실겁니다.");
    printf("\n\tMS아이들아, Access빨랑빨랑 업데이트해라!\n");
    printf("\n\t이용방법: %s .mdb파일이름 version",szExe);
    printf("\n\t\t\tversion:");
    printf("\n\t\t\t 97   - MS Access97");
    printf("\n\t\t\t 2000 - MS Access2000");
    printf("\n\t2003년 12월 18일 by KHN (kys197543@hotmail.com)\n");
    //장난
    printf("\n\t\t (\\_______/)");
    printf("\n\t\t  / @__@ \\");
    printf("\n\t\t (  (oo)  )");
    printf("\n\t\t  `-.~~.-'");
    printf("\n\t\t   /    \\  ");
    printf("\n\t\t @/      \\_");
    printf("\n\t\t(/ /    \\ \\)");
    printf("\n\t\t WW`----'WW");
    printf("\n==================================================================\n\n");
}

void GetPassword(int *szXORTable,int nLen,int step)
{  
    int i;
    char ch;

    printf("암호는 다음과같습니다 : ");
    for(i=0;i<nLen;i++)
    {
        if((ch=fgetc(mdb)^szXORTable[i])==0) break;
        fseek(mdb,step-1,SEEK_CUR);
        putchar(ch);
    }
    if(i==0) printf("(암호는 없습니다.)");
    putchar('\n');
}

int main(int argc, char *argv[])
{
    int ver;
    char szVer[5];

    Usage(argv[0]);

    if(argc<3)
    {
        exit(1);
    }

    strcpy(szVer,argv[2]);

    if((mdb=fopen(argv[1],"rb"))==NULL)
    {
        printf("%s 파일을 찾을수없습니다\n",argv[1]);
        exit(1);
    }

    fseek(mdb,0x42,SEEK_SET);
    ver = atoi(szVer);
    if (ver == 97)
        GetPassword(XORTable97,14,1);
    if (ver == 2000)
        GetPassword(XORTable2000,20,2);
    if (ver != 97 && ver != 2000)
        printf("version 값을 정확히 지적하십시요\n");
    fclose(mdb);
    return 0;
}


출처: http://kurapa.com

Trackback 0 Comment 0
2008/08/27 20:47

유니코드 <-> 안시 변환

 
1. 유니코드 기반에서 CString은 유니코드로생각하고 코딩해야한다.
 - 특히 WinCE기반 코딩을 할떄는 CString("blah blah") 이런형태를 써주면 지가 알아서 변환 해 준다.
 

2. 초기화 memset ---> wmemset 사용


3. 유니코드 -> 멀티바이트 코드

::WideCharToMultiByte(CP_ACP, 0, (LPCTSTR)strTitle, strTitle.GetLength(), szTitle, 1024, NULL, NULL);


4. 멀티바이트 코드 -> 유니코드
::MultiByteToWideChar(CP_UTF8, 0, tmDirInfo.fileName, strlen(tmDirInfo.fileName), szBuffer, sizeof(szBuffer));


출처: http://kurapa.com

Trackback 0 Comment 0
2008/08/27 20:44

ie 쿠키굽기

#include "wininet.h" /* You should link [wininet.lib] also */

.
.
.


BOOL bReturn;

// Create a session cookie.
bReturn = InternetSetCookie("http://www.adventure_works.com", NULL,
           "TestData = Test");

// Create a persistent cookie.
bReturn = InternetSetCookie("http://www.adventure_works.com", NULL,
            "TestData = Test; expires = Sat, 01-Jan-2999 00:00:00 GMT");

출처: http://kurapa.com

Trackback 0 Comment 0
2008/08/18 15:30

nafxcwd.lib(afxmem.obj) : 오류 LNK2005

CRT(C 런타임) 라이브러리와 MFC(Microsoft Foundation Class) 라이브러리가 잘못된 순서로 링크되면 다음과 비슷한 LNK2005 오류가 발생할 수 있습니다.

nafxcwd.lib(afxmem.obj) : 오류 LNK2005:
"void * __cdecl operator new(unsigned int)"(??2@YAPAXI@Z)이(가)
LIBCMTD.lib(new.obj)에 이미 정의되어 있습니다.

nafxcwd.lib(afxmem.obj) : 오류 LNK2005:
"void __cdecl operator delete(void *)"(??3@YAXPAX@Z)이(가)
LIBCMTD.lib(dbgnew.obj)에 이미 정의되어 있습니다.

nafxcwd.lib(afxmem.obj) : 오류 LNK2005:
"void * __cdecl operator new(unsigned int,int,char const *,int)"
(??2@YAPAXIHPBDH@Z)이(가) LIBCMTD.lib(dbgnew.obj)에 이미 정의되어 있습니다.

mfcs40d.lib(dllmodul.obj): 오류 LNK2005: _DllMain@12이(가)
MSVCRTD.LIB (dllmain.obj)에 이미 정의되어 있습니다.

mfcs42d.lib(dllmodul.obj): 오류 LNK2005: _DllMain@12이(가)
msvcrtd.lib(dllmain.obj)에 이미 정의되어 있습니다.



원인
CRT 라이브러리는 new, delete 및 DllMain 함수에 대해 약한 외부 링크를 사용합니다. MFC 라이브러리에도 new, delete 및 DllMain 함수가 포함되어 있어 CRT 라이브러리 전에 MFC를 링크해야 합니다.


해결 방법
이 문제를 해결할 수 있는 방법에는 두 가지가 있습니다. 첫 번째 해결 방법은 링커가 올바른 순서로 라이브러리를 강제 링크하도록 하는 것입니다. 두 번째 해결 방법은 문제를 일으키는 모듈을 찾아 해결하는 것입니다.
해결 방법 1: 링커가 올바른 순서로 라이브러리를 강제 링크하는 방법
1. Project 메뉴에서 Settings을 눌러 Project Settings 대화 상자를 엽니다.
2. Settings For 뷰에서 링크 오류가 발생하는 프로젝트 구성을 선택(강조 표시)합니다.
3. Link 탭을 누릅니다.
4. Category 콤보 상자에서 INPUT을 선택합니다.
5. Ignore Libraries 입력란에 라이브러리 이름(예: Nafxcwd.lib Libcmtd.lib)을 입력합니다.
   참고: 링커 명령줄은 /NOD:과 동일합니다.
6. Object/library Modules 입력란에 라이브러리 이름을 입력합니다. 이 이름은 반드시 해당 행의 처음 두 라이브러리(예: Nafxcwd.lib Libcmtd.lib)와 같은 순서대로 나열되어야 합니다.
Visual C++ .NET에서 이 옵션을 설정하려면 온라인 도움말의 Visual C++ 프로젝트 속성 설정 항목을 참조하십시오.
해결 방법 2: 문제 모듈을 찾아 해결하는 방법
다음 단계를 수행하여 현재 라이브러리 링크 순서를 확인합니다.
1. Project 메뉴에서 Settings을 눌러 Project Settings 대화 상자를 엽니다.
2. Settings For 뷰에서 링크 오류가 발생하는 프로젝트 구성을 선택(강조 표시)합니다.
3. Link 탭을 누릅니다.
4. Project Options 대화 상자에 다음을 입력합니다.
   /verbose:lib
5. 프로젝트를 다시 빌드합니다. 링크하는 과정에서 출력 창에 라이브러리가 표시됩니다.


현재 상태
이것은 의도적으로 설계된 동작입니다.


추가 정보
MFC 라이브러리를 사용할 때는 MFC 라이브러리가 CRT 라이브러리 전에 링크되도록 해야 합니다. 이렇게 하려면 프로젝트에 있는 모든 파일이 직접(#include ) 또는 간접(#include )적으로 먼저 MsdevMfcIncludeAfx.h를 포함하도록 합니다. Afx.h 포함 파일은 #pragma 주석(lib,"") 지시어를 사용하여 라이브러리의 순서를 올바르게 조정합니다.

원본 파일 확장명이 .c이거나 파일 확장명이 .cpp이지만 MFC를 사용하지 않는 경우 모듈 맨 위에 작은 헤더 파일(Forcelib.h)을 만들어 포함시킬 수 있습니다. 이 새로운 헤더가 라이브러리 검색 순서를 올바르게 합니다.

Visual C++에는 이 헤더 파일이 들어 있지 않지만 다음 단계를 수행하여 이 파일을 쉽게 만들 수 있습니다.
MsdevMfcIncludeAfx.h를 엽니다.
#ifndef _AFX_NOFORCE_LIBS와 #endif //!_AFX_NOFORCE_LIBS 사이의 행을 선택합니다.
선택 영역을 Windows 클립보드로 복사합니다.
새 텍스트 파일을 만듭니다.
클립보드 내용을 새 파일에 붙여넣습니다.
파일을 MsdevMfcIncludeForcelib.h로 저장합니다.
Trackback 0 Comment 0
2008/08/17 04:45

windows 에서 막혀버린 Raw socket...

Winxp sp2 이상의 플랫폼에서는

Raw소켓(IP레벨)이 보안상의 이유로 막히게 되었습니다.

Windows vista 레벨에서는 ndis를 다른 이름으로 패킹하여

서비스를 제공하는 것으로 봤던 기억이 있는데.

이름이 가물가물..

암튼 NDIS 나 WinPcap을 사용해야 합니다.
Trackback 0 Comment 0
2008/08/17 04:38

vc Windows application winpcap 라이브러리 사용시 인크루드 순서

#include <winsock2.h>
#include <windows.h>
#define WPCAP
#define HAVE_REMOTE
#include <pcap.h>

winsock2.h 를 가장 먼저 인크루드 한후
define을 잊지 마시길...



자세한건 직접..
http://www.winpcap.org/docs/docs_40_2/html/group__wpcapsamps.html
Trackback 0 Comment 0
2008/08/17 04:33

같은 네트워크 대역인지 판별하는 Pseudo code


본 pseudo code는 보통 OS상의 네트워크 커널(IP Stack)에서 기본적으로 포함되어 있는 코드입니다.

raw level 프로그래밍 차원에서 구현하시길....



class MyNetwork
{
public:
  UINT32 MyIP; // 나의 아이피
  UINT32 MySubnetMask; // 나의 SubnetMask
  UINT32 MyGatewayIP: // 나의 GatewayIP

  bool IsSameLanIP(UINT32 IP); // 같은 랜에 있는 IP이냐?
  UINT32 GetAdjIP(UINT32 IP); // 해당 IP와 연관되어 실제 통신을 해야 할 근접(adjacent) IP를 얻어 오는 함수
};

bool MyNetwork::IsSameLanIP(UINT32 IP)
{
  return (MyIP & MySubnetMask) == (IP & MySubnetMask);
}

UINT32 MyNetwork::GetAdjIP(UINT32 IP)
{
  if (IsSameLanIP(IP))
    return IP;
  else
    return MyGatewayIP;
}
Trackback 0 Comment 0
2008/08/17 04:11

md5 복호화 -_-;;;

md5의 hash를 어떻게 알아냈을까요 ㅡ.ㅡ;;

한번 둘러 봅쉬다....

128bit 암호를 db화 하려면 ㅡㅡ;;

http://md5.rednoize.com/
Trackback 0 Comment 0
2008/08/16 18:14

Win32의 WinMain() 최소 소스 (WinMain minimal source)

사용자 삽입 이미지















 콘솔프로그래밍처럼 한번에 외워서 칠만한 내용이 아니기에
늘 카피 페이스트를 하는 기본 골격 소스이다.

Visual Studio 환경에서 테스트가 완료된 소스이다.

컴파일후 실행시켜 보면 다음 이미지와 같은 썰렁한 윈도우가 나타난다..

흔하디 흔한 Hello world 문구도 없다!







#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass=TEXT("MinimalSource");

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
    ,LPSTR lpszCmdParam,int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_hInst=hInstance;
 
 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=lpszClass;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW | CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  NULL,(HMENU)NULL,hInstance,NULL);
 ShowWindow(hWnd,nCmdShow);
 
 while (GetMessage(&Message,NULL,0,0)) {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return (int)Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 switch (iMessage) {
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}






작성자 John.



Trackback 0 Comment 0
2008/08/16 17:59

동적 웹브라우져 생성 및 이벤트 핸들러 후킹

문서 최초 작성일시 2008.02.

동적 웹브라우져 생성에 관련된 내용만 정리 되었으며 이벤트 후킹은
소스는 작성되었으나 아직 정리하지 못하였다.
Visual Studio 2005 에서 테스트가 완료된 내용이다.




[WEB BROWSER 생성]

            static IWebBrowser2*   pWebBrowser = NULL;

            ::CoInitialize( NULL );
            HRESULT hr = ::CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&pWebBrowser);

            IOleInPlaceSite* ttt;

            WCHAR URL[126]= L"http://www.empas.com";

            VARIANT v;

            VariantInit( &v );

            v.vt = VT_BSTR;

            v.bstrVal = SysAllocString(URL);

            VARIANT vtEmpty;

            ::VariantInit(&vtEmpty); // Variant 초기화

            pWebBrowser->put_Height(800);
            pWebBrowser->put_Width(600);
            pWebBrowser->put_ToolBar(VARIANT_FALSE); // 익스플로어 툴바 없앰
            pWebBrowser->put_MenuBar(VARIANT_FALSE); // 메뉴바 없앰
            pWebBrowser->put_AddressBar(VARIANT_FALSE); // 주소창 없앰
            pWebBrowser->put_StatusBar(VARIANT_FALSE); // 상태바 없앰
            pWebBrowser->put_Visible(VARIANT_TRUE);

            HRESULT hr2 = pWebBrowser->Navigate2( &v, &vtEmpty, &vtEmpty, &vtEmpty, &vtEmpty );

     SysFreeString(v.bstrVal);





작성자  John.

Trackback 0 Comment 0
2008/08/16 17:56

커널컴파일 및 커널 모듈 작성 기본 정리

문서 작성일시 2008.03. 기준

다음 사항은 데비안 Netinstall 최소버젼으로 설치후 테스트해 본 내용이다.


1-1. 전체 : make

1-2. 일부 : make bzImage

2. cp arch/i386/boot/bzImage /boot/newcall-2.6.14

3. /boot/grub/menu.1st 추가

 title  Debian GNU/Linux,newcall 2.6.14.6
 root [hd0, 0]
 kernel /boot/newcall-2.6.14 root=/dev/hda1 ro
 savedefault
 boot


커널 프로그램 작성


사용자 응용프로그램 컴파일
 gcc -I/usr/src/linux-2.6.14.6/include newcall_test.c -o newcall_test
 gcc -I/usr/src/linux-`uname -r`/include newcall_test.c -o newcall_test


커널 모듈 작성

 1. Source file 작성 : in any where

 2. Make file 작성
  KERNELDIR = /lib/modules/$(shell uname -r)/build
  obj-m = hello_kernel_module.o
  KDIR := /lib/modules/$(shell uname -r)/build
  PWD  := $(shell pwd)
  default:
   $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
  clean:
   rm -rf *.ko
   rm -rf *.mod.*
   rm -rf .*.cmd
   rm -rf *.o


 3. Module load
  1) lsmod 로 확인
  2-1) 2.6 insmod hello.ko
  2-2) 2.4 insmod hello.o
 
  ※ 만일 QM_MODULE: Function not implemented 오류 메시지가 뜰 경우
   apt-get install module-init-tools 로 설치 (2.6커널에서는 사용하지 않음으로 되어 있음)
   따라서 make menuconfig 를 실행하여
   Loadable module support-->
    [*] Enable loadable module support
    [*] Module unloading
    [*]  Forced module unloading
    [ ] Module version support [EXPERIMENTAL)
    [ ] Source checksum for all modules
    [*] Automatic kernel module loading
   커널빌드 => 커널 이미지 복사 => 재부팅후 => insmod !


커널로 노출된 전역 함수 찾기
 grep add /proc/kallsyms


커널 메세지 모니터링
 cat /proc/kmsg



작성자 John.

Trackback 0 Comment 0
2008/08/16 17:52

WSAAsyncSelect

TCP/IP 서버 작성 방법중
비동기 이벤트 방식중 가장 많이 사용되는 WSAAsyncSelect 함수를 사용한
서버 작성 방식을 설명한다.
기본 플랫폼은 Win32 API 를 기준으로
메세지 크래커를 사용한다.




[전역변수 생성]
SOCKET g_hServerSocket = INVALID_SOCKET, g_hClientSocket = INVALID_SOCKET;

HANDLE_MSG( hwnd, WM_SOCKETEVENT, OnSocketEvent );

#define HANDLE_WM_SOCKETEVENT(hwnd,wParam,lParam,fn)\
 ((fn)((hwnd), (SOCKET)(wParam),LOWORD(lParam),HIWORD(lParam)), 0L)

[서버소켓생성]

// 소켓 초기화
WSADATA wsaData;
WSAStartup( MAKEWORD( 2, 2 ), &wsaData );


// 서버 소켓 생성
g_hServerSocket = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP );

// 로컬호스트 주소와 결합
sockaddr_in ServerAddr;
ZeroMemory( &ServerAddr, sizeof( ServerAddr ) );

ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.s_addr = INADDR_ANY;
ServerAddr.sin_port = htons( CHATTINGPORT );

bind( g_hServerSocket, (sockaddr *) &ServerAddr, sizeof( ServerAddr ) );

// 대기 모드로 진입
listen( g_hServerSocket, SOMAXCONN );

// 서버 소켓을 넌블로킹 소켓으로 전환
// 클라이언트 연결만 처리하고, 소켓에 읽고 쓰기는 클라이언트 소켓에 대해 지정합니다.
WSAAsyncSelect( g_hServerSocket, hwnd, WM_SOCKETEVENT, FD_ACCEPT );


[이벤트 핸들러]

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

 switch (message)
 {
  HANDLE_MSG( hwnd, WM_DESTROY, OnDestroy );
  HANDLE_MSG( hwnd, WM_CREATE, OnCreate );
  HANDLE_MSG( hwnd, WM_SOCKETEVENT, OnSocketEvent );
 }

 return DefWindowProc(hwnd, message, wParam, lParam);
}

void OnSocketEvent( HWND hwnd, SOCKET socket, int nEvent, int nErrorCode )
{
 switch(nEvent)
 {
 case FD_ACCEPT:
  TRACE( "\nFD_ACCEPT" );
  OnAccept(hwnd, socket);
  break;
 case FD_READ:
  TRACE("\nFD_READ");
  OnRead(hwnd, socket);
  break;
 case FD_CLOSE:
  TRACE("\nFD_CLOSE");
  OnClose(hwnd, socket);
  break;
 }


}


void OnAccept(HWND hwnd, SOCKET socket)
{
 sockaddr_in ClientAddr;
 int nAddrLen = sizeof(ClientAddr);

 g_hClientSocket = accept( socket, (sockaddr*)&ClientAddr, &nAddrLen );

 closesocket(socket);
 g_hServerSocket = INVALID_SOCKET;

 WSAAsyncSelect( g_hClientSocket, hwnd, WM_SOCKETEVENT, FD_READ|FD_CLOSE );
}

void OnRead(HWND hwnd, SOCKET socket)
{
 char pBuf[1024];
 int nReceived = recv(socket, pBuf+1, sizeof(pBuf)-2, 0);

 pBuf[0] = '\t';
 pBuf[nReceived+1] = '\0';

 TRACE( pBuf );


}

void OnClose( HWND hwnd, SOCKET socket )
{
 closesocket(socket);
 g_hClientSocket = INVALID_SOCKET;


}


[종료]
 WSACleanup();




 

Trackback 0 Comment 0