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

时间:2018-02-09 00:46:05

标签: c++ c sockets udp

我有一个简短的程序,可以将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并多次看到你好。程序终止但是当我重新启动发送程序时,我在ncat上看不到另外的“hello”消息。这是为什么?

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

1 个答案:

答案 0 :(得分:2)

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

您可以使用ncat选项通过-k解决此问题。遗憾的是,ncat的{​​{1}}选项只能在执行UDP时与-k-e选项一起使用。你可以使用它:

-c

它仍将绑定到它从中获取任何内容的每个远程端点,因此它的工作次数有限(默认为100,可通过ncat -ulkc "cat > $(tty)" localhost 8980 选项配置)。

如果您使用-m,则会更容易一些。它是nc选项,可以正常使用-k

-u

这会阻止nc -ulk localhost 8980 绑定到远程端点,因此它与nc没有相同的限制。