为什么关闭初始程序后在ncat上看不到UDP?

Why can't I see UDP on ncat after closing the initial program?

本文关键字:ncat 看不到 UDP 程序 为什么      更新时间:2023-10-16

我有一个简短的程序,可以将UDP数据发送到So的本地套接字。

const char *i = "localhost";
const char *p = "8980";
struct addrinfo h;
struct addrinfo *res = 0;
memset(&hints,0,sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = 0;
hints.ai_flags = AI_ADDRCONFIG;
if (getaddrinfo(i, p, &hints, &res) != 0)
{
    printf("ERROR: getaddinfon");
}
int fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (fd == -1)
{ 
    printf("ERROR: socketn");
    freeaddrinfo(res);
}
if (sendto(fd, "hello", 5, 0, res->ai_addr, res->ai_addrlen) == -1)
{
    printf("ERROR: Sendingn");
}
freeaddrinfo(res);
close(fd);

我已经在带有ncat -ul localhost 8980的不同终端窗口中启动了NCAT,随后启动上述程序时,我可以在其中看到" Hello"。我还可以对sendto进行重复的呼叫,并多次查看Hello。该程序终止,但是当我重新发布发送程序时,我在NCAT上看不到其他" Hello"消息。为什么这是?

我也尝试在程序结束时也没有调用close

问题是,每次运行程序时,都会从其他端口发送数据,因此被视为不同的网络端点。当ncat时首先收到一个数据包,它将绑定到远程端点,并停止收听来自任何其他端点的数据包。

您可以使用-k选项与ncat一起使用。可悲的是,执行UDP时,ncat-k选项只能与-e-c选项一起使用。您可以使其使用:

ncat -ulkc "cat > $(tty)" localhost 8980

它仍将绑定到每个远程端点,但它从中得到任何东西,因此它将起作用的次数有一个限制(默认100,可通过-m选项配置(。

如果您使用nc,请容易一些。这是-k选项通常与-u合作:

nc -ulk localhost 8980

完全可以防止nc绑定到远程端点,因此它没有与ncat相同的限制。