我有一个简短的程序,可以将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
。
答案 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
没有相同的限制。