recvfrom

深入了解Netty【四】IO模型

我是研究僧i 提交于 2019-12-06 06:57:23
引言 IO模型就是操作数据输入输出的方式,在Linux系统中有5大IO模型:阻塞式IO模型、非阻塞式IO模型、IO复用模型、信号驱动式IO模型、异步IO模型。 因为学习Netty必不可少的要了解IO多路复用模型,本篇是基础。 名词概念 阻塞:指向调用方,在调用结果返回之前,调用方线程会挂起,直到结果返回。 非阻塞:指向调用方,在调用结果返回之前,调用方线程会处理其他事情,不会阻塞。 同步:指向被调用方,被调用方得到结果后再返回给调用方。 异步:指向被调用方,被调用方先应答调用方,然后计算结果,最终通知并返回给调用方。 recvfrom函数:系统调用,经socket接收数据。 5中IO模型 1、阻塞式IO模型(blocking I/O) 进程调用recvfrom函数,在数据没有返回之前,进程阻塞,直到数据返回后,才会处理数据。 2、非阻塞式IO模型(non-blocking I/O) 进程调用recvfrom函数,如果数据没有准备好就返回错误提示,之后进程循环调用recvfrom函数,直到有数据返回。 3、IO复用模型(I/O multiplexing) 进程调用select,如果没有套接字变为可读,则阻塞,直到有可读套接字之后,调用recvfrom函数,返回结果。 4、信号驱动式IO模型(signal-driven I/O) 进程先注册信号驱动,之后进程不阻塞,当数据准备好后

TCP 和 UDP 的区别---还有一个UTP一

雨燕双飞 提交于 2019-12-06 00:31:43
面试的时候会经常问到这些问题,所以要对比了解一下他们之间的差别,能讲出个所以然来。多积累多总结,懵逼中。。。 TCP 和 UDP TCP与UDP基本区别 :   1.基于连接与无连接   2.TCP要求系统资源较多,UDP较少;   3.UDP程序结构较简单   4.流模式(TCP)与数据报模式(UDP);   5.TCP保证数据正确性,UDP可能丢包   6.TCP保证数据顺序,UDP不保证    UDP应用场景:   1.面向数据报方式   2.网络数据大多为短消息   3.拥有大量Client   4.对数据安全性无特殊要求   5.网络负担非常重,但对响应速度要求高 具体编程时的区别    1.socket()的参数不同    2.UDP Server不需要调用listen和accept    3.UDP收发数据用sendto/recvfrom函数    4.TCP:地址信息在connect/accept时确定    5.UDP:在sendto/recvfrom函数中每次均 需指定地址信息    6.UDP:shutdown函数无效 编程区别-- 通常我们在说到网络编程时默认是指TCP编程,即用前面提到的socket函数创建一个socket用于TCP通讯,函数参数我们通常填为SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0)

socket

元气小坏坏 提交于 2019-12-05 15:51:17
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的

IO模式和IO多路复用

ぐ巨炮叔叔 提交于 2019-12-05 09:42:55
原文链接: https://www.cnblogs.com/zingp/p/6863170.html https://www.cnblogs.com/guxuanqing/p/10482066.html   网络编程里常听到阻塞IO、非阻塞IO、同步IO、异步IO等概念,总听别人装13不如自己下来钻研一下。不过,搞清楚这些概念之前,还得先回顾一些基础的概念。 回到顶部 1 基础知识回顾 注意: 咱们下面说的都是 Linux环境 下,跟Windows不一样哈~~~ 1.1 用户空间和内核空间   现在操作系统都采用虚拟寻址, 处理器先产生一个虚拟地址 ,通过 地址翻译成物理地址(内存的地址) ,再通过总线的传递,最后处理器拿到某个物理地址返回的字节。   对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用

Python连载52-SOCKET编程示例

