gpt4 book ai didi

java - 从 controller1 发送消息到 controller2

转载 作者:搜寻专家 更新时间:2023-10-30 23:01:22 26 4
gpt4 key购买 nike

我在 mininet 中有一个拓扑结构,它由 2 个泛光灯 Controller (c1 和 c2)、一个连接到 c1 的交换机 (s1) 和连接到该交换机的 2 个主机(h1 和 h2)组成。我正在编写一个程序,当 c1 从 s1 收到一个 ICMP 数据包时,它会向 c2 发送一条 Hello 消息。

我正在使用这个 tutorial为此,它说:

Messages can be sent from one controller to another using the send function, and the messages have to be tagged with an ‘m’ “m”. You will send this message TO a particular controller so the TO address comprises of two parts IP:port. The IP is the machine IP address of the other controller (HAServer is listening on all ips), and the port is the corresponding listening port of HAServer on that machine.

By default, HAServer on controller 1 is listening on 4242, on controller 2 on 4243, on controller 3 on 4244 … and so on.

recv() function is similar to the send function and you will be giving the FROM address to hear back FROM a particular controller. The from address also comprises of two parts, IP:port. The IP is the machine IP address of the other controller (HAServer is listening on all ips), and the port is the corresponding listening port of HAServer on that machine.

Ideally, this function is called after calling a corresponding send() function, otherwise, a connection might not have been established, and it will just return an error.

这是我的模块的完整代码:

package net.floodlightcontroller.mactracker;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentSkipListSet;

import net.floodlightcontroller.core.FloodlightContext;
import net.floodlightcontroller.core.IFloodlightProviderService;
import net.floodlightcontroller.core.IOFMessageListener;
import net.floodlightcontroller.core.IOFSwitch;
import net.floodlightcontroller.core.module.FloodlightModuleContext;
import net.floodlightcontroller.core.module.FloodlightModuleException;
import net.floodlightcontroller.core.module.IFloodlightModule;
import net.floodlightcontroller.core.module.IFloodlightService;
import net.floodlightcontroller.hasupport.IHAControllerService;
import net.floodlightcontroller.hasupport.NetworkNode;
import net.floodlightcontroller.packet.Ethernet;
import net.floodlightcontroller.packet.ICMP;
import net.floodlightcontroller.packet.IPv4;

import org.projectfloodlight.openflow.protocol.OFMessage;
import org.projectfloodlight.openflow.protocol.OFType;
import org.projectfloodlight.openflow.types.EthType;
import org.projectfloodlight.openflow.types.IpProtocol;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Mactracker implements IFloodlightModule, IOFMessageListener {

protected static IHAControllerService hacontroller;
protected static Logger logger = LoggerFactory.getLogger(Mactracker.class);
protected IFloodlightProviderService floodlightProvider;
protected Set<Long> macAddresses;
private static NetworkNode network;

@Override
public Collection<Class<? extends IFloodlightService>> getModuleServices() {
// TODO Auto-generated method stub
return null;
}

@Override
public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
// TODO Auto-generated method stubs
return null;
}

@Override
public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
// TODO Auto-generated method stub
Collection<Class<? extends IFloodlightService>> l =
new ArrayList<Class<? extends IFloodlightService>>();
l.add(IFloodlightProviderService.class);
l.add(IHAControllerService.class);
return l;
}

@Override
public void init(FloodlightModuleContext context) throws FloodlightModuleException {
// TODO Auto-generated method stub
hacontroller = context.getServiceImpl(IHAControllerService.class);
floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
macAddresses = new ConcurrentSkipListSet<Long>();
}

@Override
public void startUp(FloodlightModuleContext context) throws FloodlightModuleException {
// TODO Auto-generated method stub
floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
// After more than 51% of configured controllers are started, this function will return,
// or when a timeout of 60s is reached, whichever is earlier.
hacontroller.pollForLeader();
}

@Override
public String getName() {
// TODO Auto-generated method stub
return Mactracker.class.getSimpleName();
}

@Override
public boolean isCallbackOrderingPrereq(OFType type, String name) {
// TODO Auto-generated method stub
return false;
}

@Override
public boolean isCallbackOrderingPostreq(OFType type, String name) {
// TODO Auto-generated method stub
return false;
}

