recv

socket模块

匿名 (未验证) 提交于 2019-12-02 23:53:01
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。socket通常被叫做“套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。python中socket模块为操作系统的socket实现提供了一个python接口。 s=socket.socket(family,type)的实例方法 (1) s.bind((address,port)) 将socket绑定到一个地址和端口上,通常用于socket服务端 address必须是一个双元素元组,((host,port)),主机名或者IP地址+端口号。如果端口号正在被使用或者主机名或IP地址错误,则引发socket.error异常。 端口号的使用是有限制的,在linux或者unix之中只有系统管理员才能使用1024以下的端口,这些端口号用于标准服务。 s.accept() 返回一个客户机socket,带有客户机端的地址信息。 调用accept方法的时候,socket会进入阻塞状态。客户请求连接时,方法建立连接并返回服务器。 accept方法返回一个双元素元组,形如(connection,address)

socketserver模块

匿名 (未验证) 提交于 2019-12-02 23:52:01
基于tcp协议通信服务端必须满足至少三点:1. 绑定一个固定的ip和port2. 一直对外提供服务,稳定运行3. 能够支持并发 # 服务端必须满足至少三点: # 1. 绑定一个固定的ip和port # 2. 一直对外提供服务,稳定运行 # 3. 能够支持并发 import socketserver # 自定义类用来处理通信循环 class MyTCPhanler(socketserver.BaseRequestHandler): def handle(self): while True: try: data = self.request.recv(1024) if len(data) == 0: break # 针对linux系统 print('-->收到客户端的消息: ', data) self.request.send(data.upper()) except ConnectionResetError: break self.request.close() if __name__ == '__main__': server=socketserver.ThreadingTCPServer(('127.0.0.1',8081),MyTCPhanler) server.serve_forever() # 链接循环 服务端 from socket import * client =

Day 36 阻塞与非阻塞 多路复用

匿名 (未验证) 提交于 2019-12-02 23:47:01
Ŀ¼ 模型即解决某个问题的固定套路 I/O 指的是输入输出 IO的问题:当我们要输入数据或输出数据通常很长一段时间,当然是对于CPU而言 在等待输入的过程中,CPU就处于闲置状态,没事干,造成了资源浪费 注意:IO其实有很多类型 例如 socket网络IO,内存到内存的copy,等待键盘输入,对比起来socket网络IO需要等待的时间是最长的,这也是咱们重点关注的地方, 学习IO模型要干什么?就是在等待IO操作的过程中利用CPU做别的事情, 操作系统有两种状态: 内核态和用户态 ,当操作系统需要控制硬件时例如接受网卡上的数据,必须先转换到内核态,接受完数据后,要把数据从操作系统缓冲器copy到应用程序的缓冲区,从内核态转为用户态, 涉及到的步骤 buffer 缓冲 cache 缓存 将数据读入到内存所使用的空间叫做**缓冲** 从内存中读取数据存放数据的空间叫作**缓存**** 缓冲是为了降低IO次数 缓存是为了提高读取效率 wait_data copy_data recv accept 需要经历 wait->copy send 只需要经历copy 默认情况下 TCP程序就是阻塞IO模型 1.执行BLOCK将进程阻塞 2.等待数据 3.copy数据 4.唤醒进程,继续,执行 该模型提高效率方式,当你执行recv/accept会进入wait_data的阶段,

read和recv等函数的区别

匿名 (未验证) 提交于 2019-12-02 23:26:52
1 recv和send recv和send函数提供了和read和write差不多的功能.不过它们提供 了第四个参数来控制读写操作. int recv ( int sockfd , void * buf , int len , int flags ) ; int send ( int sockfd , void * buf , int len , int flags ) ; 前面的三个参数和read,write一样,第四个参数可以是0或者是以下的组合 | MSG_DONTROUTE | 不查找路由表 | | MSG_OOB | 接受或者发送带外数据 | | MSG_PEEK | 查看数据 , 并不从系统缓冲区移走数据 | | MSG_WAITALL | 等待所有数据 | MSG_DONTROUTE:是send函数使用的标志.这个标志告诉IP协议.目的主机在本地网络上面,没有必要查找路由表.这个标志一般用网络诊断和路由程序里面. MSG_OOB:表示可以接收和发送带外的数据.关于带外数据我们以后会解释的. MSG_PEEK:是recv函数的使用标志,表示只是从系统缓冲区中读取内容,而不清楚系统缓冲区的内容.这样下次读的时候,仍然是一样的内容.一般在有多个进程读写数据时可以使用这个标志. MSG_WAITALL是recv函数的使用标志,表示等到所有的信息到达时才返回

TensorFlow中的通信机制――Rendezvous(二)gRPC传输

