阻塞与非阻塞SOCKET
Windows套接字在两种模式下执行I/O操作,阻塞和非阻塞。在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回程序(将控制权交还给程序)。而在非阻塞模式下,Winsock函数无论如何都会立即返回。

Windows Sockets的异步选择函数WSAAsyncSelect()提供了消息机制的网络事件选择,当使用它登记的网络事件发生时,Windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。

在同步模式中,对执行网络操作的函数(如Send和receive)的调用一直等到操作完成后才将控制权返回给调用程序;

在异步模式中,这些调用立即返回控制权

阻塞模式

当使用socket()函数创建套接字时,默认的套接字都是阻塞的。这意味着当调用Windows Sockets API不能立即完成时,线程处于等待状态,直到操作完成。

1.输入操作

recv()、recvfrom()、WSARecv()和WSARecvfrom()函数。以阻塞套接字为参数调用该函数接收数据。如果此时套接字缓冲区内没有数据可读,则调用线程在数据到来前一直睡眠。

2.输出操作

send()、sendto()、WSASend()和WSASendto()函数。以阻塞套接字为参数调用该函数发送数据。如果套接字缓冲区没有可用空间,线程会一直睡眠,直到有空间。

3.接受连接

accept()和WSAAcept()函数。以阻塞套接字为参数调用该函数,等待接受对方的连接请求。如果此时没有连接请求,线程就会进入睡眠状态。

4.外出连接

connect()和WSAConnect()函数。对于TCP连接,客户端以阻塞套接字为参数,调用该函数向服务器发起连接。该函数在收到服务器的应答前,不会返回。这意味着TCP连接总会等待至少到服务器的一次往返时间。

使用阻塞模式的套接字,开发网络程序比较简单,容易实现。当希望能够立即发送和接收数据,且处理的套接字数量比较少的情况下,使用阻塞模式来开发网络程序比较合适。

非阻塞模式
     把套接字设置为非阻塞模式,即通知系统内核:在调用Windows Sockets API时,不要让线程睡眠,而应该让函数立即返回。

当使用socket()函数和WSASocket()函数创建套接字时,默认都是阻塞的。在创建套接字之后,通过调用ioctlsocket()函数,将该套接字设置为非阻塞模式。还可以使用WSAAsyncselect()和WSAEventselect()函数。当调用该函数时,套接字会自动地设置为非阻塞方式。

套接字设置为非阻塞模式后,在调用Windows Sockets API函数时,调用函数会立即返回。大多数情况下,这些函数调用都会调用“失败”,并返回WSAEWOULDBLOCK错误代码。说明请求的操作在调用期间内没有时间完成。通常,应用程序需要重复调用该函数,直到获得成功返回代码。(bind, WSAStartup  不会返回该错误)

由于使用非阻塞套接字在调用函数时,会经常返回WSAEWOULDBLOCK错误。所以在任何时候,都应仔细检查返回代码并作好对“失败”的准备。应用程序连续不断地调用这个函数,直到它返回成功指示为止。上面的程序清单中,在While循环体内不断地调用recv()函数,以读入1024个字节的数据。这种做法很浪费系统资源。

要完成这样的操作,有人使用MSG_PEEK标志调用recv()函数查看缓冲区中是否有数据可读。同样,这种方法也不好。因为该做法对系统造成的开销是很大的,并且应用程序至少要调用recv()函数两次,才能实际地读入数据。较好的做法是,使用套接字的“I/O模型”来判断非阻塞套接字是否可读可写。

非阻塞模式套接字 vs 阻塞模式套接字
1. 使用非阻塞模式套接字,需要编写更多的代码,以便在每个Windows Sockets API函数调用中,对收到WSAEWOULDBLOCK错误进行处理。因此,非阻塞套接字便显得有些难于使用。

2. 非阻塞套接字在控制建立的多个连接,在数据的收发量不均,时间不定时,明显具有优势。

通常情况下,可考虑使用套接字的“I/O模型”,它有助于应用程序通过异步方式,同时对一个或多个套接字的通信加以管理。

MFC CAsynSocket
MFC 定义了两个套接字类:CAsyncSocket、CSocket;CSocket派生于CAsyncSocket;
CAsyncSocket类在低层次上对 Windows Sockets API 进行了封装,其成员函数和 Windows Sockets API 函数直接相对应 。

一个CAsyncSocket对 象 就 代 表 了一 个 套 接 字。

而CSocket继承于CAsyncSocket 类,是对 Windows Sockets API 的高级封装。

一 客户端程序:

1. 创建一个Dialog Based项目:CSockClient

2. 设计对话框

去掉Ok和Cancle两个按钮,增加ID_Connect(连接)、ID_Send(发送)、ID_Exit(关闭)按钮,增加ListBox控件IDC_LISTMSG和Edit控件IDC_EDITMSG,并按下表在ClassWizard中为CCSockClientDlg类添加变量。

IDC_EDITMSG CEdit m_MSG
IDC_LISTMSG ClistBox m_MSGS

