WSAAsyncSelect 模型
WSAAsyncSelect模型是winsock编程模型的一种,它提供了socket异步编程的方便,其实现是基于Windows消息机制的,最主要的就是下面这个函数:
int PASCAL FAR WSAAsyncSelect (SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent);
s 标识一个需要事件通知的套接口的描述符.
hWnd 标识一个在网络事件发生时需要接收消息的窗口句柄.
wMsg 在网络事件发生时要接收的消息.
lEvent位屏蔽码,用于指明应用程序感兴趣的网络事件集合.
1、服务器端
因此首先需要自定义一个消息
#define WM_SOCKET WM_USER + 1
并定义消息处理函数,以及做映射
// 声明消息处理函数
afx_msg LRESULT OnSocket(WPARAM wParam, LPARAM lParam);
// 映射
ON_MESSAGE(WM_SOCKET,OnSocket)
初始化socket
BOOL CSocketSeverDlg::InitNetwork()
{
WSADATA wsaData;
//初始化TCP协议
BOOL ret = WSAStartup(MAKEWORD(,), &wsaData);
if(ret != )
{
MessageBox("初始化网络协议失败!");
return FALSE;
}
//创建服务器端套接字
ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ServerSock == INVALID_SOCKET)
{
MessageBox("创建套接字失败!");
closesocket(ServerSock);
WSACleanup();
return FALSE;
}
//绑定到本地一个端口上
sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(); file://端口号不要与其他应用程序冲突
localaddr.sin_addr.s_addr = ;
if(SOCKET_ERROR = = bind(ServerSock ,(struct sockaddr*)&localaddr,sizeof(sockaddr)))
{
MessageBox("绑定地址失败!");
closesocket(ServerSock);
WSACleanup();
return FALSE;
}
//将SeverSock设置为异步非阻塞模式,并为它注册各种网络异步事件,其 中 m_hWnd
//为应用程序的主对话框或主窗口的句柄
if(SOCKET_ERROR == WSAAsyncSelect(ServerSock, m_hWnd, WM_SOCKET,
FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE))
{
MessageBox("注册网络异步事件失败!");
WSACleanup();
return FALSE;
}
//设置侦听模式
listen(ServerSock, );
return TRUE;
}
定义自定义消息处理函数
LRESULT CSocketSeverDlg::OnSocket(WPARAM wParam, LPARAM lParam)
{
//调用Winsock API函数,得到网络事件类型
int iEvent = WSAGETSELECTEVENT(lParam);
//调用Winsock API函数,得到发生此事件的客户端套接字
SOCKET CurSock= (SOCKET)wParam;
switch(iEvent)
{
case FD_ACCEPT:
//客户端连接请求事件
OnAccept(CurSock);
break;
case FD_CLOSE:
//客户端断开事件:
OnClose(CurSock);
break;
case FD_READ:
//网络数据包到达事件
OnReceive(CurSock);
break;
case FD_WRITE:
//发送网络数据事件
OnSend(CurSock);
break;
default: break;
}
return ;
}
2、客户端
用同样的方法建立一个客户端应用程序,初始化网络部分,不需要将套接字设置为监听模式。注册网络事件时没有FD_ACCEPT,但增加了FD_CONNECT事件,因此没有OnAccept函数,但增加了OnConnect函数,向服务器发出连接请求时,使用connect函数,连接成功后,会相应到OnConnect函数中。下面是OnConnect函数的定义,传进来的参数是客户端Socket和服务器端发回来的连接是否成功的标识。
void CSocketClientDlg::OnConnect(SOCKET CurSock, int error)
{
if( == error)
{
if(CurSock == ClientSock)
{
MessageBox("连接成功!");
}
}
}
定义OnReceive函数,处理网络数据到达事件
定义OnSend函数,处理发送网络数据事件
定义OnClose函数,处理服务器socket关闭事件
以上就是用基于windows消息机制的异步I/O模型实现服务器/客户端应用程序的基本方法。
3、我的疑问
我有一点不是很明白,那就是这个发送网络数据事件是什么意思?什么时候发生?是我们使用send函数发送数据时发生么,
未完待续。。。
WSAAsyncSelect 模型的更多相关文章
- 问题解决——WSAAsyncSelect模型 不触发 FD_CLOSE
		
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
 - WSAAsyncSelect模型
		
============================================== █ 异步选择(WSAAsyncSelect)模型是一个有用的异步 I/O 模型.利用这个模型,应用程序可在 ...
 - winsock编程WSAAsyncSelect模型
		
