![如何使用 nc 无限期地监听 TCP 端口?](https://linux22.com/image/1562767/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20nc%20%E6%97%A0%E9%99%90%E6%9C%9F%E5%9C%B0%E7%9B%91%E5%90%AC%20TCP%20%E7%AB%AF%E5%8F%A3%EF%BC%9F.png)
我想无限期地读取到达特定 TCP 端口的数据并将数据转储到文件中。我尝试了许多不同的方法,nc
但都不起作用。大多数情况下,我没有在控制台上收到任何错误。以下是我尝试过的方法:
nc -lv 12345 >> ../myfile
nc -v 12345 >> ../myfile
nc -v -p 12345 >> ../myfile
nc -v localhost -p 12345 >> ../myfile
感谢你的帮助..
答案1
我想无限读取到达特定 TCP 端口的数据
这确实没有意义……如果您毕竟是数据到达 UDP 端口,那么没问题 - 但 TCP 是一种基于连接的协议。一旦客户端连接,您accept()
就会得到两个套接字 - 一个监听,一个连接到客户端...nc
将关闭原始监听套接字,并与客户端一对一处理。
如果您希望能够监听多个客户端的连接,请尝试使用socat
:
socat TCP-LISTEN:12345,fork FD:1 >> ../myfile
这将设置一个监听套接字并在连接上派生一个新进程 - 保持监听套接字处于监听状态。所有收到的数据都将写入 stdout(文件描述符1
),并重定向到该文件../myfile
进行追加。
笔记:数据将从任意数量的客户端接收,不保证顺序,也不采用框架...即:如果您同时拥有多个客户端,那么数据就会变得混乱。
如果你想socat
自己处理文件,那么你可以使用CREATE
或OPEN
(参见手册页):
socat TCP-LISTEN:12345,fork OPEN:../myfile,append
如果您对“每次一个客户“方法,然后放入nc
一个循环:
while :; do nc -l 12345; done >> ../myfile
测试一下nc
:
nc localhost 12345
答案2
左侧屏幕
nc -l 1234
启动服务器。
右侧的屏幕 nc 127.0.0.1 1234
连接。
看起来你的命令是错误的。
值得一提的是,您使用的是 gnu 还是 bsd,我使用的是 bsd。man nc 显示“NC(1) BSD 通用命令手册”。要在 gnu 上启动服务器,可能需要 -l 和 -p。要将客户端连接到任何端口上的服务器,绝不会使用 -p。
您也可以使用 -v
你面临的直接问题是你根本无法让它运行。
您的问题询问了它是否无限期,但我想指出的是,如果您在客户端执行 ctrl-c,那么除了断开连接之外,它还会停止服务器。您可以将该服务器置于循环监听中。这有效。这样,服务器就会继续监听,如果您在客户端执行 ctrl-c 后尝试再次连接,服务器仍会在那里。