TCP,UDP IO模型(一)WSAAsyncSelect 异步选择
2008-08-21 21:23
956 查看
先看一看MSDN里WSAAsyncSelect函数结构
int WSAAsyncSelect(
__in SOCKET s, //要实现异步的套接字
__in HWND hWnd, //窗体句柄
__in unsigned int wMsg, //消息
__in long lEvent //响应的事件
);
从TCP服务端通信开始,建立好套接字后就可以实现异步绑定
//m_Listen = socket(/*TCP*/)
//1.绑定
int nErr = WSAAsyncSelect(m_Listen,this->m_hWnd,WM_SOCKET,FD_ACCEPT);
//然后还是listen..
//2.创建消息函数,这一步很重要,我觉得这个异步选择函数很能体现Windows程序的风格
// .0 在头文件里定义消息标识
#define WM_SOCK WM_USER + 1
// .1 声明消息函数
afx_msg LRESULT OnSocket(WPARAM pParam,LPARAM lParam);
// .2 实现
LRESULT CServerDlg::OnSocket(WPARAM wParam,LPARAM lParam)
{
SOCKET sock = (SOCKET)wParam;
int nErr = WSAGETSELECTERROR(lParam);
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
if (nErr == WSAENETDOWN)
{
AfxMessageBox(_T("The network subsystem failed"));
break;
}
//建立accept
ClientSocket = accept(sock,(SOCKADDR*)&m_addrClient,&len);
//在这里可以将套接字和其它事件处理绑定,比如FD_READ,FD_CLOSE
WSAAsyncSelect(ClientSocket,this->m_hWnd,WM_SOCKET,FD_READ|FD_CLOSE);
//....
break;
case FD_READ:
//接收客户消息
TCHAR szBuf[MAX_PATH] = {0};
int nRecv = recv(ClientSocket,(char*)szBuf,MAX_PATH*sizeof(TCHAR),0);
//显示等...
break;
case FD_CLOSE;
//客户关闭
break;
}
//别外TCP客户端也可以做成异步选择模式,只不过不是accept而connect,在此就略下了..
//对于UDP服务端的建立,其实和基本通信建立基本相同,
//再加上异步选择和TCP建立对照很容易就能写出来。
//1.先建立套接字m_Listen = socket(/*UDP*/)
//2.异步选择
int nErr = WSAAsyncSelect(m_Listen,this->m_hWnd,WM_SOCKET,FD_READ|FD_CLOSE);
//3.消息处理函数,同TCP,这里略写
LRESULT CServerDlg::OnSocket(WPARAM wParam,LPARAM lParam)
{
SOCKET sock = (SOCKET)wParam;
switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ:
TCHAR szBuf[MAX_PATH] = {0};
int nRead = recvfrom(sock,(char*)szChat,
MAX_PATH*sizeof(TCHAR),
0,(SOCKADDR*)&m_addrClient,&len);
//显示等...
break;
}
}
//客户端也同样可以做成异步选择模式,这里略掉吧。
今天总结的这个模型WSAAsyncSelect,我认为是最简单的一个,也是我们最一开始学习网络编程易上手的一个模型。
以后介绍的几个都要与线程有关,关于线程也想总结一些,但总觉得自己对线程其实不是很了解,现在做的一个小项目
用到了线程和网络通信,线程快把人烦死了,主要问题就是在线程里不要调用使用线程的内容,尤其当你调试线程时,不然
电脑很有可能会崩起个没完,不得不重启。好像是VS2005编译器的问题,不是很清楚耶。
先写到这儿吧,明天总结什么呢?想不起来了,今天忙活了一天,头都大了。...UP!UP!
int WSAAsyncSelect(
__in SOCKET s, //要实现异步的套接字
__in HWND hWnd, //窗体句柄
__in unsigned int wMsg, //消息
__in long lEvent //响应的事件
);
从TCP服务端通信开始,建立好套接字后就可以实现异步绑定
//m_Listen = socket(/*TCP*/)
//1.绑定
int nErr = WSAAsyncSelect(m_Listen,this->m_hWnd,WM_SOCKET,FD_ACCEPT);
//然后还是listen..
//2.创建消息函数,这一步很重要,我觉得这个异步选择函数很能体现Windows程序的风格
// .0 在头文件里定义消息标识
#define WM_SOCK WM_USER + 1
// .1 声明消息函数
afx_msg LRESULT OnSocket(WPARAM pParam,LPARAM lParam);
// .2 实现
LRESULT CServerDlg::OnSocket(WPARAM wParam,LPARAM lParam)
{
SOCKET sock = (SOCKET)wParam;
int nErr = WSAGETSELECTERROR(lParam);
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
if (nErr == WSAENETDOWN)
{
AfxMessageBox(_T("The network subsystem failed"));
break;
}
//建立accept
ClientSocket = accept(sock,(SOCKADDR*)&m_addrClient,&len);
//在这里可以将套接字和其它事件处理绑定,比如FD_READ,FD_CLOSE
WSAAsyncSelect(ClientSocket,this->m_hWnd,WM_SOCKET,FD_READ|FD_CLOSE);
//....
break;
case FD_READ:
//接收客户消息
TCHAR szBuf[MAX_PATH] = {0};
int nRecv = recv(ClientSocket,(char*)szBuf,MAX_PATH*sizeof(TCHAR),0);
//显示等...
break;
case FD_CLOSE;
//客户关闭
break;
}
//别外TCP客户端也可以做成异步选择模式,只不过不是accept而connect,在此就略下了..
//对于UDP服务端的建立,其实和基本通信建立基本相同,
//再加上异步选择和TCP建立对照很容易就能写出来。
//1.先建立套接字m_Listen = socket(/*UDP*/)
//2.异步选择
int nErr = WSAAsyncSelect(m_Listen,this->m_hWnd,WM_SOCKET,FD_READ|FD_CLOSE);
//3.消息处理函数,同TCP,这里略写
LRESULT CServerDlg::OnSocket(WPARAM wParam,LPARAM lParam)
{
SOCKET sock = (SOCKET)wParam;
switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ:
TCHAR szBuf[MAX_PATH] = {0};
int nRead = recvfrom(sock,(char*)szChat,
MAX_PATH*sizeof(TCHAR),
0,(SOCKADDR*)&m_addrClient,&len);
//显示等...
break;
}
}
//客户端也同样可以做成异步选择模式,这里略掉吧。
今天总结的这个模型WSAAsyncSelect,我认为是最简单的一个,也是我们最一开始学习网络编程易上手的一个模型。
以后介绍的几个都要与线程有关,关于线程也想总结一些,但总觉得自己对线程其实不是很了解,现在做的一个小项目
用到了线程和网络通信,线程快把人烦死了,主要问题就是在线程里不要调用使用线程的内容,尤其当你调试线程时,不然
电脑很有可能会崩起个没完,不得不重启。好像是VS2005编译器的问题,不是很清楚耶。
先写到这儿吧,明天总结什么呢?想不起来了,今天忙活了一天,头都大了。...UP!UP!
相关文章推荐
- Windows操作系统I/O模型—笔记2(异步选择(WSAAsyncSelect)模型)
- 二、异步选择模型(WSAAsyncSelect)
- Socket I/O模型之异步选择(WSAAsyncSelect)
- 异步选择模型WSAAsyncSelect
- WSAAsyncSelect和windows客户端异步IO模型
- Socket I/O模型之异步选择(WSAAsyncSelect)
- Socket I/O模型之异步选择(WSAAsyncSelect)(转)
- [置顶] WinSock 异步I/O模型[2]---异步选择 - WSAAsyncSelect
- (二)Socket I/O模型之异步选择(WSAAsyncSelect)
- Winsock异步模型之(事件通知模型 WSAAsyncSelect)
- 异步选择WSAAsyncSelect
- IO模型(二)WSAEventSelect--事件选择机制
- WinSock---WSAAsyncSelect IO模型和select模型的比较
- 【网络编程】之八、异步选择WSAAsyncSelect
- [置顶] WinSock 异步I/O模型[3]---事件选择 - WSAEventSelect
- 异步选择WSAAsyncSelect
- WSAAsyncSelect异步套接字模型Client——》Server
- 【网络编程】之八、异步选择WSAAsyncSelect
- Winsock异步事件通知模型WSAAsyncSelect
- WSAAsyncSelect 异步I/O模型