gpt4 book ai didi

c - 将数据报发送到无法到达的目的地时,sendto() 对 IPv4 和 IPv6 有不同的行为

转载 作者:太空宇宙 更新时间:2023-11-03 23:31:28 25 4
gpt4 key购买 nike

当我使用 sendto() 将数据报发送到不存在的目的地时,我发现 IPv4 和 IPv6 的结果不同。

  • IPv4:它只返回一个正值。

  • IPv6:它返回 -1 并将 errno 设置为 ENETUNREACH

有人知道为什么会这样吗?

这是我的代码:

int main (int argc, char *argv[])
{
// Usage: program [version]
int version = argc == 1 ? 4 : atoi(argv[1]);

int fd = socket (AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
if (fd == -1)
ErrAndExit ("socket");

if (version == 4) // use ipv4
{
struct sockaddr_in srv_addr;
memset (&srv_addr, 0, sizeof(srv_addr));
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons (11111);
if (inet_pton (AF_INET, "192.168.0.200", &srv_addr.sin_addr) != 1)
ErrAndExit ("inet_pton");

socklen_t len = sizeof(srv_addr);
puts("going to sendto...");
ssize_t res = sendto (fd, "hello", 6, 0, (struct sockaddr*) &srv_addr, len);
if (res == -1)
ErrAndExit("sendto");

printf ("done with res: %ld\n", res);
}
else // use ipv6
{
struct sockaddr_in6 srv_addr;
memset (&srv_addr, 0, sizeof(srv_addr));
srv_addr.sin6_family = AF_INET6;
srv_addr.sin6_port = htons (11111);
if (inet_pton (AF_INET6, "2002::148:249", &srv_addr.sin6_addr) != 1)
ErrAndExit ("inet_pton");

socklen_t len = sizeof(srv_addr);
puts("going to sendto...");
ssize_t res = sendto (fd, "hello", 6, 0, (struct sockaddr*) &srv_addr, len);
if (res == -1)
ErrAndExit("sendto");

printf ("done with res: %ld\n", res);
}
return 0;
}

最佳答案

令人惊讶的是,IPv6 可以给您一个错误,而 IPv4 却不能。 IPv4 通常只向已连接 UDP 套接字传递错误。

关于c - 将数据报发送到无法到达的目的地时,sendto() 对 IPv4 和 IPv6 有不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14373858/

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