3. CAsyncSocket类用DoCallBack函数处理MFC消息,当一个网络事件发生时,DoCallBack函数按网络事件类型:FD_READ、FD_WRITE、FD_ACCEPT、FD_CONNECT分别调用OnReceive、OnSend、OnAccept、OnConnect函数。

由于MFC把这些事件处理函数定义为虚函数,所以要生成一个新的C++类,以重载这些函数,做法如下:

以Public方式继承CAsyncSocket类,生成新类MySock;

为MySock类添加虚函数OnReceive、OnConnect、OnSend

4. 在MySock.h中添加以下代码

public:
      BOOL m_bConnected;    //是否连接
      UINT m_nLength;        //消息长度
      char m_szBuffer[4096];    //消息缓冲区

5.  在MySock.ccp中添加以下代码

原文:https://blog.csdn.net/baidu_19340981/article/details/39317125

异步SOCKET与同步SOCKET相关推荐

  1. 同步Socket 与 异步 Socket

    同步Socket 与 异步 Socket: 1.同步就是阻塞的,比如 接受数据 如果没有回应 就一直等待. 2.异步就是不用等待: 同步Socket using System; using Syste ...

  2. c++ 多个线程操作socket要同步吗_基础知识深化:NIO优化原理和Tomcat线程模型

    1.I/O阻塞 书上说BIO.NIO等都属于I/O模型,但是I/O模型这个范围有点含糊,我为此走了不少弯路.我们日常开发过程中涉及到NIO模型应用,如Tomcat.Netty中等线程模型,可以直接将其 ...

  3. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截...

    程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少.数据 ...

  4. 简单的同步Socket程序服务端

    首先,Socket是.Net提供的 System.Net.Sockets命名空间的Scoket类为网络通信提供了一套丰富的方法和属性 服务器按照Socket的基本流程 先创建Socket 在用Bind ...

  5. MySQL 5.5 主从复制异步、半同步以及注意事项详解

    大纲 一.前言 二.Mysql 基础知识 三.Mysql 复制(Replication) 四.Mysql 复制(Replication)类型 五.Mysql 主从复制基本步骤 六.Mysql 主从复制 ...

  6. QT 异步函数和同步函数交换问题

    同步函数与异步函数 依据微软的MSDN上的解说: (1)   同步函数:当一个函数是同步执行时,那么当该函数被调用时不会立即返回,直到该函数所要做的事情全都做完了才返回. (2)   异步函数:如果一 ...

  7. java socket 超时_Java Socket超时浅析

    套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字",可以想象它们之间有一条 ...

  8. QT中使用C++ socket通信,socket通信原理三次握手和四次握手详解、客户端与服务端实例详解

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP? 2.         Soc ...

  9. 为什么异步Python比同步Python快?

    在本文中,我将继续使用 Web 应用程序作为例子,但还有其它类型的应用程序也从并发中获益.因此,这个讨论并不仅仅是针对 Web 应用程序的.你是否听人们说过,异步 Python 代码比"普通 ...

最新文章

  1. 如果说编程语言是一种宗教,你的信仰是?
  2. TOML-to-Go : 帮你快速生成 Go 结构体
  3. 06day 03cdbpdb也成为 多租户环境
  4. 单点系统架构的可用性与性能优化
  5. 字符的用意_通达信某些字符的意义及用法
  6. 高额奖金+实习机会+官方证书 丨微众银行第二届金融科技高校技术大赛正式启动...
  7. python中关于turtle库的学习笔记
  8. 划分vlan实验心得体会_思科:相同vlan,不同交换机之间的通信
  9. java跨函数跳转_VS code 函数无法跨文件跳转到定义
  10. HTML5 Canvas 2D绘图
  11. [红外] 求一个数的反码, 并作为高位追加到 这个数的前面
  12. Android Activity设置全屏
  13. UI设计师未来职业规划
  14. 联想惠普谁才是pc的最后王者
  15. 【移动安全实战篇】————3、Android应用程序破解入门
  16. 西门子s7-200PLC编程软件
  17. iPhone突然黑屏开不了机怎么办?3种解决方法分享
  18. 一台云服务器绕过企业微信域名验证本地开发
  19. pycharm安装-社区版
  20. 【机器学习之路】(转载)

热门文章

  1. html正则表达式识别网址,JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)...
  2. mysql数据库且字 语句是什么,MySQL(数据库)基本操作
  3. c语言构造体二维数组,怎么才能把结构体里面的二维数组打印出来?
  4. 虚拟机架云服务器,云服务器 虚拟机架设
  5. 本科、硕士、博士,究竟有何区别?
  6. android监听通知消息 脚本,Bash玩转脚本4之搞一套完整的Android反编译与分包工具...
  7. oracle audit文件,[20191128]oracle Audit文件管理2.txt
  8. 计算机硬盘工作时应该避免什么,什么是电脑硬盘?有何作用?如何保养它?
  9. spring spring c3p0 mysql配置_Spring通过c3p0配置bean连接数据库
  10. html3d上下翻转4面效果,花式实现图片3D翻转效果