所谓的异步套接字编程就是  调用了 如下函数 

 WSAAsyncSelect   设置了 套接字的状态为异步,有关函数我会在下面详细介绍。。。

异步套接字解决了 套接字编程过程中的堵塞问题 ...... 什么是堵塞?请看下面

 你可能有过这样的体会  在  VC编写基于界面的网路程序时候  ,调用 recv recvfrom   accept  等函数的时候 整个程序的主线程进入堵塞状态直到 有连接或者信息的到来。  我们可以利用多线程的方法解决主线程堵塞的问题,但是我们如果一个程序需要多个套接字 那么 就需要创建多个线程,线程创建多了回会导致一些不必要的麻烦 和操作上的不便。  我们利用非堵塞套接字可以解决这个问题 ,现在明白了吧 ,下面我讲讲述异步套接字实现 客户端服务端的通信 代码我会传到CSDN 大家可以去下载。。。。 

当一个连接到来得时候 我这里假设是  基于TCP的服务器端   那么我要accept 一直等待 ,但是在异步套接字中 这个等待被转移了 。。我们吧acept放倒一个消息响应中来调用 只有 当某种我们希望的条件发生的时候才会调用accept  那么这里就是 只有 客户端connect 的时候才会调用accept  这样的话线程 永远不会堵塞 。

可能这样说的还有些模糊  下面 是一个TCP服务器端的 编写顺序 :

    1 、首先加载套接字库  和包含必要的文件

         #include "winsock2.h"     

          #pragma comment(lib,"ws2_32.lib")   

    2、加载套接字库 对服务器端和客户端 库版本要一直 我们这里是2.0的 套接字版本

       WSADATA  wsa ;

     WSAStartup(MAKEWORD(2,0),&wsa) ; 

3 、创建套接字  并且利用 WSAAsyncSelect  设置为异步套接字  并且有网络事件发生的时候会发出  WM_SOCKET消息( 我们自定义的消息) 

 #deinfe WM_SOCKET WM_USER+1     ,对应的消息响应 要自己添加 不会下载我给的源代码

 int WSAAsyncSelect(

 SOCKET s,      //socket

 HWND hWnd,   //要发送消息的窗体 hwnd

unsigned int wMsg, //WM_SOCKET

 long lEvent   ,//注意这个就是我们需要的网络事件具体看MSDN   我们一般只用到   FD_READ  FD_ACCEPT    就是网络读取事件 和网络连接事件

 );

4.  配置地址结构体SOCKADDR_IN     和调用bind绑定地址 结构体    然后调用 listen监听 *(一定要在listen之前调用bind)  

完成之后我们不用accept了 因为 这个需要我们在 消息响应函数 里面 来调用 因为我们感兴趣的 网络事件可能有多种那么 我们需要 在消息响应函数

用一个switch循环来判断是哪个网络事件   部分代码如下:

void CSynSocketSrvDlg::OnConnect(WPARAM  wParam ,LPARAM lParam) 
{
      
      switch(lParam)
   {
   case FD_ACCEPT:
    {
    SOCKADDR addr ;
    int len;
    len=sizeof(SOCKADDR) ;
          GetDlgItem(IDC_EDIT1)->SetWindowText("新的连接到来....\n") ;
    tem=::accept(m_socket,(SOCKADDR*)&addr,&len) ;
    break ;
    }
   case FD_READ:
    {
                char buf[100] =""; 
    recv(tem,buf,100,0) ;
    GetDlgItem(IDC_EDIT1)->SetWindowText(buf) ;
    break ;
    }

}

}

客户端

1 、首先加载套接字库  和包含必要的文件

         #include "winsock2.h"     

          #pragma comment(lib,"ws2_32.lib")   

    2、加载套接字库 对服务器端和客户端 库版本要一直 我们这里是2.0的 套接字版本

       WSADATA  wsa ;

     WSAStartup(MAKEWORD(2,0),&wsa) ; 

