WSAAsyncSelect 모델 사용

WSAAsyncSelect 모델 사용
WSAAsyncSelect는 이름을 듣는 것이 비동기적인 선택인 것 같지만 실제로는 윈도우즈 메시지 메커니즘을 기반으로 한 모델이다.MFC의 창 프로그램이라면 사용하기에 매우 편리하다.
이 모델을 사용하려면 창이 필요합니다. 이 함수를 통해 socket과 처리할 IO 이벤트를 메시지를 창에 전달하고 창 프로세스 함수에서 네트워크 이벤트를 처리합니다.
 
다음은 함수의 원형입니다.
int WSAAsyncSelect(
  SOCKET s,   HWND hWnd,   unsigned int wMsg,   long lEvent
);
              socket ,             ,            
        ,          , WM_USER           。     
          :FD_READ,FD_CONNECT,FD_WRITE,FD_ACCEPT,FD_CLOSE   。
  //        WSAAsyncSlecet       
bool ServerClass::StartWSAAsyncSelcetServer(int nType, sockaddr_in addr)
{
	SOCKET   socket_listen=socket(AF_INET,nType,0);
    if (socket_listen==INVALID_SOCKET)
    {
		cout<<"        socket  "<<endl;
		return  false;
    } 
    else
    {
		cout<<"        socket  "<<endl;
    }

	int  iRet=bind(socket_listen,(sockaddr*)&addr,sizeof(sockaddr));
    if (iRet!=0)
    {
		cout<<"    bind  "<<endl;
		return  false;
    } 
    else
    {
		cout<<"    bind  "<<endl;
    }

	iRet=listen(socket_listen,SOMAXCONN);
	if (iRet!=0)
	{
		cout<<"    listen     "<<endl;
		return false;
	}
	else
	{
		cout<<"    listen     "<<endl;
	}
    

	u_long  len=1;
	iRet=ioctlsocket(socket_listen,FIONBIO,&len);
    if (iRet!=0)
    {
		cout<<"            "<<endl;
        return false;
	}
    else
    {
		cout<<"            "<<endl;
    }

	//      io   
	CMyDilag  dlg;
	dlg.Create((UINT)IDD_DIALOG1);
	dlg.ShowWindow(SW_SHOW);
    HWND  hwnd=dlg.GetSafeHwnd();
	if (hwnd==NULL)
	{
		cout<<"        "<<endl;
		return false;
	} 
	else
	{
		cout<<"        "<<endl;
	}







	iRet=WSAAsyncSelect(socket_listen,hwnd,WM_IOHANDLE,FD_ACCEPT|FD_CLOSE);
    if (iRet!=0)
    {
		cout<<"WSAASyncSelect   "<<endl;
		return false;
    } 
    else
    {
		cout<<"WSAAsyncSelect   "<<endl;
    }

	//      
	MSG  msg;
	while (GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	Sleep(1000*100);
	


	return true;
}
 
 CMyDilag          Dlg,     WM_IOHANDLE     ,
#define   WM_IOHANDLE   WM_USER+100
     :OnIoHandle
OnIoHandle      :
 // CMyDilag       
LRESULT  CMyDilag::OnIoHandle(WPARAM wParam,LPARAM lParam)
{
	SOCKET  socket=(SOCKET)wParam;

	if (HIWORD(lParam))
	{
		//      
		::closesocket(socket);
		return 0;
	} 
	else
	{
		switch(LOWORD(lParam))
		{
		case FD_ACCEPT:
			{
				cout<<"            "<<endl;

				SOCKET socket_client=accept(socket,NULL,NULL);
				if (socket_client!=INVALID_SOCKET)
				{
					WSAAsyncSelect(socket_client,m_hWnd,WM_IOHANDLE,FD_READ|FD_WRITE|FD_CLOSE);
				}
				break;
			}
		case FD_READ:
			{
				char szBuffer[MAX_PATH]={0};
				if (recv(socket,szBuffer,MAX_PATH,0)>0)
				{
					cout<<"     :"<<szBuffer<<endl;
				}
				break;
			}
		case FD_WRITE:
			{
				break;
			}
		case FD_CLOSE:
			{
				closesocket(socket);
				break;
			}
		}
	}

	return  1;

} 
 
 WSAAsyncSelect     : windows         ,          。
     :         ,       。

좋은 웹페이지 즐겨찾기