这个问题紧随其后:在 openSUSE 中工作的套接字在 Debian 中不起作用?
在我的 Debian 系统上使用套接字时,我必须使用 nc -l -p port_number 来模拟我想与之交谈的服务器。如果我使用 nc -l port_number,则在使用套接字连接功能时它会失败,并且 strerror(errno) 会说“连接被拒绝”。
没有 -p 选项的 Netcat 在其他 Linux 发行版上运行良好,我应该对我的配置进行哪些更改?
这个问题紧随其后:在 openSUSE 中工作的套接字在 Debian 中不起作用?
在我的 Debian 系统上使用套接字时,我必须使用 nc -l -p port_number 来模拟我想与之交谈的服务器。如果我使用 nc -l port_number,则在使用套接字连接功能时它会失败,并且 strerror(errno) 会说“连接被拒绝”。
没有 -p 选项的 Netcat 在其他 Linux 发行版上运行良好,我应该对我的配置进行哪些更改?
不要调整你的设置。那里有多种 netcat 实现;并非所有人的行为都相同。
特别是,netcat 的“传统”版本,可能是您在 Debian 系统上安装的,如果您省略-p
("port") 标志,最终会做一些完全出乎意料的事情:它最终会将最后一个参数视为一个hostname,将它传递给inet_aton()
,它会将其转换为一个无意义的 IP 地址(例如,1234 将变为 0.0.4.210),然后将继续忽略该 IP 地址并在具有自动分配(可能是随机)端口的套接字上侦听数字。
这种行为显然很愚蠢,因此 netcat 的其他一些实现会假设您的意思是-p
. 但是,您正在使用的那个没有,因此请通过该-p
选项。
我同意黄昏的说法,最好在-p
任何地方都使用该选项,但要回答您的问题:
您必须做的一件事是安装一个支持您想要的语法的 netcat。我知道该netcat-openbsd
软件包支持它。我知道netcat-traditional
包裹没有。还有一个netcat6
包,它也没有。然后,您可以像这样显式请求 OpenBSD 版本的 netcat:
nc.openbsd -l 4242
或者,您可以使用替代系统来设置此版本的 netcat 在您发出nc
命令时运行:
update-alternatives --set nc /bin/nc.openbsd
如果这是您安装的唯一 netcat,这将自动为您完成。
最后,您可以再次选择删除您不喜欢的 netcat (netcat-traditional
或netcat6
)。