4-1 综合应用延申:RYU北向接口的应用实现案例

ryu控制器在SDN三层架构中是处于中间层,(如图1)
在这里插入图片描述
图1 SDN三层架构

如何实现与应用层的通信,如图1所示,实现RYU控制器与应用层(如开发应用web界面时数据可视化平台)数据通信就需要利用SDN的北向接口。北向接口实现的功能就时某个应用软件实体与控制器中的数据的通信。本文,我们将用socket编程就能轻易实现应用层与RYU控制器之间的数据通信以及简单展示

实现拓扑逻辑原理
三、实现代码
服务端(在ubuntu上)
server端主要用于接收控制器的连接,并接收由控制器发送过来的信息,这里主要是dpid和port信息,也就是当主机h1、h2进行通信时,控制器收集通信时经过的端口和交换机id
具体代码:

import socket
import redef main():server1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCPhost = '10.0.0.2' #ubuntu地址,开启服务功能,用来给ryu主动连接提交数据port = 12345 #开放端口,自主定义一般大于1024server1.bind((host, port))server1.listen(5)while True:conn, addr = server1.accept()print("----------------------------")print("Success connect from ", addr)try:count = 0while True:data = conn.recv(1024)data = re.split(r'[, :]', data.decode('utf-8'))  # 对收到的信息进行解析,包括dpid和portcount += 1print("from {0}:dpid={1}, in_port={2}".format(addr, data[0], data[1]))conn.close()except Exception as error:  # 当控制器和应用层断开连接后,输出统计信息print('共接收{}条信息。'.format(count-1))print(error)exit()if __name__ == '__main__':main()

mininet拓扑代码

ryu

from ryu.base import app_manager
from ryu.controller.handler import set_ev_cls
from ryu.controller.handler import MAIN_DISPATCHER, CONFIG_DISPATCHER
from ryu.controller import ofp_event
from ryu.ofproto import ofproto_v1_3
import socketclass L2Switch(app_manager.RyuApp):OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.dp_id = '0'self.in_port = '0'self.client1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)dst_host = '10.0.0.2'dst_port = 12345try:self.client1.connect((dst_host, dst_port))except Exception as error:print('Connect error:', error)def doflow(self, datapath, command, priority, match, actions):ofp = datapath.ofprotoofp_parser = datapath.ofproto_parserinst = [ofp_parser.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS, actions)]req = ofp_parser.OFPFlowMod(datapath=datapath, command=command,priority=priority, match=match, instructions=inst)datapath.send_msg(req)@set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)def switch_features_handler(self, ev):msg = ev.msgdatapath = msg.datapathofp = datapath.ofprotoofp_parser = datapath.ofproto_parser# add table-misscommand = ofp.OFPFC_ADDmatch = ofp_parser.OFPMatch()actions = [ofp_parser.OFPActionOutput(ofp.OFPP_CONTROLLER, ofp.OFPCML_NO_BUFFER)]self.doflow(datapath, command, 0, match, actions)@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)def packet_in_handler(self, ev):msg = ev.msgdp = msg.datapathofp = dp.ofprotoofp_parser = dp.ofproto_parserself.dp_id = dp.idstart = str(msg).index('oxm_fields') + 11end = str(msg).index('),reason')inport_str = str(msg)[start:end]instr = eval(inport_str)self.in_port = instr['in_port']actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]data = Noneif msg.buffer_id == ofp.OFP_NO_BUFFER:data = msg.dataprint('id:{0}     in_port:{1}'.format(self.dp_id, self.in_port))info = str(self.dp_id) + ',' + str(self.in_port)self.client1.send(info.encode())out = ofp_parser.OFPPacketOut(datapath=dp, buffer_id=msg.buffer_id, in_port=self.in_port,actions=actions, data=data)dp.send_msg(out)

四、实验测试
注意启动步骤:(如图中编号)
在这里插入图片描述

扩展,如何把服务器上收集的数据存入一个文件

将数据存储为Excel文件(.xlsx),您可以使用第三方库如openpyxl来实现。以下是将数据存储到Excel文件的修改版本:


import openpyxl
import socket
import redef main():server1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCPhost = '10.0.0.2'  # ubuntu地址,开启服务功能,用来给ryu主动连接提交数据port = 12345  # 开放端口,自主定义一般大于1024server1.bind((host, port))server1.listen(5)# 创建Excel文件并写入表头workbook = openpyxl.Workbook()sheet = workbook.activesheet.append(['Address', 'DPID', 'In_Port'])  # 表头while True:conn, addr = server1.accept()print("----------------------------")print("Success connect from ", addr)try:count = 0while True:data = conn.recv(1024)data = re.split(r'[, :]', data.decode('utf-8'))  # 对收到的信息进行解析,包括dpid和portcount += 1print("from {0}: dpid={1}, in_port={2}".format(addr, data[0], data[1]))# 将数据写入Excel文件sheet.append([addr, data[0], data[1]])except Exception as error:  # 当控制器和应用层断开连接后,输出统计信息print('共接收{}条信息。'.format(count - 1))print(error)workbook.save('data.xlsx')  # 保存Excel文件exit()if __name__ == '__main__':main()

在上述代码中,我们使用了openpyxl库来创建并写入Excel文件。在循环中,每次接收到数据时,将数据写入Excel文件的工作表中。最后,使用workbook.save方法保存Excel文件

方法2
可以使用Python的CSV模块来实现。以下是将数据存储到CSV文件的修改版本:

