【问题标题】:Using netcat to send a UDP packet without binding使用netcat发送UDP包不绑定
【发布时间】:2012-07-10 08:00:45
【问题描述】:

我正在尝试使用 netcat 来模拟 NAT 穿越协议。

我有一个实例正在侦听端口 6666 上的 UDP 数据包,如下所示:

nc -ul 6666

在另一个终端窗口中,我正在尝试定期从端口 6666 发送一个 UDP 数据包(以打开路由器上的返回路径。这将在每 20 秒重复一次以重新打开端口的脚本中)

nc -u -p6666 mypinghost.com 4444

问题是 netcat 在此 ping 调用中失败并显示以下消息:

nc:绑定失败:地址已在使用中

这意味着绑定到端口 6666 的侦听器正在阻止另一个进程从该端口发送数据,或者可能 netcat 正在尝试绑定到 6666 以进行侦听。

这就是 netcat 的编写方式,还是我可以通过某种方式给它发痒,让我在不绑定到监听端口的情况下发送数据包?

【问题讨论】:

    标签: udp netcat


    【解决方案1】:

    nc -ul 6666

    在 UDP 端口 6666 上侦听。

    nc -u -p6666 mypinghost.com 4444

    使用UDP端口6666作为源端口,发送到mypinghost:4444。

    nc:绑定失败:地址已在使用中

    这将是在第二次 netcat 调用中,其中 6666 已被第一次使用。

    这意味着绑定到端口 6666 的侦听器正在阻止另一个进程从该端口发送数据

    正确。

    或者可能是 netcat 正在尝试绑定到 6666 来监听。

    而且 肯定。你告诉它这样做,它就这样做了。

    您尝试在同一主机中的两个进程之间执行的操作是不可能的。一次只能有一个进程使用特定的本地 UDP 端口,除非您使用 SO_REUSEADDRESSnetcat 似乎没有实现。

    正如另一位发帖人所建议的那样,解决方案在于使用单个进程。

    【讨论】:

    • 我遇到了同样的问题,我认为 SO_REUSEADDRESS 可以避免该错误。但是随后返回消息不会被侦听进程拾取——除非我在发送进程绑定端口后启动它。我的理解是该选项用于“多播”(我认为不是我的情况),但是有没有办法使用它,以便发送到端口 6666 的消息转到想要接收它们的进程,而不是绑定端口的最新进程?
    • @Edmund 消息应该发送到从该端口接收的所有进程。
    • “正在接收的进程”是指那些绑定到它的进程,还是那些调用recvfrom 的进程?碰巧的是,UDP 数据报似乎只能被最近绑定的进程可靠地拾取。即使该进程从不调用recvfrom,它仍然会阻止另一个进程接收任何内容。但是这个评论讨论变得越来越拥挤,所以我会问一个单独的问题并包含我的代码,除非你能想到一些我可能遗漏的简单的东西。 ;-)
    • @Edmund 表示绑定到该端口的进程。他们不必当前调用recv(),有一个套接字接收缓冲区。
    【解决方案2】:

    我不相信你可以这样使用 netcat。我建议编写一个简单的 Python 脚本,在一个进程中完成发送和接收任务。这样,您就可以独占该端口并同时完成这两项任务。

    【讨论】:

      猜你喜欢
      • 2012-03-30
      • 1970-01-01
      • 2014-07-17
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多