Answers:
没有所谓的“开放” UDP端口,至少在大多数人习惯的意义上(这是在回答诸如“确定,我已经接受您的连接”之类的东西)。UDP是无会话的,因此“端口”(读取:操作系统IP堆栈中的UDP协议)将永远不会自行响应“成功”。
UDP端口只有两种状态:侦听或不侦听。通常将其翻译为“已通过进程在其上打开套接字”或“未打开任何套接字”。后一种情况应易于检测,因为系统应使用代码= 3(端口不可达)的ICMP目标不可达数据包进行响应。不幸的是,许多防火墙可能会丢弃这些数据包,因此,如果您没有收到任何信息,则无法确定端口是否处于此状态。而且,请不要忘记ICMP也是无会话的,并且也不会进行重传:Port Unreachable数据包很可能在网络上的某个地方丢失。
处于“侦听”状态的UDP端口可能根本不响应(正在侦听它的进程只是接收到数据包,并且不传输任何内容),或者它可以将某些内容发回(如果该进程确实在接收时起作用,并且如果它通过以下方式起作用)通过UDP响应原始发件人IP:端口)。再说一遍,如果您什么都还不回来,就永远无法确定状态。
您说您可以控制接收主机:这使您能够构造自己的协议来检查UDP端口的可达性:只需在接收主机上放置一个进程,该进程将侦听给定的UDP端口并进行响应(或将其发送给您)电子邮件,或者只是发疯了,unlink()
主机文件系统上的所有内容……都会引起您的注意。
要测试udp端口是否响应,请使用netcat
。
手册页中的示例:
nc -v -u -z -w 3 example.host 20-30
Send UDP packets to ports 20-30 of example.host, and report which ones
did not respond with an ICMP packet after three seconds.
当然,如果防火墙正在运行DROP
(通常是处理面向Internet的网关时的情况),则不会收到ICMP响应。
yum install nc
用于centos)nc -ul 6111
nc -u <server> 6111
注意:在nc -ul
服务器上运行命令时,它将仅在第一个连接进入时才进行连接。正如我发现的那样,您无法在服务器ping通它的服务器之间进行切换而不会停止并重新启动nc -ul
。实际上,如果您^ C停止了客户端(nc -u ...
),那么您也必须先重新启动服务器侦听器才能重新启动客户端。
我遇到了类似的问题,并在此处使用netcat找到了一个好的解决方案:http : //en.wikipedia.org/wiki/Netcat#Test_if_UDP_port_is_open : _simple_UDP_server_and_client
nc -vzu <host> <port>
我能够确认我的UDP端口已打开,然后可以继续测试我的实际代码。
您可以使用以下命令扫描udp端口
nmap -sU -v <hostname or ip>
我的想法很简单。如果UDP服务器未返回预期的数据,则假设它已关闭,我只是停止收集dgram:
LINE: while(1)
{
my $line;
my $flags;
local $SIG{ALRM} = sub {die "exceeded timeout for recv"};
alarm 5;
eval {
$socket->recv($line,2024,$flags);
};
unless($line =~ /\{.*\}/){
if($verbose){
print STDERR "Invalid or empty dgram:\n",'"', $line, '"',"\n";
}
last LINE;
}
}