socket的epoll模型怎么使用
发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,这篇文章主要介绍"socket的epoll模型怎么使用",在日常操作中,相信很多人在socket的epoll模型怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"s
千家信息网最后更新 2024年11月11日socket的epoll模型怎么使用
这篇文章主要介绍"socket的epoll模型怎么使用",在日常操作中,相信很多人在socket的epoll模型怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"socket的epoll模型怎么使用"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
select模型虽好,却有一个缺陷,只能对1024个文件描述符进行监视,虽然可以通过重新编译内核获得更大的监视数量,但这样做还不如将目光投向更高级的epoll模型。select模型中,每一次都需要遍历所有处于监视中的文件描述符,判断他们哪个可写,哪个可读,这样一来,你监视的越多,速度越慢,而在epoll模型中,所有添加到epoll中的事件都会网卡驱动程序建立起回调关系,简言之,如果有一个连接可写,那么这个可写的事件就会报告给你,而你不需要挨个询问他们哪个连接可写,哪个连接可读。
下面的示例,所实现的功能,和之前的示例一样,但更加高效:
#coding=utf-8
import socket
import select
import sys
from MsgContainer import MsgContainer
def start_server(port):
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversocket.bind(('0.0.0.0', port))
#accept队列大小为100
serversocket.listen(100)
serversocket.setblocking(0)
epoll = select.epoll()
#注册一个in事件,等待有数据可读
epoll.register(serversocket.fileno(), select.EPOLLIN)
try:
#保存连接,请求,和响应信息
connections = {};
message_queues = {} #存储可发送的数据
while True:
#最多等待1秒钟时间,有事件返回事件列表
events = epoll.poll(1)
for fileno, event in events:
#事件的句柄是server
if fileno == serversocket.fileno():
connection, address = serversocket.accept()
#设置为非阻塞的
connection.setblocking(0)
#新建的连接也注册读事件
epoll.register(connection.fileno(), select.EPOLLIN)
connections[connection.fileno()] = connection
message_queues[connection.fileno()] = MsgContainer()
#不是server,那就是建立的连接,现在连接可读
elif event & select.EPOLLIN:
data = connections[fileno].recv(1024)
if data :
epoll.modify(fileno, select.EPOLLOUT)
message_queues[fileno].add_data(data)
else:
epoll.modify(fileno, 0)
connections[fileno].shutdown(socket.SHUT_RDWR)
del connections[fileno]
del message_queues[fileno]
elif event & select.EPOLLOUT:
#可写的事件被触发
if not fileno in message_queues or not fileno in connections:
continue
clientsocket = connections[fileno]
mc = message_queues[fileno]
msgs = mc.get_all_msg()
for msg in msgs:
msg = mc.pack_msg(msg)
clientsocket.send(msg)
mc.clear_msg()
#需要回写的数据已经写完了,再次注册读事件
epoll.modify(fileno, select.EPOLLIN)
elif event & select.EPOLLHUP:
#被挂起了,注销句柄,关闭连接,这时候,是客户端主动断开了连接
epoll.unregister(fileno)
if fileno in connections:
connections[fileno].close()
del connections[fileno]
if fileno in message_queues:
del message_queues[fileno]
finally:
epoll.unregister(serversocket.fileno())
epoll.close()
serversocket.close()
if __name__ == '__main__':
if len(sys.argv) == 2:
port = int(sys.argv[1])
start_server(port)
else:
print u'请输入端口号'
下面看client端的代码:
#coding=utf-8
import sys
import time
import datetime
import socket
import cPickle
import threading
from MsgContainer import MsgContainer
def start_client(addr,port,msgCount):
mc = MsgContainer()
PLC_ADDR = addr
PLC_PORT = port
time_lst = []
s = socket.socket()
s.connect((PLC_ADDR, PLC_PORT))
seconds1 = int(time.time())
i = 0
while True:
seconds = int(time.time())
microseconds = datetime.datetime.now().microsecond
data = {'sec':seconds,'micsec':microseconds}
data = cPickle.dumps(data)
data = mc.pack_msg(data)
s.send(data)
recv_data = s.recv(1024)
mc.add_data(recv_data)
msgs = mc.get_all_msg()
seconds = int(time.time())
microseconds = datetime.datetime.now().microsecond
for msg in msgs:
msgdict = cPickle.loads(msg)
time_lst.append(((seconds-msgdict['sec'])*1000000 + microseconds-msgdict['micsec'])/1000.0)
mc.clear_msg()
i += 1
if i>msgCount:
print sum(time_lst)/float(len(time_lst))
break
s.close()
if __name__ == '__main__':
if len(sys.argv) == 4:
addr = sys.argv[1]
port = int(sys.argv[2])
msgCount = int(sys.argv[3])
t_lst = []
for i in range(100):
t = threading.Thread(target=start_client,args=(addr,port,msgCount))
t_lst.append(t)
for t in t_lst:
t.start()
for t in t_lst:
t.join()
#start_client('123.56.190.151',8091,100
在客户端,每次起100个线程尝试建立连接,如果server端的accept队列大小设置的小,例如设置为10,就会出现个别连接无法建立的情况,所以我这里设置为100。
到此,关于"socket的epoll模型怎么使用"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
事件
模型
学习
监视
数据
句柄
大小
客户
客户端
文件
更多
示例
端的
队列
帮助
高级
主动
接下来
简言之
这样一来
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
邯郸市卫计委网络安全
计算机网络技术可以就业的公司
软件开发有什么消耗品
软件开发招标控制价编制流程
ftp服务器都有什么
java处理菜单数据库
大学数据库及其应用学什么
个人登陆境外服务器能查到吗
基础软件开发是做什么
数据库技术应用教程选择题
我的世界服务器续费
软件开发技术去哪里学
计算机网络技术试题文本
网页下载服务器出错
下列属于期刊数据库简称的是
安徽软件开发者公司
软件开发的项目生命期模型
服务器名字变更后svn怎么修改
大学生规划计算机网络技术
五一假期网络安全提醒
软件开发验收资料
阿里云数据库ip地址
网络安全是两个
基层党员干部网络安全
现在软件开发学什么好
红蜻蜓截屏软件开发商
服务器管理器不显示
服务器名字变更后svn怎么修改
mRNA之间的关系用什么数据库
无锡软件开发怎么收费