WSAAsyncSelect模型

    WSAAsyncSelect模型允许应用程序以Windows消息的方式接收网络事件通知。许多对性能要求不高的网络应用程序都采用WSAAsyncSelect模型,MFC的CSocket类也使用了它。

        WSAAsyncSelect自动把套接字设为非阻塞模式,并且为套接字绑定一个窗口句柄,当有网络事件发生时,便向这个窗口发送消息。

        intWSAAsyncSelect(

        SOCKET s,                  //需要设置的套接字句柄

        HWND  hWnd,     //指定一个窗口句柄, 套接字的通知消息将被发到此窗口中

       u_int    wMsg,     //网络事件到来的ID,可以在WM_USER以上数值中任意指定一个值

       long    IEvent     //指定哪些通知码需要发送

                                 //FD_READ可以读套接字

                                 //FD_WRITE 可以写套接字

                                //FD_ACCEPT 监听套接字有连接接入

                               //FD_CONNET  如果套接字连接对方主机,连接完成后会收到这个通知码

                              //FD_CLOSE 检测到套接字对应的连接被关闭

)

       回传过来的消息类型与注册的wMsg相同,wParam等于套接字句柄,lParam通过WSAGETSELECTEVENT转义后就是FD_READ,FD_WRITE,FD_ACCEPT,FD_CONNET,FD_CLOSE

        代码如下:

        新建一个基于MFC对话框的工程,工程名为test,然后在testDlg.h中定义      

[cpp] view plaincopy
  1. #include "winsock2.h"  
  2. #pragma comment(lib, "WS2_32")  
  3. #define WM_SOCKET (WM_USER+1)   
同时在该文件中加入一个自定义消息处理函数

[cpp] view plaincopy
  1. afx_msg LRESULT OnSocketMsg(WPARAM wParam,LPARAM lParam);  
在testDlg.cpp中定义

[cpp] view plaincopy
  1. ON_MESSAGE(WM_SOCKET,OnSocketMsg)  

在OnInitDialog中加入自己的初始化代码

