Netcat发送额外的“X”UDP数据包

12

这里借鉴,我编写了一个小Python脚本,它监听一个端口并打印所有收到的UDP数据包:

import socket

UDP_IP = "127.0.0.1"
UDP_PORT = 5005

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))

while True:
    data, addr = sock.recvfrom(1024)
    print "received message:", repr(data)

现在我正在使用 netcat 将数据发送到此脚本。以下是我的命令行。

echo -e "foo:1|c" | netcat -v -u localhost 5005

以下是Python的输出结果:

received message: 'X'
received message: 'X'
received message: 'X'
received message: 'X'
received message: 'X'
received message: 'foo:1|c\n'

前面大约四行左右的“X”字符每秒钟出现一次,然后最后两行几乎同时出现。

我的问题是:这些额外的“X”数据包来自哪里?如果源是netcat,那么我如何防止netcat发出它们?我相信这是BSD的netcat

3个回答

11

我相信这是BSD的netcat。

我遇到了同样的问题,当我执行nc --version时,确实看到:

这是来自netcat-openbsd软件包的nc。netcat-traditional软件包中提供了另一种nc。

传统智慧认为BSD是“更好”的版本(参见netcat-traditional和netcat-openbsd之间的区别是什么?

但是无论如何,需要查找“X”实际来自哪里的相关代码,就必须查看BSD源代码。而且你不需要太费力!

http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/nc/netcat.c?rev=1.177

“Smoking gun”是一个函数udptest()

/*
 * udptest()
 * Do a few writes to see if the UDP port is there.
 * Fails once PF state table is full.
 */
int
udptest(int s)
{
    int i, ret;

    for (i = 0; i <= 3; i++) {
        if (write(s, "X", 1) == 1)
            ret = 1;
        else
            ret = -1;
    }
    return (ret);
}

当且仅当 vflag(详细程度)或 zflag(端口扫描标志)被设置时,才会被称为这种情况:

if (vflag || zflag) {
    /* For UDP, make sure we are connected. */
    if (uflag) {
        if (udptest(s) == -1) {
            ret = 1;
            continue;
        }
    }
    ...

关于为什么使用-v选项会开始向UDP端口抛出随机数据的理由,我猜想是因为那些使用-v的人想获取尽可能多的信息。因此,在调试情况下,获取早期和明确的连接错误消息的权衡是值得的。
但即便如此,我的意见是,与其发送晦涩的"X",发送像"NETCAT UDP PING DUE TO -V OPTION"这样的内容会更好。 :-/

2

由于我无法确定的原因,那些X数据包被-v选项发送给了nc。请尝试使用以下方法代替:

echo -e "foo:1|c" | netcat -u localhost 5005

由于我无法确定的原因”是我说“我不知道为什么”的方式。我不知道这是否是netcat的缺陷,还是netcat的设计特性,或者是实现细节。 - Robᵩ
@Robᵩ 开源的好处在于人们可以知道... - HostileFork says dont trust SE

0
使用命令 echo -n "foo:1|c" > /dev/udp/localhost/5005

1
/dev/udp 存在于哪些操作系统上? - Robᵩ
啊,我明白了,那是bash的特性,不是操作系统的特性。我之前不知道这个。 - Robᵩ
我很久以前在QNX上写过一个/dev/udp。虽然我模糊地记得它的工作方式有所不同,但我相当肯定Plan 9上也有类似的东西。 - Michael Hunter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接