标准的wr/rd socket 姿势

一、标准的wr/rd socket姿势

标准流程sock read/write,参考sim里的代码【https://github.com/ideawu/sim.git】

sock默认为“阻塞的”,本例中设置为“非阻塞”的。

read返回值:

>0:rd到数据;

=0:sock连接断开;

<0:需要配合errno来判断。EINTR/EWOULDBLOCK。

阻塞的只需要rd一次就break,非阻塞的需要循环rd。

/*本例中noblock_ == true, 需要循环rd.流程如下

2016-02-10 14:13:10.937 [DEBUG] link.cpp(85): rd push buf(hao), len(3)

2016-02-10 14:13:10.937 [DEBUG] link.cpp(67): rd errno == EWOULDBLOCK

*/

http://blog.csdn.net/historyasamirror/article/details/5778378

blocking IO 
在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样:

non-blocking IO

linux下,可以通过设置socket使其变为non-blocking。当对一个non-blocking socket执行读操作时,流程是这个样子:

IO multiplexing

IO multiplexing这个词可能有点陌生,但是如果我说select,epoll,大概就都能明白了。有些地方也称这种IO方式为event driven IO。我们都知道,select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。它的流程如图:

Asynchronous I/O

linux下的asynchronous IO其实用得很少。先看一下它的流程:

keepalive

1. tcp_keepalive_time

the interval between the last data packet sent (simple ACKs are not considered data) and the first keepalive probe; after the connection is marked to need keepalive, this counter is not used any further

2. tcp_keepalive_intvl

the interval between subsequential keepalive probes, regardless of what the connection has exchanged in the meantime

3. tcp_keepalive_probes

the number of unacknowledged probes to send before considering the connection dead and notifying the application layer

当本地端tcp发现有tcp_keepalive_time(1800)秒后未收到peer端数据,开始以间隔tcp_keepalive_intvl(75)秒的频率发送心跳包,如果连续tcp_keepalive_probes(9)次以上未响应,表示peed端已经down了,本地端close连接。

TCP_NODELAY

TCP_SND_QUEUELEN

tpcTCP

https://www.processon.com/view/56377e1ce4b03a7c1d4ccb6e

来自为知笔记(Wiz)

时间: 2024-10-11 20:51:06

标准的wr/rd socket 姿势的相关文章

python标准库之【socket】

socket通常也称作”套接字“.网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.socket 是网络连接端点.例如当你的Web浏览器请求www.fishc.com上的主页时,你的Web浏览器创建一个socket并命令它去连接 www.fishc.com的Web服务器主机,Web服务器也对来自的请求在一个socket上进行监听.两端使用各自的socket来发送和 接收信息. socket模块提供了几个函数用于使用主机名和地址来工作:         ge

【windows socket+UDPserverclient】

Windows Socket+UDPserverclient Winsock是 Windows下套接字标准.                    1.UDP socket编程:          UDP(用户数据报协议)是一个无连接.不可靠的传输数据,其特点是简单,快捷.相比与TCP,UDP不须要建立连接(不需connect.accept函数),数据发送接收之后,不须要终止连接.基于UDP的程序,避免了TCP执行的开销,在效率与速度上具有更好的表现.          UDP是无连接的,可能会

python——socket模块与列表映射

从socket模块学习中的一段奇怪代码说起 前言:在学习python标准库中的Socket模块中,发现了一段奇怪的代码. import socket def get_constants(prefix): dicts=dict((getattr(socket,n),n) for n in dir(socket) if n.startswith('IPPROTO_')) print (dicts) 疑问:上述代码中的for..in..循环语句和if 语句都没有冒号结束.为什么? 答案:因为上述“异常

socket编程

一.CS架构 server端要求: 1.力求一直提供服务 2.绑定到一个唯一的地址,让客户端找到 二.socket socket就是为了完成C/S架构软件的开发,但是如果是C/S架构的软件就一定需要解决双方通信问题. 若基于网络通信就需要了解复杂的网络协议 TCP/IP协议,于是socket出现了: 1.什么是sock? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后

【windows socket+UDP服务器客户端】

Windows Socket+UDP服务器客户端 Winsock是 Windows下套接字标准.                    1.UDP socket编程:          UDP(用户数据报协议)是一个无连接,不可靠的数据传输,其特点是简单,快捷.相比与TCP,UDP不需要建立连接(不需connect.accept函数),数据发送接收之后,不需要终止连接.基于UDP的程序,避免了TCP运行的开销,在效率与速度上具有更好的表现.          UDP是无连接的,可能会有数据的丢失

tcp 三次握手和四次断连深入分析:连接状态和socket API的关系

说到tcp协议,凡是略微看过的人都能顺口说出三次握手和四次断连.再牛逼的一点的就能够把每一个状态(SYNC_SENT.CLOSE_WAIT. ... ..等)都能背出来, 而说道socket编程.基本上写过网络编程的人都会熟悉那几个标准的API:socket.connect.listen.accept.... ..等 可是.我敢打赌非常少有人明确tcp状态和socket编程API之间的关系.不信? 看看例如以下几个问题你是否知道吧: 1)什么时候客户端才干够连接上server端, 是server

Go语言TCP Socket编程

Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分.在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均是"高频+刚需",而TCP socket则是网络编程的主流,即便您没有直接使用到net中有关TCP Socket方面的接口,但net/http总是用到了吧,http底层依旧是用tcp socket实现的. 网络编程方面,我们最常用的就是tcp socket编程了,在posix标准出来后,s

Python网络编程—socket(一)

从今天开始python基础就介绍完毕了,下面我们将进阶到socket网络编程的介绍,那么socket是什么呢?我们带着这个问题开始今天的介绍: 一.socket初探 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket其实也是一种特殊的文件,一些socket函数就是对其进行的操作(读/写.打开.关闭) 那么socket对文件操作和file对文件操作有什么区别呢? fil

设计安全的账号系统的正确姿势【转】

引子 最近有个虚拟练习项目,涉及到系统安全保障的设计,于是对安全保障这块做了一些更深入的了解.发现了很多有趣的东西,开阔了眼界.中间查了一些资料,于是我打算重新整理,用更加循序渐进,大家都能懂的方式,说一说如何设计一个安全的系统. 著名的安全事件 首先来看看最近几年比较著名的拖库撞库后密码泄露的事件: 2011年12月,国内最大的程序员社区 CSDN 遭拖库,600万个账户信息泄露. 2014年3月,携程旅行网的系统存技术漏洞,漏洞可能导致用户的姓名.身份证号码.银行卡类别.银行卡卡号.银行卡C