我创建了一个 SNMP 代理模拟器应用程序,它对模拟设备使用端口号 161。有时会出现端口已在使用中的异常。如何知道161端口是否繁忙?
只需开始您的申请。如果它收到 BindException,则该端口正在使用中。如果没有,您的应用程序可以运行。提前知道并不会给你带来任何好处。
通过使用 netstat 命令。
具体来说,
netstat -s [PORT_NO]
例如,
netstat -s 161
只是补充说明。我认为您可能被禁止使用低端口号(如果不是 root 用户,则为安全策略) - 尝试使用更高的端口号,即 10161。
1)ps -efww | grep 161
2)netstat -anp | grep 161
在 Windows 上,您可以使用
netstat
和 tasklist
。例如,
netstat -aon | findstr 161
它的输出应该是
C:\Program Files\Microsoft Visual Studio 9.0\VC>netstat -aon |findstr 161
UDP 0.0.0.0:161 *:* 1620
UDP [::]:161 *:* 1620
然后使用
tasklist
tasklist /fi "PID eq 1620"
Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
snmp.exe 1620 Services 0 1,172 K
在我的情况下,显然是 Windows SNMP 服务使用端口 161。在您的情况下,它可能是另一个进程。
以下声明对我有用。
netstat -lnp
使用示例:
appuser@-app:~$ sudo netstat -lnp |grep 162
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1162/mysqld
udp6 0 0 127.0.0.1:162 :::* 6830/java
作为非常后期的跟进,即使在使用 Net-SNMP v5.9.1 时未使用端口(无法使用其他版本进行测试),我也会收到此错误。
事实证明,如果您指定配置文件,则会失败并显示“地址正在使用”,因此:
# snmptrapd -c /etc/snmp/snmptrapd.conf
失败:
snmptrapd[1089]: couldn't open tcp:192.168.0.2 -- errno 98 ("Address already in use")
但是:
# snmptrapd
有效。