3 、创建套接字  并且利用 WSAAsyncSelect  设置为异步套接字  并且有网络事件发生的时候会发出  WM_SOCKET消息( 我们自定义的消息) 

 #deinfe WM_SOCKET  WM_USER+1     ,对应的消息响应 要自己添加 不会下载我给的源代码

 int WSAAsyncSelect(

 SOCKET s,      //socket

 HWND hWnd,   //要发送消息的窗体 hwnd

unsigned int wMsg, //WM_SOCKET

 long lEvent   ,//注意这个就是我们需要的网络事件具体看MSDN   我们一般只用到   FD_READ    就是网络读取事件 );

4、 然后我们可以发送数据了 发送是 send

接收消息和服务端一样在 消息响应函数里面实现

代码下载地址

http://download.csdn.net/detail/yue7603835/3771590

参考: http://blog.csdn.net/yue7603835/article/details/6949817

【转】 VC中TCP实现 异步套接字编程的原理+代码的更多相关文章

  1. 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

  2. 网络编程之TCP三次握手与四次挥手、基于TCP协议的套接字编程

    目录 TCP三次握手和四次挥手 背景描述 常用的熟知端口号 TCP概述 TCP连接的建立(三次握手) TCP四次挥手 如果已建立连接,客户端突然断开,会怎么办呢? 基于TCP协议的套接字编程 什么是S ...

  3. VC基于消息的异步套接字

    用WSAStartup,需要在StdAfx.h头文件中需要声明 #include    #pragma   comment(lib,"WS2_32.lib") 用AfxSocket ...

  4. TCP和UDP套接字编程 (java实现)

    在了解网络编程之前,我们先了解一下什么叫套接字 套接字即指同一台主机内应用层和运输层之间的接口 由于这个套接字是建立在网络上建立网络应用的可编程接口 因此也将套接字称为应用程序和网络之间的应用程序编程 ...

  5. java基础----->TCP和UDP套接字编程

    这里简单的总结一下TCP和UDP编程的写法,另外涉及到HttpUrlConnection的用法 . TCP套接字 一.项目的流程如下说明: .客户输入一行字符,通过其套接字发送到服务器. .服务器从其 ...

  6. 基于TCP协议的套接字编程

    06.26自我总结 1.关于Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在 ...

  7. 网络编程[第一篇]基于tcp协议的套接字编程

    将服务端-客户端的连接比作双方打电话的过程 2019-07-24 一.客户端 主动的一方: 客户端实例化一个socket对象--> 主动像服务端发送连接请求--> (服务端接受请求后即可进 ...

  8. 利用Python进行TCP、UDP套接字编程

    参考:http://www.cnblogs.com/whatbeg/p/5155524.html http://www.cnblogs.com/nzyjlr/p/4236287.html

  9. JavaTCP和UDP套接字编程

    在我们刚开始入门Java后端的时候可能你会觉得有点复杂,包含了很多杂七杂八的知识,例如文件上传下载,监听器,JDBC,请求重定向,请求转发等等(当然也没有很多),但是我们自己真正的去开发一个小型网站( ...

随机推荐

  1. 用IDEA写出第一个java web

    今天学习到如何创建新的java web,笔者使用的是IDEA,以下有详细的参考链接,如下: 参考链接:https://blog.csdn.net/zhdkong/article/details/789 ...

  2. 今天是 Java 诞生日,Java 24 岁了!

    今天是 Java 诞生日,Java 今年 24 岁了,比栈长还年轻..还有得搞,别慌!作为一名Java语言的学习者,对Java的起源和发展有个大概的了解应是必要的. 1991年,Sun公司成立Gree ...

  3. echart表格,动态的通过ajax从后台获取数据动态的展示数据

    官网上都是介绍的echar表格的展示方法,但是都是静态数据,一开始的时候我总是纳闷,这些数据都是怎么上上去的 , 后来通过一些方法,当然这些方法也不是我自己写出来的,也是通过在网上收集了一下 ,现在才 ...

  4. Codeforces 1141F2(贪心、预处理)

    要点 一开始dp然后码力太辣鸡并且算法带假于是调了很久一交还WA在28-- 吐槽完毕.后来想拿栈优化dp时发现其实完全不需要dp,贪心选取即可,当前的不兼容就干脆不要它了,结果不会变差.然后想要什么就 ...

  5. loj6198谢特 后缀数组+并查集+Trie

    先把问题放在后缀数组上考虑 已知两个数组a b,求min(a[i],...,a[j])+(b[i]^b[j])的最大值 套路题 初始每个点都是一个小连通块 把a按从大到小的顺序加入,计算当前加入边作为 ...

  6. input密码自动填充

    自动填充样式修改 input: -webkit - autofill, input: -webkit - autofill: hover, input: -webkit - autofill: foc ...

  7. idea 卡顿问题

    转载大神总结 https://jingyan.baidu.com/article/c275f6ba14207ee33c756752.html

  8. (转)命令passwd报错因inode节点处理记录

    命令passwd报错因inode节点处理记录 原文:http://blog.sina.com.cn/s/blog_506ed9e6010106kj.html 故障现象:      1.修改密码时报错 ...

  9. OpenCV图像处理之 Mat 介绍

    我记得开始接触OpenCV就是因为一个算法里面需要2维动态数组,那时候看core这部分也算是走马观花吧,随着使用的增多,对Mat这个结构越来越喜爱,也觉得有必要温故而知新,于是这次再看看Mat. Ma ...

  10. Java微信公众平台开发(十二)--微信JSSDK的使用

    在前面的文章中有介绍到我们在微信web开发过程中常常用到的 [微信JSSDK中Config配置],但是我们在真正的使用中我们不仅仅只是为了配置Config而已,而是要在我们的项目中真正去使用微信JS- ...