TCP,UDP IO模型(一)WSAAsyncSelect 异步选择

来源:互联网 发布:淘宝装米礼品盒 编辑:程序博客网 时间:2024/05/16 00:57
                   先看一看MSDN里WSAAsyncSelect函数结构
  1. int WSAAsyncSelect(
  2.   __in          SOCKET s,           //要实现异步的套接字
  3.   __in          HWND hWnd,          //窗体句柄
  4.   __in          unsigned int wMsg,  //消息
  5.   __in          long lEvent         //响应的事件
  6. );
  7. 从TCP服务端通信开始,建立好套接字后就可以实现异步绑定
  8. //m_Listen = socket(/*TCP*/)
  9. //1.绑定
  10. int nErr = WSAAsyncSelect(m_Listen,this->m_hWnd,WM_SOCKET,FD_ACCEPT);
  11. //然后还是listen..
  12. //2.创建消息函数,这一步很重要,我觉得这个异步选择函数很能体现Windows程序的风格
  13. // .0 在头文件里定义消息标识
  14. #define WM_SOCK  WM_USER + 1
  15. // .1 声明消息函数
  16. afx_msg LRESULT OnSocket(WPARAM pParam,LPARAM lParam);
  17. // .2 实现 
  18. LRESULT CServerDlg::OnSocket(WPARAM wParam,LPARAM lParam)
  19. {
  20.     SOCKET sock = (SOCKET)wParam;
  21.     int nErr = WSAGETSELECTERROR(lParam);
  22.     switch(WSAGETSELECTEVENT(lParam))
  23.     {
  24.     case FD_ACCEPT:
  25.     if (nErr == WSAENETDOWN)
  26.     {
  27.         AfxMessageBox(_T("The network subsystem failed"));
  28.         break;
  29.     }
  30.          //建立accept
  31.     ClientSocket = accept(sock,(SOCKADDR*)&m_addrClient,&len);
  32.          //在这里可以将套接字和其它事件处理绑定,比如FD_READ,FD_CLOSE
  33.          WSAAsyncSelect(ClientSocket,this->m_hWnd,WM_SOCKET,FD_READ|FD_CLOSE);
  34.          //....
  35.          break;
  36.     case FD_READ:
  37.          //接收客户消息
  38.          TCHAR szBuf[MAX_PATH] = {0};
  39.          int nRecv = recv(ClientSocket,(char*)szBuf,MAX_PATH*sizeof(TCHAR),0);
  40.          //显示等...
  41.          break;
  42.     case FD_CLOSE;
  43.          //客户关闭
  44.          break;
  45. }
  46. //别外TCP客户端也可以做成异步选择模式,只不过不是accept而connect,在此就略下了..  
    1. //对于UDP服务端的建立,其实和基本通信建立基本相同, 
    2. //再加上异步选择和TCP建立对照很容易就能写出来。 
    3. //1.先建立套接字m_Listen = socket(/*UDP*/) 
    4. //2.异步选择 
    5. int nErr = WSAAsyncSelect(m_Listen,this->m_hWnd,WM_SOCKET,FD_READ|FD_CLOSE);
    6. //3.消息处理函数,同TCP,这里略写 
    7. LRESULT CServerDlg::OnSocket(WPARAM wParam,LPARAM lParam)
    8. {
    9.    SOCKET sock = (SOCKET)wParam;
    10.    switch(WSAGETSELECTEVENT(lParam))
    11.    {
    12.    case FD_READ:
    13.         TCHAR szBuf[MAX_PATH] = {0};
    14.         int nRead = recvfrom(sock,(char*)szChat,
    15.                             MAX_PATH*sizeof(TCHAR),
    16.                             0,(SOCKADDR*)&m_addrClient,&len);
    17.         //显示等... 
    18.         break;
    19.     }
    20. }
    21. //客户端也同样可以做成异步选择模式,这里略掉吧。  
     

今天总结的这个模型WSAAsyncSelect,我认为是最简单的一个,也是我们最一开始学习网络编程易上手的一个模型。

以后介绍的几个都要与线程有关,关于线程也想总结一些,但总觉得自己对线程其实不是很了解,现在做的一个小项目

用到了线程和网络通信,线程快把人烦死了,主要问题就是在线程里不要调用使用线程的内容,尤其当你调试线程时,不然

电脑很有可能会崩起个没完,不得不重启。好像是VS2005编译器的问题,不是很清楚耶。

    先写到这儿吧,明天总结什么呢?想不起来了,今天忙活了一天,头都大了。...UP!UP!

原创粉丝点击