【问题标题】:How can I tell if I sent a UDP packet to an open port?如何判断我是否将 UDP 数据包发送到开放端口?
【发布时间】:2011-06-06 02:41:52
【问题描述】:

我正在制作一个 C 程序,我需要在其中检查目标计算机上打开的 UDP 端口。因为 UDP 是无连接的,所以我无法像使用 TCP 一样检查 connect() 的返回值。

send()sendto() 返回值也无济于事。手册页指出:

   No  indication  of failure to deliver is implicit in a send().  Locally
   detected errors are indicated by a return value of -1.

如何判断我是否将 UDP 数据包发送到目标主机上的开放端口?

【问题讨论】:

    标签: c sockets udp port connect


    【解决方案1】:

    一般来说你做不到。

    原则上,具有关闭端口的主机应该发回一个 ICMP 端口不可达。但他们通常不会;同样,宕机或无法访问的主机也不会发送此类消息。此外,一些防火墙会阻止该消息。

    检索错误也是有问题的。 Linux 具有定义明确但令人困惑的用于检索套接字错误的语义(有关一些信息,请参见各种手册页、socket(7)、ip(7) 和 udp(7))。例如,当您执行不相关的 sendto() 时,您有时会看到先前报告的错误。其他操作系统用于检索特定套接字错误的机制略有不同。

    如果保证是另一个端口上的特定协议,您可以发送一个应该引起特定响应的数据包(如果它是您自己的协议,您可以添加一个“你在那里”消息类型),然后你可以使用它。但总的来说,是否产生响应取决于应用程序,您无法区分一个没有监听的端口和一个有监听决定不响应您的端口。

    【讨论】:

    • 很抱歉问这个问题,但我如何查看它是否向我发送了 ICMP 端口不可访问?谢谢。
    • @Marian:你能再问一个问题吗?我也很想知道。
    • 我实际上认为检测 ICMP 端口不可达是不值得的,因为它可能不会到达。对于安装了“个人防火墙”产品的计算机尤其如此,这些产品往往会出于(大部分)错误的安全原因而阻止这些有用的东西。
    【解决方案2】:

    由于 UDP 是无连接的,您必须在应用程序代码中检查端口状态。例如,向端口发送数据包,然后等待响应。如果您在某些应用程序特定时间没有得到响应,则端口不可用。

    当然,您必须将其设计到发送端和接收端。

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      相关资源
      最近更新 更多