您的位置:首页 > 理论基础 > 计算机网络

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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: