recvfrom

Linux下5种IO模型以及阻塞/非阻塞/同步/异步区别

混江龙づ霸主 提交于 2019-11-29 19:29:34
1. 引言 同步(synchronous) I/O和异步(asynchronous) I/O,阻塞(blocking) I/O和非阻塞(non-blocking)I/O分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous I/O和non-blocking I/O是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network I/O。 本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models ”,Stevens在这节中详细说明了各种I/O的特点和区别,如果英文够好的话,推荐直接阅读。Stevens的文风是有名的深入浅出,所以不用担心看不懂。本文中的流程图也是截取自参考文献。 Linux下的五种I/O模型 阻塞I/O(blocking I/O) 非阻塞I/O (nonblocking I/O) I/O复用(select 和poll) (I/O multiplexing) 信号驱动I/O

第一阶段:Python开发基础 day33 网络编程之socketsever模块和udp协议

时间秒杀一切 提交于 2019-11-29 19:15:37
目录 一、socketserver模块 二、udp协议 一、socketserver模块 服务端: #使用socketserver写服务端 #导入模块 import socketserver #自己定义一个类,必须继承BaseRequestHandler class MyTcp(socketserver.BaseRequestHandler): #必须重写handle方法 def handle(self): try: while True : #通信循环 # print(self) #给客户端回消息 #conn对象就是request #接收数据 print(self.client_address) data=self.request.recv(1024) print(data) if len(data)==0: return #发送数据 self.request.send(data.upper()) except Exception: pass if __name__ == '__main__': #实例化得到一个tcp连接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据 #第一个参数是绑定的地址,第二个参数传一个类 server=socketserver.ThreadingTCPServer(('127.0.0.1',8009),MyTcp)

转载:IO模型

老子叫甜甜 提交于 2019-11-29 17:13:07
简介 参考《UNIX Network Programming Volume 1, ThirdEdition [Electronic resources] : The Sockets Networking API》 进程运行状态分为内核态和用户态两种。 对于文件读取: 第一步:等待数据准备 第二步:将数据从内核空间复制到用户空间中 对于socket: 第一步:等待网络上的数据到达,然后被复制到内核空间 第二步:将数据从内核空间复制到用户空间中 同步与异步 同步与异步关注的是进程与内核的交互。同步进程触发IO并等待或者轮询IO是否完成。 异步进程触发IO后直接返回,IO交给内核来处理,完成后内核通知进程IO完成。 阻塞与非阻塞 阻塞和非阻塞关注的是进程(线程)在等待调用结果时的状态。阻塞是指调用结果返回之前,当前进程(线程)会被挂起。非阻塞则相反,当前进程(线程)不会被挂起。 同步阻塞IO模型 进程执行recvfrom系统调用后进程阻塞,等待数据准备好,此时进程让出CPU。当数据准备好后,等待内核将数据复制到用户空间。复制完成后,recvfrom系统调用返回成功,进程解除阻塞。此模型特点是IO过程的两步都会等待。 同步非阻塞IO模型 进程执行recvfrom系统调用,如果数据还没有准备好,那么recvfrom系统调用返回一个错误。这个过程一直重复,直到数据准备好后

Linux I/O 模型(待修改)

别等时光非礼了梦想. 提交于 2019-11-27 11:38:10
最近看到“服务器并发处理能力”章节,被里面的“I/O模型“搞得有点头晕,所以这里希望通过概念的辨析和对比,能更好的理解Linux的 I/O模型。 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别? 比较常用的IO Model有以下4种: blocking IO、nonblocking IO、IO multiplexing、asynchronous IO 由于signal driven IO在实际中并不常用,所以我这只提及剩下的四种IO Model。 1、blocking IO 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。 示例代码 while ( (n=read(STDIN_FILENO, buf, BUFSIZ) ) > 0) if (write (STDOUT_FILENO, buf, n) != n) err_sys (write error ”) ; 在linux中,默认情况下所有的socket都是blocking,当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包)

tftp协议的实现

痞子三分冷 提交于 2019-11-26 17:42:15
tftp协议是一种简单的文件传输协议,基于udp,使用端口号69.因为传输层协议使用的udp,因此tftp协议为了保证传输的可靠性,使用了一些手段,比如超时重传,数据块号确认。 tftp协议有两种传输模式,分别是二进制文件传输和文本文件传输模式。可以这样理解,除了文本文件都是二进制文件,传输模式的主要区别在于,文本文件由于是ascii码组成,所以可以认为8位数据中的第一位不重要。二进制文件表示8位数据中的所有位都重要。 协议默认数据块大小512,后续协议支持协商块大小。超时重传时间,模型为典型的cs模型,其中客户端主动发起请求下载或者上传文件。收到数据的一方(不管客户端还是服务器)都会对数据表进行确认,给对端发送确认报文。一共有五种报文类型。分别是读请求报文,写请求报文,数据报文,应答报文,错误报文。操作码用来区别这五种报文。客户端的请求主要是读请求与写请求。用于向客户端请求上传或者下载文件。区分的标记是操作码,short型的数字 1与2.需要注意的是,在发送之前,需要对该字段进行大小端转换,可以这么说,凡是数据类型不是char类型的,都需要进行大小端转换,这里的操作码和后面的block号都需要进行大小端转换。数据报文的操作码为3,然后就是数据的块号,用于对数据的计数。然后就是数据部分。对于回应报文也就是ack报文,只有四字节包括操作码4和回应的块号两字节

