我遇到的几个ICMP Type:3 (Destination unreachable)的问题
Type:3 Code:13 (Communication administratively filtered)
关闭放火墙试试
Type:3 Code:3 (Post unreachable)
这个问题出现在我的一个项目中,我需要接收多个UDP端口发来的数据且希望拿到IP与UDP包头数据。所以我采用原始套接字加BPF过滤方式来实现,因为接收涉及多个端口所以在bind时我没办法指定端口。最终效果我可以接收到所有需要接收的数据包并完成功能,但是内核会在每个接收包后发送一个ICMP Type:3 Code:3
的包给到数据源。
用防火墙拦截这个ICMP包是一个解决方法,但因为之前参考过isc dhcp
源代码,实现方式类似但它并不会引起这个ICMP包所以我想应该会有更优雅的方法来解决。然后我通过netstat -anup
发现isc dhcp
的程序确实绑定了67
端口,isc dhcp
是这么干的,它另外又创建了一个套接字绑定67
端口并用来向外发送包使用。
目前看来只有这种方法了,另外组播多播并不存在这个问题只有单播情况下会发生。
main()
{
discover_interfaces()
{
maybe_setup_fallback()
{
if_register_fallback()
{
if_register_socket()
{
sock = socket(domain, SOCK_DGRAM, IPPROTO_UDP);
flag = 1;
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
(char *)&flag, sizeof(flag)) < 0) {
log_fatal("Can't set SO_REUSEADDR on dhcp socket for"
" %s: %m", info->name);
}
if (bind(sock, (struct sockaddr *)&name, name_len) < 0) {
log_error("Can't bind to dhcp address: %m");
log_error("Please make sure there is no other dhcp server");
log_error("running and that there's no entry for dhcp or");
log_error("bootp in /etc/inetd.conf. Also make sure you");
log_error("are not running HP JetAdmin software, which");
log_fatal("includes a bootp server.");
}
}
}
}
}
}