[cpp] view plaincopy
  1. // TODO: 在此添加额外的初始化代码  
  2.   
  3.     WSADATA wsaData;  
  4.     WORD sockVersion = MAKEWORD(2, 2);  
  5.     if(WSAStartup(sockVersion, &wsaData) != 0)  
  6.     {  
  7.         return 0;  
  8.     }  
  9.     USHORT nPort=4567;  
  10.     SOCKET s=socket(AF_INET,SOCK_STREAM,0);  
  11.     sockaddr_in sin;  
  12.     sin.sin_family=AF_INET;  
  13.     sin.sin_port=ntohs(nPort);  
  14.     sin.sin_addr.S_un.S_addr=INADDR_ANY;  
  15.     if(bind(s,(sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR)  
  16.     {  
  17.         DWORD error=GetLastError();  
  18.         return TRUE;  
  19.     }  
  20.   
  21.     WSAAsyncSelect(s,m_hWnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE);  
  22.     listen(s,5);  

添加自定义消息函数的处理:

[cpp] view plaincopy
  1. LRESULT CtestDlg::OnSocketMsg(WPARAM wParam,LPARAM lParam)  
  2. {  
  3.     SOCKET s=wParam;  
  4.     CString strContent;  
  5.     if(WSAGETSELECTERROR(lParam))  
  6.     {  
  7.         closesocket(s);  
  8.         return false;  
  9.     }  
  10.     switch(WSAGETSELECTEVENT(lParam))  
  11.     {  
  12.     case FD_ACCEPT://检测到有套接字连上来  
  13.         {  
  14.             SOCKET client=accept(s,NULL,NULL);  
  15.             WSAAsyncSelect(client,m_hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);  
  16.             CString strContent;  
  17.             GetDlgItemText(IDC_EDIT1,strContent);  
  18.             if(!strContent.IsEmpty())  
  19.             {  
  20.                 strContent+="\r\n";  
  21.             }             
  22.             strContent+="有客户端连上来了";  
  23.             SetDlgItemText(IDC_EDIT1,strContent);//将内容显示到Edit控件  
  24.         }  
  25.         break;  
  26.     case FD_WRITE:  
  27.         {  
  28.         }  
  29.         break;  
  30.     case FD_READ:  
  31.         {  
  32.             char szText[1024]={0};  
  33.             if(recv(s,szText,1024,0)==-1)  
  34.                 closesocket(s);  
  35.             else  
  36.             {                 
  37.                 GetDlgItemText(IDC_EDIT1,strContent);  
  38.                 if(!strContent.IsEmpty())  
  39.                 {  
  40.                     strContent+="\r\n";  
  41.                 }  
  42.                 CString strTemp;  
  43.                 strTemp.Format("%s",szText);  
  44.                 strContent+=strTemp;  
  45.                 SetDlgItemText(IDC_EDIT1,strContent);//将内容显示到Edit控件中  
  46.             }  
  47.         }  
  48.         break;  
  49.     case FD_CLOSE:  
  50.         {  
  51.             closesocket(s);  
  52.             GetDlgItemText(IDC_EDIT1,strContent);  
  53.             if(!strContent.IsEmpty())  
  54.             {  
  55.                 strContent+="\r\n";  
  56.             }             
  57.             strContent+="有客户端断开了";  
  58.             SetDlgItemText(IDC_EDIT1,strContent);//将内容显示到Edit控件中  
  59.         }  
  60.         break;  
  61.     }  
  62.     return true;  
  63. }  

对WM_DESTROY消息处理,清理套接字库

[cpp] view plaincopy
  1. void CtestDlg::OnDestroy()  
  2. {  
  3.     CDialog::OnDestroy();  
  4.     WSACleanup();  
  5.     // TODO: 在此处添加消息处理程序代码  
  6. }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算图像的直方图,求峰值点

程序步骤&#xff1a; 1.输入图像 2.灰度化 3.计算直方图 4.求峰值点 #include "../LaneDetecte_SRC/detector_lane.hpp" #include "../common_src/unity.hpp" #include "../common_src/common_func.hpp" #include <chrono> #include…

线程休眠

package com.ajax; //线程休眠&#xff1a;该方法可以让当前正在执行的线程暂停一段时间&#xff0c;进入休眠等待状态让其他线程可以执行 public class Example04 {public static void main(String[] args) throws Exception{new Thread(new SleepThread()).start();for(int i…

HUE 打开 WorkFlow异常 Operation category READ is not supported in state standby

异常&#xff1a;在hue上配置的一些定时任务突然停止执行。 1.打开页面HUE->WorkFlow 发现页面异常&#xff0c;无法进入WorkFlow&#xff0c;如下图 2.查看HUE日志 查看到WebHdfsException异常&#xff0c;访问HDFS文件浏览器报错&#xff0c; [26/Jun/2019 09:29:55 080…

失败的面试经历

最近感觉在这家公司实在是干不下去了。于是就投简历面试吧。想要找到下家&#xff0c;首先是要写好自己的简历&#xff0c;于是呼&#xff0c;想想自己这几年干过的东西&#xff0c;呼拉一下全写上去了。然后就在招聘网站上逢C/C职位就投。于是就等来了不少面试机会&#xff0c…

opencv 常用操作 c++

图像水平垂直方向拼接: cv::vconcat&#xff08;B,C&#xff0c;A&#xff09;; // 等同于A[B ;C] cv::hconcat&#xff08;B,C&#xff0c;A&#xff09;; // 等同于A[B C] 初始化Mat: cv::Mat edgeDest(cv::Size(10,10), CV_8UC1, cv::Scalar(0)); double a[3][3] { 0.…

hdfs fsck命令查看HDFS文件对应的文件块信息(Block)和位置信息(Locations)

关键字&#xff1a;hdfs fsck、block、locations 在HDFS中&#xff0c;提供了fsck命令&#xff0c;用于检查HDFS上文件和目录的健康状态、获取文件的block信息和位置信息等。 fsck命令必须由HDFS超级用户来执行&#xff0c;普通用户无权限。 [hadoopdev ~]$ hdfs fsck Usage…

线程让步

package com.ajax; //线程让步&#xff1a;通过yield方法来实现&#xff0c;该方法和sleep方法有点相似&#xff0c;都可以让当前正在运行的线程暂停&#xff0c;区别在于yield方法不会阻塞该线程&#xff0c;他只是将线程转换为就绪状态&#xff0c;让系统的调度器 //重新调度…

tcp连接超时处理

设置connect超时很简单&#xff0c;CSDN上也有人提到过使用select&#xff0c;但却没有一个令人满意与完整的答案。偶所讲的也正是select函数&#xff0c;此函数集成在winsock1.1中&#xff0c;简单点讲&#xff0c;"作用使那些想避免在套接字调用过程中被锁定的应用程序&…

Hbase Native memory allocation (mmap) failed to map xxx bytes for committing reserved memory

新启动测试环境Hbase报错&#xff0c;报错日志如下 # # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 31715688448 bytes for committing reserved memory. # An error report file with mo…

Tcp设置发送和接收超时

linux和windows下用setsockopt设置SO_SNDTIMEO,SO_RCVTIMEO的参数的一点区别 UDP的socket在某些情况&#xff1a;如对方关闭时&#xff0c;本地可能sendto不出去数据&#xff0c;然后recvfrom就会被阻塞&#xff0c;这时就需要设置 这两个参数的值提高程序质量。 linux: …

线程插队

package com.ajax; //线程插队 public class Example06 {public static void main(String[] args)throws Exception{Thread tnew Thread(new EmergencyThread(),"线程一");t.start();for(int i0;i<6;i){System.out.println(Thread.currentThread().getName()"…

txt记录位置 c++,python显示位置

///c 写/ std::ofstream lane_postion_log(ROOT_DIR"/build/lane_position_log.txt");//创建文件 lane_postion_log <<p.x<<","<<p.y<<","<<p.z<<endl;//写位置 lane_postion_log.close(); //python显示…

CDH Yarn资源动态分配 - 指定资源限制 公平调度具体设置

日常工作中会涉及到各种资源分配等问题&#xff0c;跨部门&#xff0c;跨业务等等&#xff0c;这里介绍基于CDH版本的Yarn 公平调度&#xff08;实际使用DRF调度&#xff09; 不同时间配置不同资源参考&#xff08;计划模式&#xff09;&#xff1a;https://datamining.blog.cs…

为什么TCP是三次握手

TCP 三次握手 首先简单介绍一下TCP三次握手 在TCP/IP协议中&#xff0c;TCP协议提供可靠的连接服务&#xff0c;采用三次握手建立一个连接。 第一次握手&#xff1a;建立连接时&#xff0c;客户端发送syn包(synj)到服务器&#xff0c;并进入SYN_SEND状态&#xff0c;等待服务…

线程安全

package com.ajax; //线程安全 public class Example07 {public static void main(String[] args){SaleThread saleThreadnew SaleThread();new Thread(saleThread,"线程一").start();new Thread(saleThread,"线程二").start();new Thread(saleThread,&quo…

CDH 配置YARN动态资源池的计划模式,根据时间划分资源,不同时间不同队列使用不同资源

公平调度配置可参考&#xff1a;http://datamining.blog.csdn.net/article/details/94554469 目录 计划模式设置 队列资源抢占分配 计划模式设置 1.创建计划规则 2.设置白天配置&#xff0c;可以根据业务选择具体配置计划&#xff0c;调整资源&#xff0c;选择每天&#xff…

java集合类总结

Collection&#xff1a;单列集合类的跟接口&#xff0c;用于存储一系列符合某种规则的元素&#xff0c;它有两个重要的子接口&#xff0c;分别时List和Set还有Queue。其中List的特点时元素有序&#xff0c;元素可重复&#xff0c;Set的特点时元素无序且不可重复&#xff0c;Que…

c++ 获取数据类型最大值或最小值

范例&#xff1a; double min_dist numeric_limits<double>::max(); double max_dist numeric_limits<double>::min();

TCP为什么是四次挥手

TCP 3次握手 客户端向服务器发送一个SYN&#xff08;包含了SYN&#xff0c;SEQ&#xff09;。 当服务器接收到客户端发过来的SYN时&#xff0c;会向客户端发送一个SYNACK的数据包&#xff0c;其实ACK的ack等于上一次发送SYN数据包的&#xff08;SYNSEQ&#xff09;。 当客户…

Kudu 基本操作,详细操作讲解

kudu与Apache Impala紧密集成&#xff0c;允许您使用Impala使用Impala的SQL语法从Kudu平板中插入、查询、更新和删除数据&#xff0c;以替代使用Kudu API来构建自定义的Kudu应用程序。此外&#xff0c;您还可以使用JDBC或ODBC将使用任何语言、框架或商业智能工具编写的现有或新…