Python连载52-SOCKET编程示例

非 Y 不嫁゛ 提交于 2019-11-26 17:40:00
一、UDP编程 1.客户端Client:发起访问的一方。 2.服务器端 3.server段编程 (1)建立socket,socket是负责具体通信的一个实例 (2)绑定,为创建的socket指派固定的端口和IP地址 (3)接受对方发送内容 (4)给对方发送反馈,此步骤为非必须步骤 4.Client端编程 (1)建立通信的socket (2)发送内容到指定服务器 (3)接受服务器给定的反馈内容 5.模拟一下这个过程 (1)我们先建立一个服务器的函数 #服务器案例 import socket ​ #模拟服务器的函数 def serverFunc(): #1.建立socket #socket.AF_INET:使用IPV4协议族 #socket.SOCK_DGRAM:使用UDP通信 sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #2.绑定ip和port ​ #127.0.01:这个ip地址代表的是机器本身 #7852:随机指定的端口号 #地址是一个tuple类型,(ip.port) addr = ("127.0.0.1",7852) sock.bind(addr) ​ #接受对方消息 #等待方式为死等,没有其他可能性 #recvfrom接受的返回值是一个元组,前一项表示数据,后一项表示地址 #参数的含义是缓冲区大小 #rst

~~网络编程(八):UDP~~

独自空忆成欢 提交于 2019-11-26 17:03:16
进击のpython 网络编程——UDP 那现在看到这里的 这就是网络编程的最后一讲了 上面讲的都是关于TCP的编程方法 还记得TCP和UDP传输的区别吗? UDP简单就简单到它可以不借助管道来进行数据的传输 那要怎那么通过套接字方法来进行UDP方式的信息传输呢? 老规矩,信息收发创建两个py文件,服务端和客户端 server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 还记得这句话在TCP怎么写的吧 在这里数据传输方式用的是“数据报模式”,所以UDP协议也叫数据报协议 (phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)) 在这就要讲了,流式协议是不是有粘包现象啊 不好意思熬,在UDP这根本就没有这个现象 我们发现这个socket.socket每次都写很麻烦 所以我们可以在开始导入模块的时候这么写 form socket import * 虽然说不建议用*来导入模块,但是由于我们要使用的方法太多了 所以说,就可以对这个模块全部导入 所以上面的方法就可以写成 server = socket(socket.AF_INET,socket.SOCK_DGRAM) 那什么绑定端口,绑定IP,是不是都需要? server.bind(("127.0.0.1", 8080))

d29天 上传电影练习 UDP使用 ScketServer模块

南笙酒味 提交于 2019-11-26 14:31:32
TCP小结 socket套接字 TCP 1.最简易的版本的客户端与服务端之间通信 2.通信循环 recv() 阻塞 3.连接循环 accept() 阻塞 4.TCP粘包问题 5.struct模块 对数据进行打包处理 固定长度 pack unpack 小结 解决粘包问题的流程 服务端 1.生成一个字典 2.制作该字典的报头 json序列化 编码 统计长度 3.发送字典的报头 4.发送字典 5.最后发真实数据 服务端 客户端 1.先接受固定长度的4个字节字典报头 2.解析获取字典数据的长度 unpack(...)[0] 3.接受字典数据 解码 反序列化 4.接受真实数据 客户端 为什么要多加一个字典 1.打包的数据大小有限 2.可以携带更多的信息 上传电影练习 import socket import json import struct server = socket.socket() server.bind(('127.0.0.1',8080)) server.listen(5) while True: conn,addr = server.accept() while True: try: header_len = conn.recv(4) # 解析字典报头 header_len = struct.unpack('i',header_len)[0] # 再接收字典数据

socket

别说谁变了你拦得住时间么 提交于 2019-11-26 01:40:39
socket recv 和 recvfrom udp编程中 socket接受数据用recvfrom tcp中用recv udp 接受端口时recvfrom tcp用accept sk.recv(bufsize[,flag]) 接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。 sk.recvfrom(bufsize[.flag])  与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。 socket参数的详解 socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None) 创建socket对象的参数说明: family 地址系列应为AF_INET(默认值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。 (AF_UNIX 域实际上是使用本地 socket 文件来通信) type 套接字类型应为SOCK_STREAM(默认值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。 SOCK_STREAM 是基于TCP的,有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料传送。 SOCK_DGRAM 是基于UDP的

网络编程-python实现-socket(1.1.2)

白昼怎懂夜的黑 提交于 2019-11-25 22:38:27
目录 1.UDP是什么 2.代码实现 @(网络编程) 1.UDP是什么 Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。RFC 768 [1] 描述了 UDP。 Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的的事情。面向连接的是 TCP,该协议几乎做了所有的事情 2.代码实现 发送端 import socket def main(): #创建一个udp套接字 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #如果没有绑定,故接收端只有随机端口接收 udp_socket.bind(("",7789)) while True: #获取数据 send_data = input("请输入要发送的数据") if send_data == "exit": break #ip,port address = ("127.0.0.1",7788) #可以使用套接字收发数据 第一个参数必须为二进制数据 第二个参数是一个元组(ip,port) # udp