送分小仙女□ 提交于 2019-12-05 01:12:26
一、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-12-03 00:41:02
# 使用自换接口的UDP服务器和客户端 # UDP client and server on localhost # 本地主机上的UDP客户端和服务器 import sys import argparse # 命令行选项与参数解析 import socket # 套接字 from datetime import datetime # 日期时间模块的日期时间函数 import sys MAX_BYTES = 65535 def server(port): # 定义一个服务器函数 入口 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建了一个空套接字 并 标记了所属的特定类别:协议族AF_INET,与数据报类型SOCK_DGRAM(数据报datagram,不是数据包(packet)。 sock.bind(( ‘ 127.0.0.1 ‘ , port)) # bind()命令请求绑定一个UDP网络地址,有简单的python二元组构成,包含了一个ip和一个整型的UDP端口号。如果被占用将报错。[errno98] print ( ‘ Listening at {} ‘ .format(sock.getsockname())) # 打印出目前套接字绑定到的IP地址以及端口。通过socket 函数的getsockname(

阻塞IO、非阻塞IO、IO多路复用、同步IO、异步IO 的理论

匿名 (未验证) 提交于 2019-12-03 00:41:02
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。 Stevens在文章中一共比较了五种IO Model: 由于signal driven IO在实际中并不常用,所以我这只提及剩下的四种IO Model。 再说一下IO发生时涉及的对象和步骤。 对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个阶段: 记住这两点很重要,因为这些IO Model的区别就是在两个阶段上各有不同的情况。 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 当用户进程调用了recvfrom这个系统调用

IO模型

匿名 (未验证) 提交于 2019-12-03 00:15:02
用户调用了recvfrom这个系统调用,线程在等待内核获取数据和拷贝数据的两个阶段,线程都是被阻塞的 socket . accept socekt . recv 都会进入阻塞态 1. 在等待文件 io 的过程中,另外开起一个线程,让其他的连接不用排队,缺点是开启多线程是非常消耗系统资源的,线程的切换也是需要消耗时间的 应用程序以轮询的方式不断询问io的读取状态,用户调用recvfrom之后进程不会阻塞,会得到一个错误,当内核向用户内存拷贝数据时会进入阻塞状态,缺点是会大量的进行用户态到内核态的切换非常消耗时间 socket . setblocking ()#默认是 True socket . setblocking ( False ) #False的话就成非阻塞了 select/epoll这个function不断轮询所有的socket,当数据准备好内核会通知select就会返回,用户在调用read操作将数据拷贝到用户内存中 socket . setblocking ( False ) select . select ( read_l ,[],[]) 当用户读取数据时,回立刻进行返回,当数据拷贝到用户内存时,主动给用户进程发送一个signal信号 1. 阻塞与非阻塞,阻塞式 IO 模型会阻塞进程的执行知道操作完成,而非阻塞 IO 会立刻返回 2. 同步与异步,同步 IO 会将进程阻塞

UDP协议

匿名 (未验证) 提交于 2019-12-03 00:00:02
Ŀ¼ # *****************udp服务端**************** # 基础版本 import socket # udp server = socket . socket ( type = socket . SOCK_DGRAM ) server . bind (( '127.0.0.1' , 8000 )) # udp不要建立连接,直接发 # 需不需要监听? # 跟tcp的不是一样的 # data = server.recvfrom(1024) data , addr = server . recvfrom ( 1024 ) # data 是个元组,第一个参数是数据部分,第二个参数是客户端地址 print ( data ) server . sendto ( data . upper (), addr ) # 加入通信循环 import socket # udp server = socket . socket ( type = socket . SOCK_DGRAM ) server . bind (( '127.0.0.1' , 8000 )) while True : data , addr = server . recvfrom ( 1024 ) print ( data ) server . sendto ( data . upper (),

4-6 IO模型对比

眉间皱痕 提交于 2019-12-01 06:49:53
IO模型比较分析 到目前为止,已经将四个IO Model都介绍完了。现在回过头来回答最初的那几个问题:blocking和non-blocking的区别在哪,synchronous IO和asynchronous IO的区别在哪。 先回答最简单的这个:blocking vs non-blocking。前面的介绍中其实已经很明确的说明了这两者的区别。调用blocking IO会一直block住对应的进程直到操作完成,而non-blocking IO在kernel还准备数据的情况下会立刻返回。 再说明synchronous IO和asynchronous IO的区别之前,需要先给出两者的定义。Stevens给出的定义(其实是POSIX的定义)是这样子的: A synchronous I/O operation causes the requesting process to be blocked until that I/O operationcompletes; An asynchronous I/O operation does not cause the requesting process to be blocked; 两者的区别就在于synchronous IO做”IO operation”的时候会将process阻塞。按照这个定义,四个IO模型可以分为两大类,