基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式,头一次使用这种模式编程需要转换思维模式 。把原来的“主动调用recv()来接收数据,主动调用accept()来接受连接,主动调用send()来发送数据”的思路换成“注册一个接收数据的回调,基础网络库收到数据会调用我,将数据传给我,供我消费;注册一个接受连接的回调,网络库接受了新连接会回调我,将新的接对象给我,供我使用;需要发数据的时候,只管往连接中写,网络库会负责无阻塞的发送。”事件处理函数应该避免阻塞,以免网络服务失去响应。

作者认为,TCP网络编程最本质的是处理三个半事件:

1.连接的建立,包括服务端接受连接,客户端发起连接。TCP连接一旦建立,服务端和客户端是平等的,相互发送和接收数据。

2.连接的断开,包括主动断开(close、shutdown)和被动断开(read()返回0)。

3.消息到达,文件描述符可读。这是最重要的一个事件,对它的处理方式决定了网络风格的风格(阻塞还是非阻塞,如何处理分包,如何设计应用层缓冲等等)

3.5.消息发送完毕,这算是半个。对于低流量的服务可以不关心这个事件;“发送完毕”是指将数据写入操作系统的缓冲区,将由TCP协议栈负责数据的发送与重传,不代表对方已接收到数据。

这其中有很多难点,也有很多细节要注意,比方说:

-如果要主动关闭连接,如何保证对方已接收到全部数据?

-如果应用层有缓冲,如何保证断开连接之前将缓冲数据发送出去?直接调用close()估计不行。

-如果主动发起连接,对方主动拒绝,如何定期重试?

-非阻塞网络编程中该用边沿触发还是水平触发?

-......

后面陆续出解答博客。

简述TCP网络编程本质的更多相关文章

  1. Linux下TCP网络编程与基于Windows下C#socket编程间通信

    一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...

  2. JAVA TCP网络编程学习笔记

    一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...

  3. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

  4. TCP网络编程

    TCP网络编程  与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的.客服端:public class TCPClient { /**     * @param args     * @th ...

  5. Java - TCP网络编程

    Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回 ...

  6. 8-2udp和tcp网络编程以及粘包和解决粘包的方法

    一  tcp网络编程 server 端 import socket sk=socket.socket() #实例化一个对象 sk.setsockopt(socket.SOL_SOCKET,socket ...

  7. TCP网络编程小结

    一.套接字编程基础 1.套接字地址结构 通用的地址结构是 struct sockaddr{ unsigned short sa_family; ]; } IPv4的套接字地址结构是 struct in ...

  8. tcp 网络编程

    网络编程同时也是进程间的一种通信:服务器进程和应用进程间的通信. OSI:开放式系统互联 OSI 7层模型:                                               ...

  9. 【Linux 网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数:对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...

随机推荐

  1. Shortest path of the king

    必须要抄袭一下这个代码 The king is left alone on the chessboard. In spite of this loneliness, he doesn't lose h ...

  2. 整数n的全排列

    第一道用搜索码的.得纪念一下 #include <iostream> #include <cstdio> #include <cstring> #include & ...

  3. HTML5 Canvas 数据持久化存储之属性列表

    属性列表想必大家都不会陌生,正常用 HTML5 来做的属性列表大概就是用下拉菜单之类的,而且很多情况下,下拉列表还不够好看,怎么办?我试着用 HT for Web 来实现属性栏点击按钮弹出多功能选框, ...

  4. Spark算子--countByKey

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/1633ffc63e2c925e930adadc9528c830.html  countByKey--Actio ...

  5. dedesms中的导致生成静态页面多出空白行解决办法

    前几天给朋友用织梦仿一个手机网站,保存处理好的代码,页面头部在浏览里莫名其妙多了一段空白区域,用调试工具查看,发现是代码里多了一行&#65279.后来发现很多网友在生成织梦页面的时候,头部 ...

  6. Python3 的分支与循环

    1:条件分支 if 条件 : 语句 else: 语句 2.缩写 else: if : 可以简写为 elif ,因此Python 可以有效的避免"悬挂else" 举例: #悬挂els ...

  7. 新版Azure Automation Account 浅析(一) --- 创建和Run As Account

    去年年底Azure中国的Automation Account悄悄做了升级.新版本不管从功能还是end user experience方面都让人耳目一新.如果说升级前只是一个运行脚本的小工具,升级后的A ...

  8. 如何 Scale Up/Down Deployment?- 每天5分钟玩转 Docker 容器技术(126)

    伸缩(Scale Up/Down)是指在线增加或减少 Pod 的副本数.Deployment nginx-deployment 初始是两个副本. k8s-node1 和 k8s-node2 上各跑了一 ...

  9. linux如何自动获取ip地址

    第一步:激活网卡 系统装好后默认的网卡是eth0,用下面的命令将这块网卡激活. # ifconfig eth0 up 第二步:设置网卡进入系统时启动 想要每次开机就可以自动获取IP地址上网,就要设置网 ...

  10. 【SqlServer系列】浅谈SQL Server事务与锁(上篇)

    一  概述 在数据库方面,对于非DBA的程序员来说,事务与锁是一大难点,针对该难点,本篇文章视图采用图文的方式来与大家一起探讨. “浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及 ...