gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:27:43 25 4
gpt4 key购买 nike

我有一个短程序可以像这样将 UDP 数据发送到本地套接字。

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: getaddinfo\n");
}

int fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (fd == -1)
{
printf("ERROR: socket\n");
freeaddrinfo(res);
}

if (sendto(fd, "hello", 5, 0, res->ai_addr, res->ai_addrlen) == -1)
{
printf("ERROR: Sending\n");
}

freeaddrinfo(res);
close(fd);

我在另一个终端窗口中使用 ncat -ul localhost 8980 启动了 ncat,当我随后启动上述程序时,我可以在上面看到“hello”。我还可以重复调用 sendto 并多次看到 hello。程序终止,但当我重新启动发送程序时,我在 ncat 上看不到额外的“hello”消息。这是为什么?

我也试过在程序结束时不调用 close

最佳答案

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

您可以使用 -k 选项通过 ncat 解决这个问题。遗憾的是,ncat-k 选项只能与 -e-c 选项一起使用UDP。您可以使用它:

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

它仍然会绑定(bind)到它从中获取任何东西的每个远程端点,因此它的工作次数是有限制的(默认 100 次,可通过 -m 选项配置)。

如果您改用 nc 会更容易一些。它的 -k 选项与 -u 一起正常工作:

nc -ulk localhost 8980

这将完全阻止 nc 绑定(bind)到远程端点,因此它没有与 ncat 相同的限制。

关于c++ - 为什么在关闭初始程序后我在 ncat 上看不到 UDP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48697089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com