使用netcat发送一个UDP数据包而无需绑定
我正在尝试使用netcat来模拟NAT穿越协议。使用netcat发送一个UDP数据包而无需绑定
我有一个实例正在监听UDP包在端口6666,像这样:
NC -ul 6666
在另一个终端窗口,我想定期从端口6666发送一个UDP包(打开我的路由器上的返回路径。这将是在重复每20秒重新打开端口的脚本)
NC -u -p6666 mypinghost.com 4444
的问题是失败的netcat在此消息的ping通话上:
NC:绑定失败:地址已在使用
这意味着听众已经绑定到端口6666是从该端口发送,或者可能是netcat的是试图绑定到6666听阻塞另一个进程。
这是netcat的写法吗,或者我可以通过某种方式让它发痒,让我发送一个没有绑定到端口的数据包来侦听?
我不相信你可以这样使用netcat。我会建议编写一个简单的Python脚本,在一个进程中执行发送和接收任务。这样,您可以独占该端口并仍然完成这两项任务。
NC -ul 6666
收听在UDP端口6666
NC -u -p6666 mypinghost.com 4444
使用UDP端口6666作为源端口,发送到mypinghost:4444。
NC:绑定失败:地址已在使用
这将是对第二netcat
调用,其中6666是已经通过第一个使用。
这意味着收听者具有绑定到端口6666是从那个端口
正确发送阻塞另一个过程。
或者可能该netcat正试图绑定到6666进行监听。
而绝对说。你告诉它这样做,所以它做到了。
在同一主机的两个进程之间,你所要做的事情是不可能的。一次只能有一个进程使用特定的本地UDP端口,除非使用SO_REUSEADDRESS
,而netcat
似乎没有实现。
正如另一张海报所说,解决方案在于使用单个进程。
我有这个相同的问题,我想SO_REUSEADDRESS避免了这个错误。但是,然后返回消息不会被侦听进程拾取 - 除非在发送进程绑定端口后启动它。我的理解是,该选项用于“多播”(我不认为是我的情况),但有办法使用它,所以发送到端口6666的消息去到想要接收它们的进程,而不是最新的过程来绑定端口? – Edmund 2012-09-02 08:24:43
@Edmund消息应该发送到从该端口接收的所有进程。 – EJP 2012-09-02 10:36:40
“正在接收的进程”,你的意思是那些绑定它的,或者那些调用'recvfrom'的?恰巧,UDP数据报似乎只能被最近的绑定过程可靠地获取。即使该进程从不调用'recvfrom',它仍然阻止另一方接收任何东西。但是这个评论讨论越来越拥挤,所以我会问一个单独的问题并且包含我的代码,除非你能想到一些简单的东西,可能我错过了。 ;-) – Edmund 2012-09-02 11:08:15