在 C 中发送到关闭的 UDP 套接字不会抛出错误

问题描述 投票:0回答:1

我正在尝试“测试”UDP套接字是否打开作为终止程序的一种方式:

 int flags = fcntl(s, F_GETFL, 0);
        fcntl(s, F_SETFL, flags | O_NONBLOCK);
        int x = recv(s, buffer, sizeof(buffer), 0);
        if (x == -1)
        {
            char temp[] = "Testing Connection";
            int x = sendto(s, temp, sizeof(temp), 0, (struct sockaddr *)&si_other, sizeof(si_other));
            printf("%d\n",x);
            if(x == -1){
                return;
            }
            continue;
        }

但是 if 语句没有被触发。它正在发送数据以运行以下行的 UDP 套接字(我知道它运行是因为打印语句打印

    printf("Closing the socket\n");
    close(s);
    return;

即使它试图发送到的 udp 套接字已关闭,sendto 也会连续返回一个正值。有什么办法可以解决这个问题吗?

c sockets udp
1个回答
2
投票

由于 UDP 是一种数据报协议而不是面向连接的,因此无法直接使用它获取与连接相关的错误。您只需将数据包发送到互联网上,它们可能会被某人接收或丢失。

您可以在某些系统(例如 Linux)上做的是在套接字上设置 IP_RECVERR 选项。如果你这样做,那么你可以使用 recv(2)MSG_ERRQUEUE 标志来查看系统是否收到了与你发送的数据包相关的任何 ICMP 错误消息。 ip(7) 手册页对此有描述。请注意,not 看到错误响应并不意味着数据包已收到并且没有丢失。

然而,最常见的是,您只需发送数据包并等待超时响应,然后重新发送(如果在多次发送后没有收到响应,则失败)。

© www.soinside.com 2019 - 2024. All rights reserved.