gpt4 book ai didi

java - 将低端口绑定(bind)到 Ubuntu 服务器上的 Java 程序

转载 作者:行者123 更新时间:2023-11-28 22:18:57 25 4
gpt4 key购买 nike

我有一个迷你监听器/守护程序来捕获 SNMP 陷阱。这将在 tomcat7 上运行主项目(spring web)时执行监听器。但我总是得到错误 java.net.BindException: Permission denied

我尝试使用 authbind ( http://java-notes.com/ ),但我的问题没有解决。我也曾尝试将端口更改为更大的端口,但出现错误 java.net.BindException: Cannot assign requested address

这是我的应用程序/陷阱接收器代码:

@Component
public class TrapReceiver extends Thread implements CommandResponder {

@Inject
private ApplicationContext applicationContext;

@Inject
private Executor executor;

public TrapReceiver(){
}

List<PDUv1> listPdu = new ArrayList<PDUv1>();
String message = "";
long totReceivedTrap = 0;

@PostConstruct
public void init() {
System.out.println("Running trap listener");
this.start();
}

public synchronized void processPdu(CommandResponderEvent cmdRespEvent) {
PDUv1 pdu = (PDUv1) cmdRespEvent.getPDU();
listPdu.add(pdu);
if (pdu != null) {
if(listPdu.size() == 10){ //10 trap per thread
List<PDUv1> temp = new ArrayList<PDUv1>();
temp.addAll(listPdu);
TrapInsertor trapInsertor = (TrapInsertor) applicationContext.getBean("trapInsertor");
trapInsertor.setProperty(temp);
executor.execute(trapInsertor);
listPdu.clear();
}
}
}

public void run() {
while (true) {
try {
this.listen(new UdpAddress(getIp()+"/162")); //alamat PDU akan listen
} catch (Exception e) {
e.printStackTrace();
}
}
}

public synchronized void listen(TransportIpAddress address)
throws IOException {
AbstractTransportMapping transport;
if (address instanceof TcpAddress) {
transport = new DefaultTcpTransportMapping((TcpAddress) address);
} else {
transport = new DefaultUdpTransportMapping((UdpAddress) address);
}

ThreadPool threadPool = ThreadPool.create("DispatcherPool", 10);
MessageDispatcher mDispathcher = new MultiThreadedMessageDispatcher(
threadPool, new MessageDispatcherImpl());

// add message processing models
mDispathcher.addMessageProcessingModel(new MPv1());
mDispathcher.addMessageProcessingModel(new MPv2c());

// add all security protocols
SecurityProtocols.getInstance().addDefaultProtocols();
SecurityProtocols.getInstance().addPrivacyProtocol(new Priv3DES());

// Create Target
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));

Snmp snmp = new Snmp(mDispathcher, transport);
snmp.addCommandResponder(this);

transport.listen();
System.out.println("Listening on " + address);

try {
this.wait();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}

//fungsi untuk mendapatkan real ip local (bukan 127.0.0.1)
public static String getIp(){
String ipAddress = null;
Enumeration<NetworkInterface> net = null;
try {
net = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
throw new RuntimeException(e);
}

while(net.hasMoreElements()){
NetworkInterface element = net.nextElement();
Enumeration<InetAddress> addresses = element.getInetAddresses();
while (addresses.hasMoreElements()){
InetAddress ip = addresses.nextElement();
if (ip instanceof Inet4Address){
if (ip.isSiteLocalAddress()){
ipAddress = ip.getHostAddress();
}
}
}
}
return ipAddress;
}

}

最佳答案

您需要成为 root 才能绑定(bind)到 Linux 系统上的低端口。请确保以足够的权限运行您的 Java 应用程序。当连接到高端口时,确保它没有被其他进程/服务使用。

另见 Binding to a Privileged Port on Debian/Ubuntu关于在 Ubuntu 上启用 AUTHBIND

关于java - 将低端口绑定(bind)到 Ubuntu 服务器上的 Java 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30568335/

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