socket

python学习之网络编程

。_饼干妹妹 提交于 2020-02-25 22:11:18
socket编程 本地进程间通信(IPC) • 队列 • 同步(互斥锁、条件变量等) • 管道 网络进程间通信 问题: 本地通过进程PID来唯一标识一个进程,在网络中如何唯一标识一个进程? 网络层的“IP地址”可以唯一标识网络中的主机,而传输层的“协议+端口” 可以唯一标识主机中的应用程序(进程)。因此利用IP地址,协议,端口就 可以标识网络的进程。 什么是socket? socket(简称套接字) 是进程间通信的一种方式, 能实现不同主机间的进程间通信,我们 网络上各种各样的服务大多都是基于 Socket 来完成通信的。 创建socket 在 Python 中 使用socket 模块的函数 socket 就可以完成: socket.socket(AddressFamily, Type) 1). Address Family: AF_INET: IPV4用于 Internet 进程间通信 AF_INET6: IPV6用于 Internet 进程间通信 2). Type:套接字类型 SOCK_STREAM: 流式套接字,主要用于 TCP 协议 SOCK_DGRAM: 数据报套接字,主要用于 UDP 协 议 01_socket对象的建立 import socket #1. 创建socket对象 #family: AF_INET(IPv4) AF_INET6(IPv6) ========

Linux企业级开发技术(3)——epoll企业级开发之epoll模型

自作多情 提交于 2020-02-25 19:58:50
EPOLL事件有两种模型: Edge Triggered (ET) 边缘触发 只有数据到来,才触发,不管缓存区中是否还有数据。 Level Triggered (LT) 水平触发 只要有数据都会触发。 假如有这样一个例子: 1. 我们已经把一个用来从管道中读取数据的文件句柄(RFD)添加到epoll描述符 2. 这个时候从管道的另一端被写入了2KB的数据 3. 调用epoll_wait(2),并且它会返回RFD,说明它已经准备好读取操作 4. 然后我们读取了1KB的数据 5. 调用epoll_wait(2)...... Edge Triggered 工作模式: 如果我们在第1步将RFD添加到epoll描述符的时候使用了EPOLLET标志,那么在第5步调用epoll_wait(2)之后将有可能会挂起,因为剩余的数据还存在于文件的输入缓冲区内,而且数据发出端还在等待一个针对已经发出数据的反馈信息。只有在监视的文件句柄上发生了某个事件的时候 ET 工作模式才会汇报事件。因此在第5步的时候,调用者可能会放弃等待仍在存在于文件输入缓冲区内的剩余数据。在上面的例子中,会有一个事件产生在RFD句柄上,因为在第2步执行了一个写操作,然后,事件将会在第3步被销毁。因为第4步的读取操作没有读空文件输入缓冲区内的数据,因此我们在第5步调用 epoll_wait(2)完成后,是否挂起是不确定的

Win下建立Socket时注意事项

为君一笑 提交于 2020-02-25 19:26:23
Windows下socket建立 首先windows下要引入头文件windows.h和WinSock2.h (注意:因为windows.h里面包含有早期的socket1.几版本,所以当执行下命这个代码时,它会显示宏定义重复报错) #include<windows.h> #include<WinSock2.h> int main(){ return 0; } 微软针对此问题提出了2个解决方案。 将WinSock2.h头文件引用预处理放置在windows.h之前 在头文件预处理前加入 #define WIN32_LEAN_AND_MEAN WORD ver = MAKEWORD(2, 2);//版本号 WSADATA dat;//一个数据指针 WSAStartup(ver, &dat);//函数有2个参数,一个版本号,一个数据指针 // ↓ //连接socket和其他系统基本一样 // ↑ WSACleanup(); 来源: https://www.cnblogs.com/ranbom/p/12363148.html

【Kafka】深入探究--为什么Kafka速度快

