WSAAsyncSocket模型示例

 
   
#include < WINSOCK2.H >
#pragma comment(lib,"ws2_32")

class CInitSock
{
public :
CInitSock(BYTE minorVer
= 2 ,BYTE majorVer = 2 )
{
WSADATA wsaData;
WORD sockVersion
= MAKEWORD(minorVer,majorVer);
if (WSAStartup(sockVersion, & wsaData) != 0 )
{
exit(
0 );
}
if ( LOBYTE( wsaData.wVersion ) != minorVer || HIBYTE( wsaData.wVersion ) != majorVer )
{
WSACleanup( );
exit(
0 );
}
}
~ CInitSock()
{
::WSACleanup();
}
};
 
   
#include " CInitSocket.h "
#include
< iostream >
#define WM_SOCKET WM_USER+1
LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
CInitSock initsock;
using namespace std;
int main()
{
char szClassName[] = " king " ;
// 创建窗口类
WNDCLASSEX wndclass;
wndclass.cbSize
= sizeof (WNDCLASSEX);
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
= NULL;
wndclass.lpfnWndProc
= WindowProc;
wndclass.lpszClassName
= szClassName;
wndclass.lpszMenuName
= NULL;
wndclass.style
= CS_HREDRAW | CS_VREDRAW;
wndclass.hIconSm
= NULL;

// 注册窗口类
RegisterClassEx( & wndclass);
// 创建主窗口
HWND hWnd = CreateWindowEx( 0 ,
" king " ,
"" ,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
NULL,
NULL);
if (NULL == hWnd)
{
MessageBox(NULL,
" 创建窗口出错! " , " error " ,MB_OK);
return - 1 ;
}
USHORT nPort
= 4567 ;
SOCKET ListenSocket
= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in addrin;
addrin.sin_addr.S_un.S_addr
= htonl(INADDR_ANY);
addrin.sin_family
= AF_INET;
addrin.sin_port
= nPort;
if (SOCKET_ERROR == bind(ListenSocket,(sockaddr * ) & addrin, sizeof (sockaddr)))
{
cout
<< " 监听失败! \n " ;
return - 1 ;
}

// 将套接字设为窗口桃子类型
WSAAsyncSelect(ListenSocket,hWnd,WM_SOCKET,FD_ACCEPT | FD_CLOSE);
listen(ListenSocket,
5 );

// 从消息队列中取出消息
MSG msg;
while (GetMessage( & msg,NULL, 0 , 0 ))
{
TranslateMessage(
& msg);
DispatchMessage(
& msg);
}
return msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg) // 确定是哪类消息
{
case WM_SOCKET:
{
SOCKET sock
= wParam; // 取得有事件发生的套接字句柄
// 查看是否出错
if (WSAGETSELECTERROR(lParam)) // #define WSAGETSELECTERROR(lParam) HIWORD(lParam)
{
closesocket(sock);
return 0 ;
}
// 处理发生的事件
switch (WSAGETSELECTEVENT(lParam)) // #define WSAGETSELECTEVENT(lParam) LOWORD(lParam)
{
case FD_ACCEPT: // 监听中的套接字检查到有连接进入
{
SOCKET NewSock
= accept(sock,NULL,NULL); // 这里只作为演示,不保留地址什么的
WSAAsyncSelect(NewSock,hWnd,WM_SOCKET,FD_READ | FD_WRITE | FD_CLOSE);
}
break ;
case FD_WRITE:
{
// do something
} break ;
case FD_READ:
{
char szText[] = { 0 };
if (SOCKET_ERROR == recv(sock,szText, 1024 , 0 ))
{
closesocket(sock);
}
else
{
cout
<< " 接受数据: " << szText << endl;
}
}
break ;
case FD_CLOSE:
{
closesocket(sock);
}
break ;
}
}
return 0 ;
case WM_DESTROY:
PostQuitMessage(
0 );
return 0 ;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值