OpenDaylight入门教程
关于OpenDaylight
OpenDaylight is an open platform for network programmability to enable SDN and create a solid foundation for NFV for networks at any size and scale.
对于SDN而言,ODL(OpenDaylight)是一个开源的可编程的平台,简单的说是一个非常有野心开源控制器而不仅仅只是控制器。
opendaylight官网:http://www.opendaylight.org/
环境配置
-
jdk需要1.6以上。
sudo apt-get -y install openjdk-7-jdk
更多安装信息请查看:https://wiki.opendaylight.org/view ...
read more【python爬虫】抓取淘宝模特图片——20分钟爬虫之旅
前言
很多人说学Python最终需要写一个爬虫才能算是学成出山了,而我就是那个留级生,一直没有写过。炎热的夏日,以及看java的抑郁,让我无聊之中萌生了这个想法。于是在百度的帮助下,写完了这个教程。视频教程可以去百度学堂看,我就是在那里看的。
spider
代码详解就不多加介绍,注释相信已经很明确了,请看代码。
import urllib2
import urllib
import sys
class get_mm_pic(object):
def __init__(self,page_num):
self.page_num = page_num
self.mmurl= "http://mm.taobao.com/json/request_top_list.htm?type=0&page="#抓取的链接
def get_pic(self):
i = 1
page_num ...
nox实现nat功能
前言
nat功能是一个非常简单,但却非常重要的功能。保留10,127,192三个网段作为公网地址,通过nat实现地址复用,可以解决现网IPV4地址不够用的尴尬局面。本篇主要讲如何使用nox实现nat的demo.
环境
- nox 安装比较困难,请参看其他教程
- mininet 网络环境搭建神器
控制器
首先在nox/src/coreapps/switch中找到switch.cc。 在class switch中添加成员变量uint32_t src_ip,nat_ip;由于只是一个简单的demo,就不做映射列表了。
handle_packet_in中将if(setup_flows && out_port!=-1)的逻辑修改如下:
if (setup_flows && out_port != -1)
{
auto fm = v1::ofp_flow_mod().match(flow).buffer_id(pi.buffer_id())
.cookie(0).command(v1::ofp_flow_mod ...
[c]线程池的实现
前言
这是C语言培训的最后一题,线程池,今天看了看控制器的代码,看到了线程池的影子,然后发现应该赶紧写完这篇了。哎,文笔不行,写书写成屎了!希望再修改几次能不丢人吧。
本篇主要介绍如何实现一个线程池模型,task是简单的打印,当然如果你想让线程池完成你的功能线程的管理,只需要将task换成你的线程就可以了。
线程池
(摘自百度百科)线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。
组成:
- 线程池管理器(ThreadPoolManager):用于创建并管理线程池
- 工作线程(WorkThread): 线程池中线程
- 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。
- 任务队列:用于存放没有处理的任务。提供一种缓冲机制。
更多可访问:http://baike.baidu.com/link?url=caXqYSEEEDLS28VYuSzSxPbTM3dt_5WwXqF2-TUxR8ptJxggJaJHfTZ3_9Hs4urU#2
threadpool.h
threadpool.h的功能主要是定义工作线程的结构和线程池结构,声明相关的函数,如创建函数。
#ifndef ...
[c]生产者消费者模式实现
前言
本文主要内容是:使用多线程,运行生产者函数和消费者函数,去实现队列(临界区)的读写操作。
其意义在与熟悉多线程的互斥过程。生产者消费者模式是最好,最简单的选择。
数据结构
首先我们要操作的数据结构是队列。那么我首先要构造一个队列:
queue.h
#ifndef _QUEUE_
#define _QUEUE_
typedef struct _QUEUE_
{
int maxsize;
int buffer[10]; //bad design
int end;
int begin;
}queue_t;
void queue_init(queue_t* queue); //队列的初始化。如end,begin,maxsize的设置。
int get_len(queue_t* queue); //获取队列的长度
void ...