socket

select模型的原理、优点、缺点

时光怂恿深爱的人放手 提交于 2020-02-25 00:34:53
关于I/O多路复用: I/O多路复用(又被称为“事件驱动”),首先要理解的是,操作系统为你提供了一个功能,当你的某个socket可读或者可写的时候,它可以给你一 个通知。这样当配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据而不 做纯返回-1和EAGAIN的无用功。写操作类似。操作系统的这个功能通过select/poll/epoll之类的系统调用来实现,这些函数都可以同时 监视多个描述符的读写就绪状况,这样,**多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就叫I/O多路复用,这里的“复用”指的是复用 同一个线程。 I/O复用之select 1、介绍: select系统调用的目的是:在一段指定时间内,监听用户感兴趣的文件描述符上的可读、可写和异常事件。poll和select应该被归类为这样的系统 调用,它们可以阻塞地同时探测一组支持非阻塞的IO设备,直至某一个设备触发了事件或者超过了指定的等待时间——也就是说它们的职责不是做IO,而是帮助 调用者寻找当前就绪的设备。 下面是select的原理图: 2 、select系统调用API如下: #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int

从问题看本质: 研究TCP close_wait的内幕

非 Y 不嫁゛ 提交于 2020-02-24 23:13:29
Socket 应用服务器 Tomcat OS Ubuntu /* * @author: ahuaxuan * @date: 2010-4-30 */ 最近遇到的一个关于socket.close的问题,在某个应用服务器出现的状况(执行netstat -np | grep tcp): tcp 0 0 10.224.122.16:50158 10.224.112.58:8788 CLOSE_WAIT tcp 0 0 10.224.122.16:37655 10.224.112.58:8788 CLOSE_WAIT tcp 1 0 127.0.0.1:32713 127.0.0.1:8080 CLOSE_WAIT tcp 38 0 10.224.122.16:34538 10.224.125.42:443 CLOSE_WAIT tcp 38 0 10.224.122.16:33394 10.224.125.42:443 CLOSE_WAIT tcp 1 0 10.224.122.16:18882 10.224.125.10:80 CLOSE_WAIT tcp 1 0 10.224.122.16:18637 10.224.125.10:80 CLOSE_WAIT tcp 1 0 10.224.122.16:19655 10.224.125.12:80 CLOSE_WAIT .........

Boost::Asio入门剖析

时光总嘲笑我的痴心妄想 提交于 2020-02-24 17:26:21
Boost::Asio可以在socket等I/O对象上执行同步或异步操作,使用Boost::Asio前很有必要了解Boost::Asio、你的程序以及它们交互的过程。 作为一个引导的例子,我们思考一个当一个socket执行连接操作时发生了什么,我们首先开始一个同步的例子 你的程序需要一个io_service对象,io_service把你的程序和操作系统I/O设备链接起来。 boost::asio::io_service io_service; 你的程序需要一个I/O对象来执行I/O操作,比如tcp socket boost::asio::ip::tcp::socket socket(io_service); 执行一个同步的连接操作时,会顺序发生下列事件 1.你的程序通过调用I/O对象来启动连接操作 socket.connect(server_endpoint); 2.I/O对象转发请求给io_service 3.io_service通知操作系统执行连接操作 4.操作系统把连接操作的结果返回给io_service 5.io_service把操作的错误转化成boost::system::error_code,一个error_code可能同特定的值进行比较,或者作为一个boolen(false结果意味着没有错误发生),结果被传送会I/O对象。 6.如果操作失败I

socket笔记2

梦想的初衷 提交于 2020-02-24 16:46:08
2.10 网络报文的数据格式定义及使用 网络报文包含两个部分,头和体。 服务端 // Created by Surser on 2020/1/17. // Copyright © 2020 Surser. All rights reserved. // #ifdef _WIN32 #include<windows.h> #include<WinSock2.h> #else #include <unistd.h> #include<arpa/inet.h> #include<string.h> #define SOCKET int #define INVALID_SOCKET (SOCKET) (~0) #define SOCKET_ERROR (-1) #endif #include <stdio.h> #include<thread> #include<iostream> using namespace std; enum CMD { CMD_LOGIN, CMD_LOGOUT, CMD_ERROR }; struct DataHeader { short dataLength; short cmd; }; //DataPacket struct Login { char userName[32]; char PassWord[32]; }; struct LoginResult

linux系统中使用socket直接发送ARP数据

折月煮酒 提交于 2020-02-24 14:42:14
这个重点是如这样创建socket: sock_send = socket ( PF_PACKET , SOCK_PACKET , htons ( ETH_P_ARP) ) ; 其后所有收发的数据都是原始的网络数据包。 代码如下:在X86和ARM平台上都测试通过。调用arp_scaner_init之后 ,调用send_arp来发送ARP数据包,thread_read_arp中就会收到对端的反馈,并将其保存。 在此非常感谢其他同仁的分享,使我学会了这个用法。 #include <unistd.h> #include <errno.h> #include <netdb.h> #include <signal.h> #include <sys/socket.h> #include <sys/poll.h> #include <sys/ioctl.h> #include <netinet/if_ether.h> #include <net/if_arp.h> #include <netinet/udp.h> #include <netinet/ip.h> #include <stdio.h> #include <stdarg.h> #include <net/if.h> #include <arpa/inet.h> #include <string.h> #include "adapter

