socket的epoll模型怎么使用
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章主要介绍"socket的epoll模型怎么使用",在日常操作中,相信很多人在socket的epoll模型怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"s
千家信息网最后更新 2025年12月02日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安全错误
数据库的锁怎样保障安全
焦点科技软件开发怎么样
剑网三 连接服务器超时
横机换了服务器起针不正常
省监狱警察网络安全管理是省直吗
互联网是第几次科技革命
东方国信数据库工程师
网络安全防护建设指南
部队网络安全利与弊的总结
威海优科软件开发有限公司
rust怎么创造自己的服务器
航天模拟器如何换服务器
谈谈你对网络安全认知的理解
统计单词数测试数据库
怎么用代码创建数据库
网络技术与应用读书报告
加强网络安全亮点工作
查询数据库中的所有库
网络软件开发支出
浪潮软件开发中心
吕梁网络技术团队
电子政务软件开发与应用
花都软件开发哪家不错
网络安全与未来发展趋势
衢州学软件开发需要学什么
比亚迪研发软件开发设备
中山服务器回收
餐饮管理系统服务器设置
熊居网络技术有限公司
网络安全提供服务者
ef6支持哪些数据库