@Override
public net.floodlightcontroller.core.IListener.Command receive(IOFSwitch sw, OFMessage msg,
FloodlightContext cntx) {
// TODO Auto-generated method stub
Ethernet eth =
IFloodlightProviderService.bcStore.get(cntx,
IFloodlightProviderService.CONTEXT_PI_PAYLOAD);
if (eth.getEtherType() == EthType.IPv4) {
IPv4 ipv4 = (IPv4) eth.getPayload();

if ( ipv4.getProtocol().equals(IpProtocol.ICMP)){
logger.warn ("ICMP Packet Received!:-)");
ICMP icmp = (ICMP) ipv4.getPayload();
logger.warn ("icmp.getIcmpType: "+icmp.getIcmpType());

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

Long sourceMACHash = eth.getSourceMACAddress().getLong();
if (!macAddresses.contains(sourceMACHash)) {
macAddresses.add(sourceMACHash);
logger.info("MAC Address: {} seen on switch: {}",
eth.getSourceMACAddress().toString(),
sw.getId().toString());
}
return Command.CONTINUE;
}
}

但是运行这段代码后,当c1收到一个ICMP数据包时,我遇到了多个错误:

2018-09-13 00:39:56.716 WARN  [n.f.m.Mactracker] ICMP Packet Received!:-)
2018-09-13 00:39:56.716 WARN [n.f.m.Mactracker] icmp.getIcmpType: 0
2018-09-13 00:39:56.716 INFO [n.f.h.NetworkNode] [NetworkNode] Sending: mHelloWorld sent through port: 127.0.0.1:4243
2018-09-13 00:39:56.720 WARN [i.n.c.DefaultChannelPipeline] An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
java.lang.NullPointerException: null
at net.floodlightcontroller.hasupport.NetworkNode.recv(NetworkNode.java:535) ~[floodlight.jar:1.2-SNAPSHOT]
at net.floodlightcontroller.hasupport.HAController.recv(HAController.java:190) ~[floodlight.jar:1.2-SNAPSHOT]
at net.floodlightcontroller.mactracker.Mactracker.receive(Mactracker.java:121) ~[floodlight.jar:1.2-SNAPSHOT]
at net.floodlightcontroller.core.internal.Controller.handleMessage(Controller.java:411) ~[floodlight.jar:1.2-SNAPSHOT]
at net.floodlightcontroller.core.internal.OFSwitchManager.handleMessage(OFSwitchManager.java:487) ~[floodlight.jar:1.2-SNAPSHOT]
at net.floodlightcontroller.core.internal.OFSwitchHandshakeHandler.dispatchMessage(OFSwitchHandshakeHandler.java:1752) ~[floodlight.jar:1.2-SNAPSHOT]
at net.floodlightcontroller.core.internal.OFSwitchHandshakeHandler.access$24(OFSwitchHandshakeHandler.java:1751) ~[floodlight.jar:1.2-SNAPSHOT]
at net.floodlightcontroller.core.internal.OFSwitchHandshakeHandler$MasterState.processOFPacketIn(OFSwitchHandshakeHandler.java:1488) ~[floodlight.jar:1.2-SNAPSHOT]
at net.floodlightcontroller.core.internal.OFSwitchHandshakeHandler$OFSwitchHandshakeState.processOFMessage(OFSwitchHandshakeHandler.java:839) ~[floodlight.jar:1.2-SNAPSHOT]
at net.floodlightcontroller.core.internal.OFSwitchHandshakeHandler.processOFMessage(OFSwitchHandshakeHandler.java:1790) ~[floodlight.jar:1.2-SNAPSHOT]
at net.floodlightcontroller.core.internal.OFSwitchHandshakeHandler.messageReceived(OFSwitchHandshakeHandler.java:1964) ~[floodlight.jar:1.2-SNAPSHOT]
at net.floodlightcontroller.core.internal.OFConnection.messageReceived(OFConnection.java:414) ~[floodlight.jar:1.2-SNAPSHOT]
at net.floodlightcontroller.core.internal.OFChannelHandler.sendMessageToConnection(OFChannelHandler.java:579) [floodlight.jar:1.2-SNAPSHOT]
at net.floodlightcontroller.core.internal.OFChannelHandler.access$9(OFChannelHandler.java:578) [floodlight.jar:1.2-SNAPSHOT]

有什么问题? recv() 函数似乎有问题。这是内置的发送()和接收功能的代码。

发送():

/**
* Sends a message to a specified client IP:port, if possible.
*
* @return boolean value that indicates success or failure.
*/

@Override
public Boolean send(String clientPort, String message) {
if (message.equals(null)) {
return Boolean.FALSE;
}

clientSock = socketDict.get(clientPort);
try {
logger.info("[NetworkNode] Sending: "+message+" sent through port: "+clientPort.toString());
clientSock.send(message);
return Boolean.TRUE;

} catch (Exception e) {
if (clientSock.getSocketChannel() != null) {
clientSock.deleteConnection();
}
logger.debug("[NetworkNode] Send Failed: " + message + " not sent through port: " + clientPort.toString());
return Boolean.FALSE;
}
}

接收():

/**
* Receives a message from the specified IP:port, if possible.
*
* @return String containing the received message.
*/

@Override
public String recv(String receivingPort) {
clientSock = socketDict.get(receivingPort);
try {
response = clientSock.recv();
response.trim();
logger.info("[NetworkNode] Recv on port:"+receivingPort.toString()+response);
return response;
} catch (Exception e) {
if (clientSock.getSocketChannel() != null) {
clientSock.deleteConnection();
}
logger.debug("[NetworkNode] Recv Failed on port: " + receivingPort.toString());
return "";
}

}

这个send()和recv()函数所在的NetworkNode模块的完整代码是here完整的高可用性支持包是 here (以防万一)

最佳答案

从您发布的日志和您提供的 Github 存储库来看,clientSock 似乎是 null。第 529 行抛出第一个 NullPointerException:

response = clientSock.recv();

并被捕获。

但是在 catch block 中,clientSock 仍然是 null,所以当您这样做时:

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

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

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

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

关于java - 从 controller1 发送消息到 controller2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52302908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com