为了账号安全,请及时绑定邮箱和手机立即绑定

从控制器 1 向控制器 2 发送消息

从控制器 1 向控制器 2 发送消息

暮色呼如 2021-09-15 16:37:36
我在 mininet 中有一个拓扑,它由 2 个泛光灯控制器(c1 和 c2)、一个连接到 c1 的交换机(s1)和连接到这个交换机的 2 个主机(h1 和 h2)组成。我正在编写一个程序,当 c1 收到来自 s1 的 ICMP 数据包时,它会向 c2 发送一个 Hello 消息。我为此目的使用本教程,其中说:可以使用发送功能将消息从一个控制器发送到另一个控制器,并且消息必须用“m”“m”标记。您将此消息发送到特定控制器,因此 TO 地址由 IP:port 两部分组成。IP是另一个控制器的机器IP地址(HAServer正在监听所有的ip),端口是那台机器上HAServer对应的监听端口。默认情况下,控制器 1 上的 HAServer 正在侦听 4242、控制器 2 上的 4243、控制器 3 上的 4244……等等。recv() 函数类似于 send 函数,您将提供 FROM 地址以从特定控制器收听。发件人地址也由两部分组成,IP:port。IP是另一个控制器的机器IP地址(HAServer正在监听所有的ip),端口是那台机器上HAServer对应的监听端口。理想情况下,该函数在调用相应的 send() 函数后调用,否则可能还没有建立连接,只会返回错误。有什么问题?recv() 函数似乎有问题。这是内置的 send() 和接收函数的代码。
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

此代码的问题在于,当交换机向控制器发送新数据包时,会调用 receive() 方法或(假设)处于活动状态。

这里当第一个控制器收到 ICMP 数据包时,它通过这段代码向第二个控制器发送一个 hello 消息:

 hacontroller.send("127.0.0.1:4243", "mHelloWorld");

但是由于第二个控制器没有收到来自交换机的任何消息,它目前没有实现这段代码(receive()),也没有看到:

hacontroller.recv("127.0.0.1:4242");

据我所知,这就是为什么clientSock从未初始化的原因,所以我收到了这个错误。


查看完整回答
反对 回复 2021-09-15
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

NetworkNode.recv() 方法存在多个问题:

  • 您应该在取消引用对象之前检查 null。

  • 您不应在 String 对象上调用 toString。这是多余的。

  • 在捕获和忽略异常时应该小心。在这种情况下,您不需要捕获异常,因为 NioClient.recv() 不会抛出任何异常。该方法应该抑制异常的地方是另一个问题。

  • 避免使用成员变量而不是局部变量。需要在每个方法中声明局部变量。这是代码中许多地方的常见问题。

接收方法可以改写如下:

NioClient receivingSock = socketDict.get(receivingPort);

if (receivingSock == null) {

    logger.debug("[NetworkNode] No receivingSock on receivingport: " + receivingPort);

    return "";

}

else {

    response = receivingSock.recv();

    if (response != null) {

        response.trim();

    }

    return response;

}


查看完整回答
反对 回复 2021-09-15
?
弑天下

TA贡献1818条经验 获得超8个赞

从您发布的日志和您提供的 Github 存储库来看,似乎clientSocknull. 第NullPointerException529 行抛出第一个:

response = clientSock.recv();

和被抓住。

但是在 catch 块中,clientSockis still null,所以当你这样做时:

if (clientSock.getSocketChannel() != null) {

一秒钟NullPointerException被抛出(我们在日志中看到的那个)隐藏了之前抛出的那个。

你能调试你的代码来验证是否socketDict包含receivingPort吗?如果没有,请务必正确初始化。

此外,捕捉通常不是一个好主意,Exception因为它太大了。如果可以,我建议您捕获更精确的异常(或异常)。如果你这样做了,你会更容易看到这个错误的来源。


查看完整回答
反对 回复 2021-09-15
  • 3 回答
  • 0 关注
  • 227 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信