import csv
import socket
import redef main():server1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCPhost = '10.0.0.2'  # ubuntu地址,开启服务功能,用来给ryu主动连接提交数据port = 12345  # 开放端口,自主定义一般大于1024server1.bind((host, port))server1.listen(5)# 创建CSV文件并写入表头with open('data.csv', 'w', newline='') as csvfile:writer = csv.writer(csvfile)writer.writerow(['Address', 'DPID', 'In_Port'])  # 表头while True:conn, addr = server1.accept()print("----------------------------")print("Success connect from ", addr)try:count = 0while True:data = conn.recv(1024)data = re.split(r'[, :]', data.decode('utf-8'))  # 对收到的信息进行解析,包括dpid和portcount += 1print("from {0}: dpid={1}, in_port={2}".format(addr, data[0], data[1]))# 将数据写入CSV文件writer.writerow([addr, data[0], data[1]])except Exception as error:  # 当控制器和应用层断开连接后,输出统计信息print('共接收{}条信息。'.format(count - 1))print(error)exit()
if __name__ == '__main__':main()

在上述代码中,我们使用了csv模块来创建并写入CSV文件。在循环中,每次接收到数据时,将数据写入CSV文件中。
在这里插入图片描述
在服务端所在文件的通目录下(默认情况)可以检测到有有新生成的文件data .csv用记事本打开可以看到相关的数据 在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/703756.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssm基于BS的项目监管系统+jsp论文

系统简介 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上…

Java | 增强for底层工作机制

✍🏼作者:周棋洛,bilidown开发者。 ♉星座:金牛座 🏠主页:我的个人网站 🌐关键:Java 增强for 工作机制 目录 引言增强for循环语法增强for工作机制探究简单总结1.对于实现了Iterable接…

【Git教程】(十九)合并小型项目 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 合并小型项目 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现 在项目的初始阶段,往往需要针对重要的设计决策和技术实现原型实验。当原型评估结束后,需要将那些成功的原型合并起来称为整个项目的初始版本。 在这样的情景中,各个原…

Hadoop Java API操作 及读取序列化文件(04-05-06)

针对于04-05-06班级整合。 1.创建java项目 2.修改pom.xml文件 添加依赖 <dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.1.4</version></dependenc…

RocketMQ:新增consumer消费组group从最新消息开始消费skip last offset message

场景 想创建一个新的consumer去消费一个已经再使用的topic时&#xff0c;默认情况下会从topic中的第一条消息开始消费&#xff0c;大多数情况是需要从最新的消息开始。然后再使用CONSUME_FROM_LAST_OFFSET设置时并不会对新的consumer生效&#xff0c;它只是在停用consumer重新启…

【MySQL】表的增删改查 | CRUD | 新增 | 查询 | 修改 | 删除 | 数据库约束

文章目录 表的增删改查一、CRUD1.新增&#xff08;Create&#xff09;1.插入多行2.指定列多行插入3.插入datetime类型4.插入当前时间5.插入查询的结果 2.查询&#xff08;Retrieve&#xff09;1.全列查询 *2.指定列查询3.查询字段为表达式4.指定别名 as5.去重 distinct6.排序 o…

算法分析与设计复习__递归方程与分治

总结自&#xff1a;【算法设计与分析】期末考试突击课_哔哩哔哩_bilibili 1.递归&#xff0c;递归方程 1.1递归条件: 1.一个问题的解可以分解为几个子问题的解&#xff1b; 2.这个问题与分解之后的子问题&#xff0c;除了数据规模不同&#xff0c;求解思路完全一样; 3.存在…

Python从0到100(二十四):正则表达式的应用

正则表达式是一种用于字符串搜索和操作的强大工具&#xff0c;它允许你使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在编程中&#xff0c;正则表达式被广泛应用于文本处理&#xff0c;如模式搜索、文本替换、字符串验证等。 1.正则表达式基础 正则表达式由一…

Edge(微软)——一款充满创新精神的浏览器

随着科技的不断进步&#xff0c;互联网浏览器已经成为我们日常生活中不可或缺的工具。在这个领域&#xff0c;微软Edge作为一款新型的浏览器&#xff0c;凭借其独特的功能和优秀的性能&#xff0c;逐渐在市场上占据了一席之地。本文将深入探索微软Edge的特点、优势以及它如何改…

【MySQL 数据宝典】【事务锁】- 002 事务控制的演进

一、事务处理思路 1.1 排队 排队处理是事务管理最简单的方法&#xff0c;就是完全顺序执行所有事务的数据库操作&#xff0c;不需要加锁&#xff0c;简单的说就是全局排队。序列化执行所有的事务单元&#xff0c;数据库某个时刻只处理一个事务操作&#xff0c;特点是强一致性…

测缝计测量的是实际缝宽吗?

在土木工程中&#xff0c;测缝计作为一种重要的监测工具&#xff0c;广泛应用于桥梁、隧道、大坝等大型结构中&#xff0c;用以测量和监控结构接缝或裂缝的实际宽度变化。然而&#xff0c;有些人可能会产生疑问&#xff1a;测缝计测量的是实际缝宽吗?本文将对这一问题进行深入…

六西格玛管理培训对企业有哪些实际帮助?

当下&#xff0c;企业要想脱颖而出&#xff0c;不仅要有创新思维和敏锐的市场洞察力&#xff0c;更要有高效的管理体系和严谨的质量控制手段。而六西格玛管理培训正是这样一项能够帮助企业实现提质增效、提升竞争力的关键举措。那么&#xff0c;六西格玛管理培训对企业究竟有哪…