关于windows客户端网络编程 WSAAsyncSelect函数

摘要:
WSAAsyncSelect模型允许将windows消息用作网络事件的通知。此模型专门为windows消息设置。此函数默认将套接字设置为非阻塞模式。调用WSAAsyncSelect函数后,可以在窗口函数中以窗口消息的形式接收网络事件通知。

WSAAsyncSelect模型允许以windows消息作为网络事件的通知,这个模型是为了windows消息专门而设置的。这个函数默认使socket为非阻塞模式(一般情况下,异步模式便为非阻塞模式)。当WSAAsyncSelect函数进行调用了以后,就可以在在窗口函数以windows消息的形式接收网络事件通知。LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)是对应的回调函数。

USHORT nPort=4567;
SOCKET sListen=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
socketaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(nPort);
sin.sin_addr.S_un.S_addr=INADDR_ANY;
//绑定套接字到本地机器
if(::bind(sListen,(sockaddr*)&sin,sizeof(sin))==SOCKET_ERROR)
{

printf("Failed bind()\n");
return -1;
}

//将套接字设为窗口通知消息类型

::WSAAsyncSelect(sListen,hWnd,WM_SOCKET,FD_ACCEPT|FD_CLOSE);

::listen(sListen,5);

//从消息队列中取出消息
MSG msg;
while(::GetMessage(&msg,NULL,0,0))
{

::TranslateMessage(&msg);
::DispatchMessage(&msg);

}
return msg.wParam;

LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
swithc(uMsg)
{
case WM_SOCKET:
{

    SOCKET s=wParam;
//查看是否出错
   if(WSAGETSELECTERROR(lParam))
   {
     ::closesocket(s);
      return 0;
   }
//处理发生的事件
switch(WSAGETSELECTEVENT(lParam))
  {
      case FD_ACCEPT:
      { 
             SOCKET client=::accept(s,NULL,NULL);
            ::WSAAsyncSelect(client,hWnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);

     }
     break;
    case FD_WRITE:
    {}
     break;
    case FD_READ:
    {
       char szText[1024]={0};
       if(::recv(s,szText,1024,0)==-1)
       ::closesocket(s);
      else
      printf(""接收数据:%s",szText);

    } 
   break;
   case FD_CLOSE:
   {

    ::closesocket(s);
   }
   break;

  }

  }

}

}

免责声明:文章转载自《关于windows客户端网络编程 WSAAsyncSelect函数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows10电脑安装macOS Mojave系统的方法(最新版系统,含超详细步骤截图)Red Team内网穿透技术开源工具下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Akka入门实例

Akka入门实例 Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。 Actor模型并非什么新鲜事物,它由Carl Hewitt于上世纪70年代早期提出,目的是为了解决分布式编程中一系列的编程问题。其特点如下: 系统中的所有事物都可以扮演一个Actor Actor之间完全独...

Oracle 字符集的查看和修改

一、什么是Oracle字符集        Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。 影响Oracle数据库字符集最重要的参数是NLS_LANG参...

JMS(Java消息服务)入门教程(一)

什么是Java消息服务  Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等,用于支持JAVA应用程序开发。在J2EE中,当两个应用程序使用JMS进行通信时,它们之间并不是直接相连的,而是通过一个共同的消息收发服务连接起来,可以达到解耦的效果,我们将会在接下来的教程中详细介绍...

rabbitMq实战使用

只做下工作记录,比较重要的几个属性: concurrency:一个生产者可以同时由多少个消费者消费,这个一般根据你的机器性能来进行配置 prefetch:允许为每个consumer指定最大的unacked messages数目。要是对实时性要求很高的话,prefetch应该设置成1,concurrency的值调高点 队列中Ready状态和Unacknowl...

MFC 三种消息

在MFC应用程序中传输的消息有三种类型:窗口消息、命令消息和控件通知。 (1)窗口消息:WM_XXX 窗口消息(Window Message)一般与窗口的内部运作有关,如:创建窗口、绘制窗口和销毁窗口等。通常,消息是从系统发送到窗口,或从窗口发送到窗口。 (2)命令消息:WM_COMMAND 命令消息一般与处理用户请求相关,当用户单击一个菜单项或工具栏时...

linux网络编程--UNIX域套接字

UNIX域套接字   socket同样可以用于本地通信   创建套接字时使用本地协议PF_UNIX(或PF_LOCAL)PF_LOCAL   分为流式套接字和用户数据报套接字   和其他进程间通信方式相比使用方便。效率更高   用于前后台进程通信 本地地址结构:  struct sockaddr_un {   sa_family_t sun_family;...