linux系统UDP的socket通信编程2

末鹿安然 提交于 2020-02-24 14:39:27
UDP套接字编程范例: server端代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 /************************************************************************* > File Name: server.c > Author: SongLee ************************************************************************/ #include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<netinet/in.h> #include<arpa/inet.h> #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<netdb.h>

linux 网络编程:客户端与服务器通过TCP协议相互通信 + UDP

感情迁移 提交于 2020-02-24 14:26:28
1、TCP编程的客户端一般步骤: 1、创建一个socket,用函数socket(); 2、设置socket属性,用函数setsockopt();* 可选; 3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选; 4、设置要连接的对方的IP地址和端口等属性; 5、连接服务器,用函数connect(); 6、收发数据,用函数send()和recv(),或者read()和write(); 7、关闭网络连接; 2、TCP编程的服务器端一般步骤: 1、创建一个socket,用函数socket(); 2、设置socket属性,用函数setsockopt(); * 可选; 3、绑定IP地址、端口等信息到socket上,用函数bind(); 4、开启监听,用函数listen(); 5、接收客户端上来的连接,用函数accept(); 6、收发数据,用函数send()和recv(),或者read()和write(); 7、关闭网络连接; 8、关闭监听; 3、客户端源代码(tcpclient.c): #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <stdlib.h> #include <netinet/in.h> #include <arpa

第五十九节,模拟浏览器请求Python结合html基本格式

谁说胖子不能爱 提交于 2020-02-24 13:59:14
模拟浏览器请求Python结合html基本格式 用Python模拟一个客户端,结合打开一个HTML页面 创建客户端 #!/usr/bin/env python # -*- coding:utf8 -*- import socket #导入单线程通讯模块 def handle_request(client): buf = client.recv(1024) client.sendall(bytes("HTTP/1.1 201 OK\r\n\r\n","utf8")) #向客户端发送内容,以字节形式发送 f = open("1.html", "r", encoding="utf-8") #打开HTML文件 f2 = f.read() #读出HTML文件内容 f.close() #关闭打开的文件 client.sendall(bytes(f2,"utf8")) #将读出HTML文件内容向客户端发送内容,以字节形式发送 def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建服务端通讯对象 sock.bind(('localhost',8082)) #在服务端设置服务端ip和端口8 sock.listen(5) #监听IP和端口,设置一个参数,表示最多连接排队数量 while True:

高性能Server---Reactor模型

烈酒焚心 提交于 2020-02-24 13:49:04
无处不在的C/S架构 在这个充斥着云的时代,我们使用的软件可以说99%都是C/S架构的! 你发邮件用的Outlook,Foxmail等 你看视频用的优酷,土豆等 你写文档用的Office365,googleDoc,Evernote等 你浏览网页用的IE,Chrome等(B/S是特殊的C/S) ...... C/S架构的软件带来的一个明显的好处就是:只要有网络,你可以在任何地方干同一件事。 例如:你在家里使用Office365编写了文档。到了公司,只要打开编辑地址就可以看到在家里编写的文档,进行展示或者继续编辑。甚至在手机上进行阅读与编辑。不再需要U盘拷来拷去了。 C/S架构可以抽象为如下模型: C就是Client(客户端),上面的B是Browser(浏览器) S就是Server(服务器): 服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务 C/S架构之所以能够流行的一个主要原因就是网速的提高以及费用的降低,特别是无线网络速度的提高。试想在2G时代,大家最多就是看看文字网页,小说什么的。看图片,那简直就是奢侈!更别说看视频了! 网速的提高,使得越来越多的人使用网络,例如:优酷,微信都是上亿用户量,更别说天猫双11的瞬间访问量了!这就对服务器有很高的要求!能够快速处理海量的用户请求!那服务器如何能快速的处理用户的请求呢? 高性能服务器

18.5 TCP的半关闭

穿精又带淫゛_ 提交于 2020-02-24 12:41:53
18.5 TCP的半关闭 TCP提供了连接的一端的结束它的发送后还能接收另一端数据的能力。 这就是所谓的半关闭 print(socket.SHUT_RDWR) print(socket.SHUT_RD) print(socket.SHUT_WR) 2 0 1 0是READ,1是WRITE,2是READ WRITE 如果应用程序不调用c l o s e而调用s h u t d o w n,且第2个参数值为1,则插口的A P I支持 半关闭。然而,大多数的应用程序通过调用close终止两个方向的连接。 node1:/root/test#cat t2.py # coding = utf-8 # -*- coding:utf-8 -*- import socket ip_port = ('192.168.137.2',8080) BUFSIZE = 1000 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建套接字 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(ip_port)#绑定地址 s.listen(5)#监听链接 print('server listening8080...') while True: #无限等待连接 conn,addr = s