winsock编程WSAAsyncSelect模型 WSAAsyncSelect模型也称异步选择模型,其核心函数是WSAAsyncSelect.它可以用来在一个socket上接收以windows消息为 ...
 - WSAAsyncSelect模型触发不了FD_Close消息?
		
原帖链接: http://bbs.csdn.net/topics/330164174 楼主: Server用WSAAsyncSelect模型,Client关闭程序时(不进行shutdown与close ...
 - 基于WSAAsyncSelect模型的两台计算机之间的通信
		
任务目标 编写Win32程序模拟实现基于WSAAsyncSelect模型的两台计算机之间的通信,要求编程实现服务器端与客户端之间双向数据传递.客户端向服务器端发送"请输出从1到1000内所有 ...
 - Win32 API编程:网络编程在设置WSAAsyncSelect模型后connect的返回值问题
		
通过WSAAsyncSelect()可以设置非阻塞异步套接字 ::WSAAsyncSelect(s, hDlg, WM_SOCKET, FD_CONNECT | FD_CLOSE | FD_WRITE ...
 - 二.Windows I/O模型之异步选择(WSAAsyncSelect)模型
		
1.基于windows消息为基础的网络事件io模型.因此我们必须要在窗口程序中使用该模型.该模型中的核心是调用WSAAsyncSelect函数实现异步I/O. 2.WSAAsyncSelect函数:注 ...
 - Socket WSAAsyncSelect模型
		
::WSAAsyncSelect(sListen, hWnd, WM_SOCKET, FD_ACCEPT|FD_CLOSE); 自定义 WM_SOCKET消息 #include "../co ...
 - WSAAsyncSelect模型中,FD_WRITE事件什么时候触发?
		
当一个套接字连接被建立上时(包括客户端的connect(),connectex()等和服务器端的accept接收到后创建的新套接字),这时会触发FD_WRITE,以后就可以用send(),WSASen ...
 
随机推荐
- 解决java.lang.OutOfMemoryError: unable to create new native thread问题
			
解决:1.升级JVM到最新的版本 最新版本的JVM一般在内存优化方面做的更好,升级JVM到最新的版本可能会缓解测问题2.从操作系统层面去解决 使用64位操作系统 如果使用32位操作系统遇到unable ...
 - Fail Fast and Fail Safe Iterators in Java
			
https://www.geeksforgeeks.org/fail-fast-fail-safe-iterators-java/ Fail Fast and Fail Safe Iterators ...
 - 〖Linux〗Ubuntu13.10,声音图标调节音量失效的解决办法
			
升级Ubuntu13.10,发现声音图标不能调节音量[XUbuntu13.10发行日志]: 临时解决办法: gvim /usr/share/dbus-1/services/indicator-soun ...
 - 如何使用Dockerfile构建Tomcat镜像并部署war
			
我们都知道Docker构建一个镜像有两种方式: 使用`docker commit`命令 使用`Dockerfile`文件和`docker build`命令 那么这两种方式有何区别呢? 相同点:底层实现 ...
 - Tomcat路径下目录的介绍
			
本文转自:http://blog.csdn.net/u013132035/article/details/54949593 下图是TOMCAT的路径下目录的截图. 目录有:backup. ...
 - c语言格式大整理
			
1.C语言中,非零值为真,真用1表示:零值为假,假用0表示. 2.转义字符参考: \a 蜂鸣,响铃 \b 回退:向后退一格 \f 换页 \n 换行 \r 回车,光标到本行行首 \t 水平制表 \v 垂 ...
 - CYDIA装了个插件,想删除怎么都删除,电脑如何删除插件?
			
http://bbs.weiphone.com/read-htm-tid-3670917.html 装了个插件,想删除怎么都删除不掉不要跟我说在CYDIA里面删除.,在CYDIA里点击该插件就会闪退C ...
 - Web前端开发必备工具推荐
			
http://gaohaixian.blog.163.com/blog/static/12326010520114265223489/不管你做前端开发还是网页重构,前端工具都起着非常重要的作用,这里向 ...
 - 用Visual Studio 2010开发Android应用
			
在开发你的第一个Android应用程序之前,你应该先检查一下是否安装了Android SDK,以及是否创建好了Android模拟器(AVD),如果有不清楚的地方,请先看我以前发布的这篇文章“Andro ...
 - js 停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
			
在前端开发工作中,由于浏览器兼容性等问题,我们会经常用到“停止事件冒泡”和“阻止浏览器默认行为”. 1..停止事件冒泡 JavaScript代码 //如果提供了事件对象,则这是一个非IE浏览器if ( ...