先看一看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!