recv

socket编程基础

断了今生、忘了曾经 提交于 2020-03-07 12:48:06
socket编程 什么是socket 定义 socket通常也称作 套接字 ,用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过 套接字 向网络发出请求或者应答网络请求。 socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭) socket和file的区别: file模块是针对某个指定文件进行【打开】【读写】【关闭】 socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】 python相关 Python 提供了两个基本的 socket 模块。py2位大写,py3全部小写 第一个是 Socket,它提供了标准的 BSD Sockets API。 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发 socket编程实现 流程图:  说明: 服务端 1.服务端需要导入socket模块,并创建套接字(实例化为一个对象) import socket s = socket.socket() 2.绑定套接字s到本地IP和端口 ip_port = ('127.0.0.1',8080) s.bind(ip_port) 3

python学习笔记10 ----网络编程

感情迁移 提交于 2020-03-07 12:47:29
网络编程 网络编程需要知道的概念 网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂。网络体系结构解决互质性问题彩是分层方法。 1. 网络(OSI)的7层模型: 应用层--->为应用程序提供网络通信服务 表示层--->数据表示 会话层--->主机间通信(两个应用进程间) 传输层--->端到端的连接,隔离网络的上下层协议,使得网络应用与下层协议无关 网络层--->寻找最优路径,转发数据包 数据链路层--->无差错的链路连接 物理层--->二进制传输 2. 端口   是一种抽象的软件结构,包括一些数据结构和I/O缓冲区。与协议有关。 3. 套接字存在于通信区域中。   通信区域也叫地址族,它是一个抽象的概念,主要用于将通过套接字通信的进程的共有特性综合在一起。   为保证数据的正确性,在网络协议中需要制定网络字节顺序,采用统一的网络字节顺序。 网络通信三要素:   IP地址:用于表示主机(IP地址 = 网络ID+主机ID)   端口号:用于标识进程的逻辑端口   传输协议:TCP UDP 网络通信过程就是一个不断封装和解析的过程 Socket是连接应用程序与网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定操作与驱动程序建立关系。 套接字   套接字是为特定网络协议(例如TCP/IP,ICMP/IP

几种网络服务器模型的介绍与比较

五迷三道 提交于 2020-03-05 16:52:59
原文链接 前言 事件驱动为广大的程序员所熟悉,其最为人津津乐道的是在图形化界面编程中的应用;事实上,在网络编程中事件驱动也被广泛使用,并大规模部署在高连接数高吞吐量的服务器程序中,如 http 服务器程序、ftp 服务器程序等。相比于传统的网络编程方式,事件驱动能够极大的降低资源占用,增大服务接待能力,并提高网络传输效率。 关于本文提及的服务器模型,搜索网络可以查阅到很多的实现代码,所以,本文将不拘泥于源代码的陈列与分析,而侧重模型的介绍和比较。使用 libev 事件驱动库的服务器模型将给出实现代码。 本文涉及到线程 / 时间图例,只为表明线程在各个 IO 上确实存在阻塞时延,但并不保证时延比例的正确性和 IO 执行先后的正确性;另外,本文所提及到的接口也只是笔者熟悉的 Unix/Linux 接口,并未推荐 Windows 接口,读者可以自行查阅对应的 Windows 接口。 阻塞型的网络编程接口 几乎所有的程序员第一次接触到的网络编程都是从 listen()、send()、recv() 等接口开始的。使用这些接口可以很方便的构建服务器 / 客户机的模型。 我们假设希望建立一个简单的服务器程序,实现向单个客户机提供类似于“一问一答”的内容服务。 图 1. 简单的一问一答的服务器 / 客户机模型 我们注意到,大部分的 socket 接口都是阻塞型的。所谓阻塞型接口是指系统调用(一般是

python16_day07【Socket网络编程】

匆匆过客 提交于 2020-03-05 02:45:41
/*--> */ /*--> */ 一、简介   1.理解C/S,B/S   2.IOS七层模型(http://www.cnblogs.com/linhaifeng/articles/5937962.html)    二、什么是Socket   我们看看Socket的位置在什么地方?   Socket是应用层与 TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中, Socket其实就是一个门面模式,它把复杂的 TCP/IP协议族隐藏在 Socket接口后面,对用户来说,一组简单的接口就是全部,让 Socket去组织数据,以符合指定的协议。 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。 三、Socket工作流程   先从服务器端说起。服务器端先初始化 Socket,然后与端口绑定 (bind),对端口进行监听 (listen),调用 accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个 Socket,然后连接服务器 (connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束 1

Varnish的vcl子程序

我是研究僧i 提交于 2020-03-04 18:38:08
Varnish的VCL子程序 以下内容参考: http://book.varnish-software.com/4.0/ VCL子进程,在其中定制Varnish的行为。VCL子例程可用于:添加自定义标头,更改Varnish错误消息的外观,在Varnish中添加HTTP重定向功能,清除内容以及定义缓存对象的哪些部分是唯一的。 注意:强烈建议尽可能让默认的内置子程序。内置子程序的设计考虑到安全性,这通常意味着它们可以合理的方式处理VCL代码中的任何缺陷。 vcl_recv 规范化客户端输入 选择一个后端Web服务器 重新编写Web应用程序的客户端数据 根据客户端输入决定缓存策略 访问控制列表(ACL) 安全屏障,例如针对SQL注入攻击 修复错误,例如index.htlm- >index.html vcl_recv是Varnish第一个VCL子进程,将客户端请求解析为其基本数据结构之后执行。 vcl_recv有四个主要用途: 修改客户端数据以减少缓存的多样性。 决定使用哪个Web服务器。 根据客户端数据决定缓存策略。 执行特定Web应用程序所需的重写规则。 在vcl_recv你可以执行以下终止操作: pass:它通过缓存查找,但它执行Varnish请求流的其余部分。 pass不会将来自后端的响应存储在缓存中。 pipe:此操作创建一个全双工管道,将客户端请求转发到后端,且不查看其内容

epoll三种工作模式

女生的网名这么多〃 提交于 2020-03-04 13:04:05
水平触发模式-根据读来解释 只要fd对应的缓冲区有数据 epoll_wait返回 返回的次数与发送数据的次数没有关系 epoll默认的工作模式 边沿触发模式 - ET fd - 默认阻塞属性 客户端给server发数据: 发一次数据server 的 epoll_wait返回一次  不在乎数据是否读完  如果读不完, 如何全部读出来? while(recv()); 数据读完之后recv会阻塞 解决阻塞问题 设置非阻塞 - fd 边沿非阻塞触发 效率最高 如何设置非阻塞 open() □ 设置flags □ 必须 O_WDRW | O_NONBLOCK □ 终端文件: /dev/tty fcntl() □ int flag = fcntl(fd, F_GETFL); □ flag |= O_NONBLOCK; □ fcntl(fd, F_SETFL, flag); 将缓冲区的全部数据都读出 while(recv() > 0) {printf(): } epoll_wait 调用次数越多, 系统的开销越大 水平触发模式 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <string.h> #include <sys/socket.h> #include

MPI学习笔记

荒凉一梦 提交于 2020-03-04 06:53:15
MPI学习笔记 利用MPI可以加速排序算法。 调用c++标准库的sort对1e7的数据进行排序,大约需要2.2秒的时间。 使用MPI将程序并行化,可以大大加快速度。 方法一 将主线程待排序的数组分为两部分,送到两个子线程排序,排完之后再送到主线程,将它们合并起来。 代码如下: # include <iostream> # include <mpi.h> # include <algorithm> using namespace std ; const int MAX_size = 1e7 ; int main ( int argc , char * * argv ) { int numprocs , myid , source ; MPI_Status status ; MPI_Init ( & argc , & argv ) ; MPI_Comm_rank ( MPI_COMM_WORLD , & myid ) ; MPI_Comm_size ( MPI_COMM_WORLD , & numprocs ) ; int siz = MAX_size / 2 ; if ( myid == 0 ) { int * nums = new int [ MAX_size + 3 ] ; for ( int i = 0 ; i < MAX_size ; i ++ ) { nums [ i ]

Part7 - Socket编程

和自甴很熟 提交于 2020-03-02 03:05:43
本节内容 1.Socket 编程 2. Socket多连接实现 3. 动态导入 4. 断言 一、Socket编程 Socket(TCP和UDP协议的封装) Socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。 Socket Families(地址簇) 网络层 socket.AF_UNIX unix本机进程间通信(默认进程间不可通信) socket.AF_INET  IPV4  socket.AF_INET6 IPV6 Socket Types(协议) 传输层 socket.SOCK_STREAM for tcp socket.SOCK_DGRAM for udp socket.SOCK_RAW 原始套接字,利用它可以通过IP_HDRINCL套接字选项由用户构造IP头。 socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。 socket.SOCK_SEQPACKET 废弃了 服务端 import socket,os,time server = socket.socket() # 实例化服务端, 设定协议和地址簇,默认 family=AF_INET, type=SOCK_STREAM server.bind(( 'localhost' ,9999) ) # 绑定监听端口 server.listen()

粘包的原理与解决

徘徊边缘 提交于 2020-03-01 10:45:37
粘包现象 须知:只有TCP有粘包现象,UDP永远不会粘包 粘包不一定会发生 如果发生了:1.可能是在客户端已经粘了       2.客户端没有粘,可能是在服务端粘了 所谓粘包问题主要还是因为接收方不知道消息之间的界限 还有系统缓存区的问题 时间差的原因,不知道一次性提取多少字节的数据所造成的。 socket收发消息的原理 什么是缓冲区 输入输出缓冲区的默认大小一般都是 8K,可以通过 getsockopt() 函数获取:1024字节=1k 缓冲区的作用? 存储少量数据 如果你的网络出现短暂的异常或者波动,接收数据就会出现短暂的中断,影响你的下载或者上传的效率. 但是 凡是都是双刃剑,缓冲区解决了上传下载的传输效率的问题,带来了黏包问题. 为什么出现粘包? 第一种.连续短暂的send多次(数据量很少),你的数据会统一发送出去, (不可控) 第二种: send的数据过大,大于对方recv的上限时,对方第2次recv时,会接收上一次没有recv完的剩余的 1,接收方没有及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)** recv会产生黏包(如果recv接受的数据量(1024)小于发送的数据量,第一次只能接收规定的数据量1024,第二次接收剩余的数据量) 2,发送端需要等缓冲区满才发送出去

6月10号

南楼画角 提交于 2020-02-29 03:47:27
阻塞io(blocking IO) 当我们用套接字通讯时套接字对象调用revform方法 系统内核就开始了network io 的第一个阶段 wair for data 这是系统内核就等待足够的数据到来 而用户整个进程就会被阻塞 当系统内核等到了数据 它就会将数据从缓存中拷贝到 用户进程的内存中 然后系统返回结果给recv 用户进程接受到数据 解除阻塞状态 进入就绪态 重新运行起来 所以在 wait for data 和copy data 用户进程都属于阻塞的状态 简单的解决办法就是让服务器端使用多线程或者多进程,目的是为了让每一个接口都有用一个独立的线程或进程 这样任何一个连接有网络io都 不会影响其他线程或进程的运行 它阻塞它的 我运行我的 但是 开启多线程或多进程 在遇到同时要想相应巨大连接请求的时候 都会严重占据系统资源 降低服务器对外界的响应速度 所以开启多进程或 多线程并不能完全解决网络阻塞io这个问题 当然 我们会想到你无线开线程和进程系统会扛不住 我们可以限制线程和进程的同步开启 可以用线程池或进程池 来维持一定合理数量的线程或 进程 并让空闲的线程重新承担新的执行任务 规定只能同时开线程池里面规定数量的线程 减少创建和关闭连接的频率 降低系统的开销 但是这样也并非完美 线程池和进程池 能一定程度上缓解 系统的开销 但是如果用户数量大大超出 线程池始终有自己的上线