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.");
          }
        }
      }
    }
  }
}