痴心易碎 提交于 2020-02-25 19:22:23
Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间,但是实际上,Kafka的特性之一就是高吞吐率。 即使是普通的服务器,Kafka也可以轻松支持每秒百万级的写入请求,超过了大部分的消息中间件,这种特性也使得Kafka在日志处理等海量数据场景广泛应用。 针对Kafka的基准测试可以参考, Apache Kafka基准测试:每秒写入2百万(在三台廉价机器上) 下面从数据写入和读取两方面分析,为什么Kafka速度这么快。 写入数据 Kafka会把收到的消息都写入到硬盘中,它绝对不会丢失数据。为了优化写入速度Kafka采用了两个技术, 顺序写入 和 MMFile 。 顺序写入 磁盘读写的快慢取决于你怎么使用它,也就是顺序读写或者随机读写。在顺序读写的情况下,某些优化场景磁盘的读写速度可以和内存持平(注:此处有疑问, 不推敲细节,参考 http://searene.me/2017/07/09/Why-is-Kafka-so-fast/ )。 因为硬盘是机械结构,每次读写都会寻址->写入,其中寻址是一个“机械动作”,它是最耗时的。所以硬盘最讨厌随机I/O,最喜欢顺序I/O。为了提高读写硬盘的速度,Kafka就是使用顺序I/O。 而且Linux对于磁盘的读写优化也比较多,包括read-ahead和write-behind,磁盘缓存等

Web架构之单机时代

给你一囗甜甜゛ 提交于 2020-02-25 17:16:02
一、单机性能优化基础 1. 单机时代-动静分离 Nginx + Tomcat 实现动静分离 优势: 1.Nginx记录访问日志,Tomcat关闭日志记录功能,来提高Tomcat的性能。 2.用Nginx做七层的处理,比如ssl证书,让Nginx来实现,比如根据url来做判断,如果pc访问 转到什么地方,手机访转到什么地方 Nginx+PHP实现动静分离 2.单机时代-数据库分离 将web服务器和数据库单独部署 3.单机时代-组件分离 静态服务器使用单独的服务器 静态服务器使用独立一级域名,防止cookie提交 http 链接和链接之间没有相互关系的,这个时候 引入session,存放在服务器端,客户端引入cookie,记录session ID 静态服务器可以使用多个二级域名提高加载速度 静态资源作为NFS,静态资源存放在NFS上 二、Socket基础和TCP三次握手 1.什么是socket 在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 socket五元组 1.源IP地址 2.源端口 3.目的IP地址 4.目的端口 5.类型:tcp or udp 如何查看linux随机端口范围? cat /proc/sys/net/ipv4/ip

Python socket day5

半城伤御伤魂 提交于 2020-02-25 16:19:02
下载文件 程序04,05 服务端在接收到文件名时应该用try来打开文件,不应该用with open来打开 否则,如果文件名不存在,用with open 会出错误 客户端要判断服务端发送的数据是否为空,不然会创建空文本 来源: https://www.cnblogs.com/otome/p/12362059.html

python 获取本机ip

梦想与她 提交于 2020-02-25 15:26:03
def get_host_ip(): """ 查询本机ip地址 :return: ip """ try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('8.8.8.8', 80)) ip = s.getsockname()[0] finally: s.close() return ip if __name__ == '__main__': # 第一种方法 print(get_host_ip()) # 第二种方法 # 获取本机计算机名称 hostname = socket.gethostname() # 获取本机ip ip = socket.gethostbyname(hostname) print(ip) 来源: CSDN 作者: 放大的EZ 链接: https://blog.csdn.net/qq_27061049/article/details/104496919

socket状态说明 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT

[亡魂溺海] 提交于 2020-02-25 08:13:23
TCP状态转移要点 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。 1、LISTENING状态   FTP服务启动后首先处于侦听(LISTENING)状态。 2、ESTABLISHED状态   ESTABLISHED的意思是建立连接。表示两台机器正在通信。 3、CLOSE_WAIT 对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭 4、TIME_WAIT 我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。 目前有一种避免TIME_WAIT资源浪费的方法,就是关闭socket的LINGER选项

socket通信

☆樱花仙子☆ 提交于 2020-02-25 08:00:37
基本概念 1.进程在应用层产生数据,下发到运输层。 2.运输层有两种处理方式:UDP和TCP。 3.socket是对运输层协议的封装,包括TCP和UDP。 4.socket像是一扇数据流入和流出的大门,地址是ip和port。 5.socket占用端口收发信息,进程占用socket即占用了该端口。 6.socket有两个重要属性:本地的ip和端口LocalEndPoint,与该socket通信的主机的ip和端口RemoteEndPoint。 C#与UDP,TCP 记住:Socket是平等的,只要为一个Socket绑定ip和端口,那么就可以使用它收发消息了。socket使用同一个本地端口发送和接收消息。 TCP和UDP的区别就是通信的socket,在TCP中两个属性都赋值了,在UDP中只赋值了本机LocalEndPoint,未对远程RemoteEndPoint赋值。 UDP通信 假设有两台主机A和B进行UDP通信。 1.在A,B各创建一个Socket,称为SocketA和SocketB。 2.Socket调用bind()绑定一个本地的指定的ip和端口。其实调用bind()也阔以,调用sendto()时若socket没有绑定ip和端口,会随机绑定一个。 3.Socket绑定了ip和端口就具备了收发消息的功能。 4.udp中的socket的远程ip端口属性是null,因为并未建立连接

select与epoll

三世轮回 提交于 2020-02-25 04:24:28
select 监听一组句柄fd_set,第一次调用的时候循环所有句柄对应的驱动函数xx_poll,socket的话就是sock_poll。 循环遍历完毕之后会如果发现有可用的(活跃状态的)fd,则返回,返回的时候会返回活跃的fd个数,同时会 把不活跃的fd在fd_set移除。如果循环fd_set一遍以后发现没有活跃的fd。假设此时socket在非阻塞模式下, 那么select会重复遍历这些fd_set直到超过了我们设置的时间限制,可是在阻塞模式下呢,怎么处理? 阻塞模式下我们没有必要设置超时限制,因为如果第一遍变量fd_set发现没有活跃的fd那么,这条进程会被 挂起的。进程怎么被激活呢,实际上进程是被挂在了n个fd的等待队列里,只要一个fd准备就绪那么进程就 会被唤醒,网卡接收了数据包发送一个中断给内核,内核处理这个中断,唤醒进程,这里是涉及到软中断的 ,有兴趣可以看看。select被唤醒之后,并不知道是哪一个fd把自己唤醒的,所以还要来一个遍历,过程跟 上面说的是一样的。select阻塞到返回经历的内核和用户空间的拷贝,先把fd_set从用户空间拷贝给内核空 间,内核空间处理完毕之后把活动的fd再copy回来。其实后者还好,但是前者当fd_set百万级别的时候,就 费劲了。个中细节我并非完全了解,可是单看这个设计模式就觉着有效率问题了,感觉真的很傻,copy不说,