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 , 。
: , 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제한된 크기의 디렉토리를 만드는 방법오늘 저는 장치에 공간이 없을 때 백업 중에 응용 프로그램이 어떻게 작동하는지 테스트(및 수정)하는 작업이 있습니다. 결과적으로 "남은 공간 없음"오류로 백업이 실패하면 새 파일이 없어야 합니다. 지금까지 문제를 재...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.