如何使用Mininet Python API将UDP数据包从一个主机发送到另一个主机?

时间:2016-03-08 14:02:00

标签: python sockets mininet

首先,在SingleSwitchTopo.py中,我建立了一个包含2个主机和1个交换机的网络。 h1和h2之间的Ping和iperf都可以。然后我让h1运行server.py,它作为服务器。 h2运行client.py,它将UDP数据包发送到h1,然后h1将接收数据并写入文件。但为什么不能从h2获取数据呢?如何正确地做到这一点?

SingleSwitchTopo.py

from mininet.topo import Topo
from mininet.net import Mininet
from mininet.util import dumpNodeConnections
from mininet.log import setLogLevel
from mininet.node import CPULimitedHost
from mininet.link import TCLink

class SingleSwitchTopo(Topo):
    "Single switch connected to n hosts."
    def build(self, n=2):
        switch = self.addSwitch('s1')
        for h in range(n):    
            host = self.addHost('h%s' % (h + 1), cpu=.6/n)     
            self.addLink(host, switch, bw=500, delay='10ms', loss=10, max_queue_size=100, use_htb=True)

def simpleTest():
    "Create and test a simple network"
    topo = SingleSwitchTopo(n=2)
    net = Mininet(topo=topo, host=CPULimitedHost, link=TCLink)
    net.start()
    h1 = net.get('h1')
    h2 = net.get('h2')
    h1.cmd('kill %python')
    h2.cmd('kill %python')
    h1.cmd('python server.py &')
    h2.cmd('python client.py %s ' % h1.IP())
    net.stop()

if __name__ == '__main__':
    setLogLevel('info')
    simpleTest()

server.py

import socket
address = ('127.0.0.1', 9999)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(address)
f = open('/home/knshen/a.txt', 'w+')

while True:
    data, addr = s.recvfrom(1024)
    print 'data', data
    f.write(data)
    f.flush()
f.close()
s.close()

client.py

import socket
import sys
from time import sleep

address = (sys.argv[1], 9999)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
i = 1
while True:
    s.sendto('hi : %d\n' % i, address)
    i += 1
    sleep(3)

s.close()

2 个答案:

答案 0 :(得分:1)

您可以使用iperf命令设置客户端服务器。

使用

启动服务器(h1)和客户端(h2)的xterms
xterm h1 h2

然后在h1中运行

iperf -s -u -i 1 

启动一个发送间隔为1秒的数据包的udp服务器

然后在h2中运行

iperf -c 10.0.0.1 -u -b 1m -n 1000 

创建一个udp客户端,连接到地址10.0.0.1的h1,带宽= 1M,要传输的字节数= 1000

这是显示各种iperf参数/功能的链接 http://openmaniak.com/iperf.php

答案 1 :(得分:1)

我知道这是一个迟到的答案,here这是一个简单而有效的解决方案。

非常感谢Brian O' Connor的代码。