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

我在 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() 和接收函数的代码。



暮色呼如
浏览 228回答 3
3回答

海绵宝宝撒

此代码的问题在于,当交换机向控制器发送新数据包时,会调用 receive() 方法或(假设)处于活动状态。这里当第一个控制器收到 ICMP 数据包时,它通过这段代码向第二个控制器发送一个 hello 消息: hacontroller.send("127.0.0.1:4243", "mHelloWorld");但是由于第二个控制器没有收到来自交换机的任何消息,它目前没有实现这段代码(receive()),也没有看到:hacontroller.recv("127.0.0.1:4242");据我所知,这就是为什么clientSock从未初始化的原因,所以我收到了这个错误。

慕妹3146593

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;}

弑天下

从您发布的日志和您提供的 Github 存储库来看,似乎clientSock是null. 第NullPointerException529 行抛出第一个:response = clientSock.recv();和被抓住。但是在 catch 块中,clientSockis still null,所以当你这样做时:if (clientSock.getSocketChannel() != null) {一秒钟NullPointerException被抛出(我们在日志中看到的那个)隐藏了之前抛出的那个。你能调试你的代码来验证是否socketDict包含receivingPort吗?如果没有,请务必正确初始化。此外,捕捉通常不是一个好主意,Exception因为它太大了。如果可以,我建议您捕获更精确的异常(或异常)。如果你这样做了,你会更容易看到这个错误的来源。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java