Errno 111连接被拒绝-Python Mininet API主机客户端/服务器没有连接?

Errno 111连接被拒绝-Python Mininet API主机客户端/服务器没有连接?,python,subprocess,mininet,errno,Python,Subprocess,Mininet,Errno,我是Mininet的新手,我正在试图找到一种方法,使用python中的脚本来执行一些使用Mininet的测试。更确切地说,我希望构建拓扑并从一个主机向另一个主机发送一些xmlrpc请求。我最近发现了如何使用mininetapi。问题是我无法从客户端连接到服务器以获得响应,我已使用客户端主机发出的telnet 10.0.0.x 12345命令进行了测试,并得到了连接拒绝。代码如下: 拓扑测试.py server.py 向主机执行服务器/客户端脚本 如果我使用不同的xterm窗口运行mininetc

我是Mininet的新手,我正在试图找到一种方法,使用python中的脚本来执行一些使用Mininet的测试。更确切地说,我希望构建拓扑并从一个主机向另一个主机发送一些
xmlrpc
请求。我最近发现了如何使用
mininetapi
。问题是我无法从客户端连接到服务器以获得响应,我已使用客户端主机发出的
telnet 10.0.0.x 12345
命令进行了测试,并得到了
连接拒绝。代码如下:

拓扑测试.py

server.py

向主机执行服务器/客户端脚本


如果我使用不同的
xterm
窗口运行
mininetcli
中的所有内容,但当使用
mininetapi
时,没有任何东西正常工作,那么我也尝试了一些不同的客户端/服务器脚本,有时它工作正常。实际上,它只在第一次运行时起作用。所以我在想,也许有一种方法可以使用
子流程
打开
xterm
窗口,然后在
xterm
内部运行一个命令,其中包含一些
管道子流程
。我希望所有内容都通过python脚本运行,而不是手动运行。有人能帮我吗?

为什么不使用mininet的python接口来实现这一点?从您的问题来看,您似乎希望获得默认情况下
sudo mn
创建的节点的名称

在这种情况下,为什么不在python中添加以下内容:

from mininet.topo import SingleSwitchTopo
from mininet.net import Mininet
from mininet.node import CPULimitedHost
from mininet.link import TCLink

if __name__ == '__main__':
    topo = SingleSwitchTopo()
    net = Mininet(topo=topo, host=CPULimitedHost, link=TCLink)

    net.start()

    nodes = net.items()
    node_names, _ = zip(*nodes)

    print(node_names)
    net.stop()

SingleSwitchTopo是mn默认使用的一个(两台主机连接到一个交换机)
net.items()
提供节点名称和ID的元组,请参见。也许我误解了你的问题,但似乎在有API的情况下试图通过子流程访问它,这会使原本简单的任务过于复杂。

最后,我找到了导致客户端尝试连接到服务器时连接被拒绝的原因。从好的方面来说,这是一件“疯狂”的事情;)

我刚刚意识到,当客户端发出请求时,服务器并没有准备好并运行,这仅仅是因为两个执行命令同时启动。因此,我在调用/执行cmd行之间添加了一个延迟,如下所示:

host1.sendCmd("python3 server.py")
sleep(5)
host2.cmdPrint("python3 client.py")
额外意见:


重要的一点是,当运行
net.stop()
时,
sendCmd()
会给出一个
断言wait
错误。文档中说在
sendCmd()
之后和
net.stop()
之前使用
host1.monitor()
,但它不起作用。因此,我将
sendCmd()
替换为
popen()
,然后使用
terminate()
,现在一切都好了

实际上,我想运行
host1xterm
并使用
xmlrpc
运行一些测试/基准测试,我想从外部环境使用rpc客户机/服务器脚本中的主机IP。nodes命令只是我使用的一个例子。我的目标是自动化这个过程,因此我不需要一步一步地运行它,我需要一个脚本来构建mininet拓扑,然后运行
h1 xterm
,然后在mininet之外执行python脚本。您可以使用上面的方法来实现这一点。将不需要Xterm,因为执行
host.cmd(“”
将具有相同的效果。您还可以捕获它的输出。看一看API我已经详细地更新了这个问题,API出了问题—什么都不起作用—但使用CLI—一切正常—这就是为什么我考虑使用subprocess xterm方法的原因
import xmlrpc.client as cl



addr = "10.0.0.2"
port = 8100
# rhost = xmlrpclib.Server("http://" + addr + ":" + str(port))
rhost = cl.Server("http://" + addr + ":" + str(port))
# msg = rhost.str_get()
# print(msg)
# inp = ""
print("Guess a number between 1 and 100")
print()
while 1:
    # msg = rhost.str_get()
    # print(msg)

    inp = input(">")
    msg = rhost.guess_number(int(inp))

    print(msg)

if "found" in msg:
    sys.exit(0)
host1.sendCmd("python3 server.py")
host2.cmdPrint("python3 client.py")
from mininet.topo import SingleSwitchTopo
from mininet.net import Mininet
from mininet.node import CPULimitedHost
from mininet.link import TCLink

if __name__ == '__main__':
    topo = SingleSwitchTopo()
    net = Mininet(topo=topo, host=CPULimitedHost, link=TCLink)

    net.start()

    nodes = net.items()
    node_names, _ = zip(*nodes)

    print(node_names)
    net.stop()
host1.sendCmd("python3 server.py")
sleep(5)
host2.cmdPrint("python3 client.py")