匿名 (未验证) 提交于 2019-12-02 23:06:17
背景 [作者: DeepLearningStack ,阿里巴巴算法工程师,开源TensorFlow Contributor] 本篇是TensorFlow通信机制系列的第二篇文章,主要梳理使用gRPC网络传输部分模块的结构和源码。如果读者对TensorFlow中Rendezvous部分的基本结构和原理还不是非常了解,那么建议先从 这篇文章 开始阅读。TensorFlow在最初被开源时还只是个单机的异构训练框架,在迭代到0.8版本开始正式支持多机分布式训练。与其他分布式训练框架不同,Google选用了开源项目gRPC作为TensorFlow的跨机通信协议作为支持。gRPC的编程和使用其实是相对复杂的,TensorFlow为了能让gRPC的调用更加平滑,在调用链封装和抽象上面做了较多工作,甚至有些工作例如创建和管理gRPC channel涉及到了GrpcSession模块。从个人角度来看,利用gRPC进行Tensor通信的过程已经足够丰富,所以我们只针对gRPC传输Tensor过程进行梳理,至于涉及到gRPC管理方面的内容会在另一篇介绍分布式Session创建和管理的文章中集中梳理。 跨进程通信过程 根据之前写博客的经验,直接介绍类图结构和源码部分可能会让人懵圈,还是先从逻辑上把通信过程梳理清楚更能做到深入浅出。其实对于不是非常了解分布式系统或大规模并发系统的读者而言

IO模型

匿名 (未验证) 提交于 2019-12-02 23:05:13
什么是IO模型? IO指的是输入输出,其执行速度非常慢 模型,只固定的套路 IO模型就是指实现输入输出的套路 IO的分类 1.本地IO 指的是输入输出到本地计算机 如:写入硬盘 2.网络IO 指的是输入输出到网络中的计算机,速度远比本地IO慢 网络IO输入输出过程 IO模型的分类 (重点) 1.阻塞型IO    之前学习的IO操作除了gevent都是阻塞型的    1.可以利用多线程来提高IO      线程不能太多,会造成内存溢出    2.线程池可以解决下线程太多问题      但如果线程池达到最大数,其他客户端将进入等待    3.在单线程下并发来处理 可以使单核下的效率最高 2.非阻塞IO 非阻塞IO的服务器 import socket server = socket.socket() server.bind(('192.168.1.67',4396)) server.listen() #设置为非阻塞IO server.setblocking(False) #存放所有连接过来的客户端 clients = [] while True: try: client,addr = server.accept() print('连入了一个客户端!') clients.append(client) except BlockingIOError: #已经关闭的客户端 close_c = [

Python实现远程执行命令(cmd)文件上传与此方法类似

匿名 (未验证) 提交于 2019-12-02 22:51:30
server端: import socket import subprocess#cmd模块 # subprocess.Popen() sk = socket.socket() address = ('127.0.0.1',8000) sk.bind(address) sk.listen(3) print('writing..........') while True: conn,addr = sk.accept() print(addr) while True: try: data = conn.recv(1024) except Exception: break print(str(data,'utf8')) #拿到一个对象 obj = subprocess.Popen(str(data,'gbk'),shell=True,stdout=subprocess.PIPE) cmd_result = obj.stdout.read() #int类型和bytes类型不能直接转换,需要中间人str,才能进行转换 result_len = bytes(str(len(cmd_result)),'utf8') conn.sendall(result_len) conn.sendall(cmd_result) # if not data:break # inp = input('>>>>>>

python发送邮件

匿名 (未验证) 提交于 2019-12-02 22:51:30
  1、通过Python的 yagmail模块发送邮件的前提: #!/usr/bin/env python # -*- coding: utf-8 -*- #author tom import yagmail args={ "user":"302624476@qq.com", #发邮件账号 "password":"xxxxxx", #发件账号对应的密码(QQ使用的是授权码,而不是QQ密码) "host":"smtp.qq.com", #邮件账号的SMTP服务器 "port":"465" #SMTP服务器端口 465 } # 收件人列表 emailList=["tjp1991@126.com"] #实例化发送者 email = yagmail.SMTP(**args) # 调用消息发送函数,参数分别是:to=收件人列表,subject 邮件标题,contents 邮件正文,cc 邮件抄送人 # email.send(to=emailList,subject="My name is tom",contents="Today is 20190724",cc="jsh******@sina.com") email.send(to=emailList,subject="My name is tom",contents="Today is 20190724") 实例: #!/usr/bin

Python socket & socket server

匿名 (未验证) 提交于 2019-12-02 22:51:08
socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket(套接字)。 建立网络通信连接至少要一对socket。socket是对TCP/IP的封装 步骤: 服务器端: 实例化类 bind 绑定端口 listen 监听端口 accept 等待连接(阻塞) sock, addr = server.accept() sock 是为客户端实例化的socket类, addr 是客户端的地址 与客户端交互:recv 接收(阻塞)、send 发送数据 close 断开连接 客户端: 实例化类 connect 连接端口 与服务器端交互:recv 接收(阻塞)、send 发送数据 close 断开连接 server: import socket server = socket.socket() server.bind(('localhost', 8001)) server.listen(3) conn, addr = server.accept() data = conn.recv(1024) conn.send(b'Got') print('recv:', data) server.close() client: import socket client = socket.socket() client.connect(('localhost',

Setting timeout to recv function

不羁岁月 提交于 2019-12-02 22:14:45
I read from socket using recv function. I have problem when no data available for reading. My programm just stops. I found that I can set timeout using select function. But looks that timeout affects select function itself and recv that goes after select still waits uncontinuously. fd_set set; struct timeval timeout; FD_ZERO(&set); /* clear the set */ FD_SET(s, &set); /* add our file descriptor to the set */ timeout.tv_sec = SOCKET_READ_TIMEOUT_SEC; timeout.tv_usec = 0; int rv = select(s, &set, NULL, NULL, &timeout); if((recv_size = recv(s , rx_tmp , bufSize ,0)) == SOCKET_ERROR) { ... } How