我正在尝试使用netcat来模拟NAT遍历协议。
我有一个实例正在端口6666上侦听UDP数据包,如下所示:
nc -ul 6666
在另一个终端窗口中,我试图定期从端口6666发送UDP数据包(打开路由器上的返回路径。这将是一个每20秒重复一次的脚本重新打开端口)
nc -u -p6666 mypinghost.com 4444
问题是netcat在此ping调用失败时显示消息:
nc:绑定失败:地址已在使用中
这意味着绑定到端口6666的侦听器阻止另一个进程从该端口发送,或者可能是netcat尝试绑定到6666以进行侦听。
这就是netcat的编写方式,或者我可以通过某种方式让它发送一个数据包而不绑定到端口来监听?
答案 0 :(得分:9)
nc -ul 6666
收听UDP端口6666。
nc -u -p6666 mypinghost.com 4444
使用UDP端口6666作为源端口,发送到mypinghost:4444。
nc:绑定失败:地址已在使用中
这将是第二次netcat
调用,其中6666已被第一个调用使用。
这意味着绑定到端口6666的侦听器阻止另一个进程从该端口发送
正确。
或者可能是netcat试图绑定到6666来监听。
和 绝对那个。你告诉它这样做,所以它做到了。
在同一主机中的两个进程之间不可能执行的操作。除非您使用SO_REUSEADDRESS
似乎没有实现netcat
,否则一次只能有一个进程可以使用特定的本地UDP端口。
正如另一张海报所说,解决方案在于使用单一流程。
答案 1 :(得分:2)
我不相信你可以这样使用netcat。我建议编写一个简单的Python脚本,在一个进程中执行发送和接收任务。这样你就可以完全保留那个端口并仍然完成这两项任务。