KRI$UN? 2024-04-24 13:51 采纳率: 0%
浏览 22

C# sockets报错: 由于连接方在一段时间后没有正确答复或者连接的主机没有反应,连接尝试失败

const string NtpServer = "time.windows.com";
const int ComparisonIntervalHours = 24;
const int ComparisonAttempts = 5;
const int MaxTimeDifferenceSeconds = 10;

static DateTime GetNetworkTime()
{
    try
    {
        using (var client = new TcpClient(NtpServer, 123))
        {
            byte[] ntpData = new byte[48];
            ntpData[0] = 0x1B;
            client.GetStream().Write(ntpData, 0, ntpData.Length);
            client.GetStream().Read(ntpData, 0, ntpData.Length);
            ulong intPart = BitConverter.ToUInt32(ntpData, 32);
            ulong fractPart = BitConverter.ToUInt32(ntpData, 36);
            ulong milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
            TimeSpan offset = TimeSpan.FromTicks((long)milliseconds * TimeSpan.TicksPerMillisecond);
            return new DateTime(1900, 1, 1) + offset;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error getting network time: {ex.Message}");
        return DateTime.MinValue;
    }
}

代码相当于直接catch掉了

img

  • 写回答

4条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-04-24 13:55
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述: 给定的代码为获取网络时间的C#代码,要求回答以下问题:
    1. 该代码实现了什么功能?
    2. 该代码中常量NtpServer、ComparisonIntervalHours、ComparisonAttempts、MaxTimeDifferenceSeconds的含义分别是什么?
    3. 该代码中使用了什么协议来获取网络时间?
    4. 该代码中catch掉了所有异常,你认为这样处理异常是否合理? 回答:
    5. 该代码实现了从指定的NTP服务器获取网络时间,并返回一个DateTime类型的对象。
    6. 常量NtpServer表示NTP服务器的域名或IP地址,ComparisonIntervalHours表示对比网络时间和本地时间的时间间隔,ComparisonAttempts表示对比网络时间和本地时间的尝试次数,MaxTimeDifferenceSeconds表示本地时间和网络时间的最大差值(秒)。
    7. 该代码使用了NTP协议(网络时间协议)。
    8. 该代码中catch掉了所有异常,这样做可能导致无法判断到底出了什么问题,造成调试和排查问题的困难。应该具体处理各种异常情况,并给出相应的提示和处理方式。例如,对于网络连接异常,可以提示用户网络连接失败,并检查网络连接设置、防火墙设置等;对于NTP协议异常,可以提示用户网络时间不可用,并尝试从其他NTP服务器获取网络时间。以下是修改后的代码:
    const string NtpServer = "time.windows.com";
    const int ComparisonIntervalHours = 24;
    const int ComparisonAttempts = 5;
    const int MaxTimeDifferenceSeconds = 10;
    static DateTime GetNetworkTime()
    {
        try
        {
            using (var client = new TcpClient(NtpServer, 123))
            {
                byte[] ntpData = new byte[48];
                ntpData[0] = 0x1B;
                client.GetStream().Write(ntpData, 0, ntpData.Length);
                client.GetStream().Read(ntpData, 0, ntpData.Length);
                ulong intPart = BitConverter.ToUInt32(ntpData, 32);
                ulong fractPart = BitConverter.ToUInt32(ntpData, 36);
                ulong milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
                TimeSpan offset = TimeSpan.FromTicks((long)milliseconds * TimeSpan.TicksPerMillisecond);
                DateTime networkTime = new DateTime(1900, 1, 1) + offset;
                if (Math.Abs((networkTime - DateTime.Now).TotalSeconds) > MaxTimeDifferenceSeconds)
                {
                    for (int i = 1; i < ComparisonAttempts; i++)
                    {
                        Thread.Sleep(ComparisonIntervalHours * 3600000);
                        client.GetStream().Write(ntpData, 0, ntpData.Length);
                        client.GetStream().Read(ntpData, 0, ntpData.Length);
                        intPart = BitConverter.ToUInt32(ntpData, 32);
                        fractPart = BitConverter.ToUInt32(ntpData, 36);
                        milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);
                        offset = TimeSpan.FromTicks((long)milliseconds * TimeSpan.TicksPerMillisecond);
                        networkTime = new DateTime(1900, 1, 1) + offset;
                        if (Math.Abs((networkTime - DateTime.Now).TotalSeconds) <= MaxTimeDifferenceSeconds)
                        {
                            return networkTime;
                        }
                    }
                    throw new Exception("Unable to get accurate network time after multiple attempts.");
                }
                return networkTime;
            }
        }
        catch (SocketException ex)
        {
            Console.WriteLine($"Error connecting to NTP server: {ex.Message}");
            return DateTime.MinValue;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error getting network time: {ex.Message}");
            return DateTime.MinValue;
        }
    }
    

    修改后的代码增加了对比网络时间和本地时间,以及多次尝试的功能,并给出了对应的异常处理方式。

    评论

报告相同问题?

问题事件

  • 修改了问题 4月24日
  • 创建了问题 4月24日

悬赏问题

  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 MATLAB中streamslice问题
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 51单片机中C语言怎么做到下面类似的功能的函数(相关搜索:c语言)
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端