C#中实现定时器Timer定时判断IP是否ping通(连通)和端口号是否telnet可达(可用)

场景

Winform中使用HttpClient(设置最大超时响应时间)调用接口并做业务处理时界面卡住,使用async Task await异步任务编程优化:

Winform中使用HttpClient(设置最大超时响应时间)调用接口并做业务处理时界面卡住,使用async Task await异步任务编程优化_霸道流氓气质的博客-CSDN博客

在上面的基础上,将定时器定时调用http接口改为定时判断某ip是否联通,端口是否可用。

注:

博客:
霸道流氓气质_C#,架构之路,SpringBoot-CSDN博客

实现

1、winform上点击按钮启动定时器时

复制代码
                    _timer.Interval = scheduleInterval;                
                    _timer.Tick += _timer_Tick;
                    _timer.Start();

绑定事件执行方法

复制代码
        private void _timer_Tick(object sender, EventArgs e)
        {
                //其他业务操作
                checkApiIpAndPort();        
        }

2、在checkApiIpAndPort方法中具体实现

复制代码
        private async Task checkApiIpAndPort() {
            textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":检测接口IP和端口联通状态进行中,解析接口ip为:" + Global.Instance.apiIpString + ",解析接口端口为:" + Global.Instance.apiPort);
            textBox_log.AppendText("\r\n");

            bool isIpViliable = await IsIpReachable(Global.Instance.apiIpString);   
            bool isPortViliable = await IsPortReachable(Global.Instance.apiIpString, Global.Instance.apiPort);   
     
            textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":检测接口IP和端口联通状态执行结束,解析接口ip为:" + Global.Instance.apiIpString + ",ip连通性为:" + isIpViliable + ",解析接口端口为:" + Global.Instance.apiPort + ",端口连通性为:" + isPortViliable);
            textBox_log.AppendText("\r\n");
        }

3、除了日志输出,就是两个关键的方法,并且是异步任务编程实现

测试IP是否联通IsIpReachable方法实现

复制代码
        public async Task<bool> IsIpReachable(string strIP)
        {
            // Windows L2TP VPN和非Windows VPN使用ping VPN服务端的方式获取是否可以连通
            Ping pingSender = new Ping();
            PingOptions options = new PingOptions();
            // Use the default Ttl value which is 128,
            // but change the fragmentation behavior.
            options.DontFragment = true;
            // Create a buffer of 32 bytes of data to be transmitted.
            string data = "badao";
            byte[] buffer = Encoding.ASCII.GetBytes(data);
            int timeout = 1500;
            PingReply reply = pingSender.Send(strIP, timeout, buffer, options);
            return (reply.Status == IPStatus.Success);
        }

发送的数据data随意指定即可。

测试端口是否可用IsPortReachable方法具体实现

复制代码
        public async Task<bool> IsPortReachable(string host, int port = 80, int msTimeout = 2000)
        {
            return await Task.Run(() =>
            {
                var clientDone = new ManualResetEvent(false);
                var reachable = false;
                var hostEntry = new DnsEndPoint(host, port);
                using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                {
                    var socketEventArg = new SocketAsyncEventArgs { RemoteEndPoint = hostEntry };
                    socketEventArg.Completed += (s, e) =>
                    {
                        reachable = e.SocketError == SocketError.Success;
                        clientDone.Set();
                    };
                    clientDone.Reset();
                    socket.ConnectAsync(socketEventArg);
                    clientDone.WaitOne(msTimeout);
                    return reachable;
                }
            });
        }

这么设置默认端口为80,超时时间为2秒

注意这里的Timer会有多个namespace,直接指定为

复制代码
using Timer = System.Windows.Forms.Timer;

4、定时器停止

复制代码
                _timer.Tick -= _timer_Tick;
                _timer.Stop();

注意要取消事件绑定

5、测试效果

相关推荐
CSharp精选营3 分钟前
我用 ASP.NET Core 做了个水稻病虫害检查系统
c#·毕业设计·.net core·码农刚子
唐青枫5 分钟前
我用 C# 开发了一款电子发票自动整理工具
c#·.net
下页、再停留8 分钟前
【C#桌面客户端系列学习-2】在原来窗口基础上打开新窗口
c#·visual studio
Behavior17 分钟前
Unity 手游 iOS Deep Link 唤醒全流程:从 URL Scheme / Universal Links 到 C# 层参数投递
c#·unity3d·游戏开发
我是唐青枫18 分钟前
我用 C# 开发了一款电子发票自动整理工具
c#·.net
codigger20 分钟前
ObjectSense:一门千行内核、把可靠性写进骨子里的面向对象脚本语言
开发语言·编程·编程语言
WAKU39 分钟前
C#: 爸爸再爱我一回! 写在微软使用Rust重写GitHub Copilot之后的碎碎念
microsoft·rust·微软·c#·编程语言
唐青枫40 分钟前
别把 WPF 写成一个 MainWindow:C#.NET Prism 模块化开发详解
c#·.net
用户7884773163443 分钟前
WPF 数据绑定 5 个隐形坑:第 3 个 90% 的人都栽过
c#
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#