一款域名监控小工具 Domain(IP)Watcher 实现代码_C#教程

监控给定的域名,一旦域名连续30秒(这是默认值,可以在源码中修改)无法Ping通,立刻发邮件到指定邮箱,并发短信给站长

原理:

  用后台线程循环每隔5秒钟Ping结定的域名,如果连接5次Ping不通则发送邮件到给定邮箱。发短信是通过其他途径实现的,现在最常用的有两种方式:

  一是利用QQ邮箱的手机绑定功能实现收到邮件短信提示

  二是用www.ifttt.com提供的gmail跟sms服务实现收到邮件发短信提示

  本工具用的是第一种。
主要程序:
  主要是后台线程ping域名的应用,界面上显示记录的是一个richtextbox控件,其他几个就不说了,代码如下:
  窗体后台程序:

复制代码 代码如下:

public partial class FormMain : Form, IFormWorkThread
{
private delegate void ControlDelegate(string record);
private WorkThread wtObj;
ControlDelegate cdObj;
public FormMain()
{
InitializeComponent();
cdObj = SetRecord;
}
private void FormMain_Load(object sender, EventArgs e)
{
}
private void btnBegin_Click(object sender, EventArgs e)
{
if (txtDomain.Text.Trim() == "")
{
MessageBox.Show("Domain(IP) can not be empty!");
return;
}
if (txtEmail.Text.Trim() == "")
{
MessageBox.Show("Email address can not be empty!");
return;
}
Regex regex = new Regex(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
if (!regex.IsMatch(txtEmail.Text.Trim()))
{
MessageBox.Show("Email address error!");
return;
}
wtObj = new WorkThread(this, 0, 3, txtDomain.Text.Trim(), txtEmail.Text.Trim());
wtObj.StartShowResult();
}
private void SetRecord(string record)
{
rtxtRecord.AppendText(record);
if (rtxtRecord.Lines.Length > 5 * 60 * 24 * 7)
{
rtxtRecord.Clear();
}
}
public void ShowResult(string record)
{
if (rtxtRecord.InvokeRequired)
{
Invoke(cdObj, record);
}
else
{
SetRecord(record);
}
}
private void btnEnd_Click(object sender, EventArgs e)
{
if (wtObj != null)
{
wtObj.EndShowResult();
}
}
private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
if (wtObj != null)
{
wtObj.EndShowResult();
}
}
private void tslblName_Click(object sender, EventArgs e)
{
OpenMyBlog();
}
private void OpenMyBlog()
{
var Info = new System.Diagnostics.ProcessStartInfo("http://artwl.cnblogs.com");
System.Diagnostics.Process.Start(Info);
}
}

IFormWorkThread接口:

复制代码 代码如下:

public interface IFormWorkThread
{
void ShowResult(string record);
}

WorkThread代码:

复制代码 代码如下:

public class WorkThread
{
private IFormWorkThread _formWorkThread;
private Thread thread;
private int count = 0, maxcount = 5;
private string domain = "";
private string emailaddress = "";
public WorkThread(IFormWorkThread formWorkThread,int count,int maxcount,string domain,string email)
{
this.count = count;
this.maxcount = maxcount;
this.domain = domain;
this.emailaddress = email;
_formWorkThread = formWorkThread;
}
private string Ping(string domainname)
{
Ping ping = new Ping();
PingReply pr = ping.Send(domainname);
if (pr.Status == IPStatus.Success)
{
count = count > 0 ? count - 1 : 0;
}
else
{
count++;
if (count > maxcount)
{
EmailHelp.SendEmail(emailaddress,
string.Format("【 {0} 】不能访问啦!",domainname),
string.Format("【 {0} 】不能访问啦!<br/><br/>【时间】{1}<br/><br/>【Ping】当前ping的结果为:{2}", domainname,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), pr.Status),
true);
count = 0;
}
}
return "【Time】:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\t【Domain】:" + domainname + "\t【Status】:" + pr.Status.ToString() + "\t【RoundtripTime】:" + pr.RoundtripTime.ToString() + "\n";
}
public void Deal()
{
while (true)
{
Thread.Sleep(5000);
string result = Ping(domain);
_formWorkThread.ShowResult(result);
}
}
public void StartShowResult()
{
thread = new Thread(new ThreadStart(Deal));
thread.Name = "TimeThread";
thread.Start();
}
public void EndShowResult()
{
thread.Abort();
}
}

发邮件代码:

复制代码 代码如下:

public class EmailHelp
{
public static void SendEmail(string[] emailAddress, string subject, string body, bool ishtml)
{
MailMessage msg = new MailMessage();
foreach (string o in emailAddress)
{
msg.To.Add(o);
}
msg.Subject = subject;//邮件标题
msg.Body = body;//邮件内容
msg.IsBodyHtml = ishtml;//是否是HTML邮件
Thread sendemail = new Thread(SendReplyEmail);
sendemail.Start(msg);
}
public static void SendEmail(string to, string subject, string body, bool ishtml)
{
SendEmail(new string[] { to }, subject, body, ishtml);
}
private static void SendEmail(MailMessage mailMessage)
{
mailMessage.From = new MailAddress("emailaddress", "网站检测邮件", System.Text.Encoding.UTF8);
mailMessage.SubjectEncoding = System.Text.Encoding.UTF8;//邮件标题编码
mailMessage.BodyEncoding = System.Text.Encoding.UTF8;//邮件内容编码
mailMessage.Priority = MailPriority.Normal;//邮件优先级
SmtpClient client = new SmtpClient();
//注册的邮箱和密码
client.Credentials = new System.Net.NetworkCredential("emailaddress", "password");
client.Port = 25;
client.Host = "smtp.qq.com";
client.EnableSsl = false;
try
{
client.Send(mailMessage);
}
catch (System.Net.Mail.SmtpException ex)
{
//log.Error(ex.Message);
}
}
private static void SendReplyEmail(object model)
{
SendEmail((MailMessage)model);
}
}

注:发邮件的代码中emailaddress跟password要换成你自己的邮件地址跟密码。另外下载的exe文件为保证可用,我用的邮箱地址跟密码没有去掉,请大家也不要反编译后查看(这只是一个coding时的测试邮箱,没什么价值,赚不到钱的)。
工具下载地址 Domain(IP)Watcher

时间: 2024-07-30 12:35:20

一款域名监控小工具 Domain(IP)Watcher 实现代码_C#教程的相关文章

Memcache - Memcache监控小工具stats命令

这里介绍memcache自带的监控小工具stats命令 可以监控基本的memcache信息,像服务器信息,内存分配数据等 stats 显示服务器信息.统计数据等 root@pts/1 $ echo "stats"|nc 192.168.100.13 11211 STAT pid 23160 STAT uptime 505840 STAT time 1479269732 STAT version 1.4.15 STAT libevent 2.0.21-stable STAT pointe

打造自己的Linux服务器监控小工具

周末在家蛮无聊的,思考人生的同时突发奇想就写一个服务器监控的小工具吧.学JAVA快1年了,刚好检验一下自己! 仔细想想呢估计作用可能也有限,毕竟外面各种监控工具也很多,初衷其实也只是练练手,加上平时比较懒,那么为了更方便的看服务器性能指标,所以就选了这个题材咯,那么就开始吧. 不过优点也是有的嘛,至少不需要在服务器端装一个脚本之类的了. 一.小工具的功能 1 能够读取服务器CPU,IO,Memory的性能指标并在页面展示出来 2 把监控的信息打印到文件,方便进行数据分析 二.准备工作 java开

全面支持apache+tomcat+mysql+jboss+lighttpd的监控小工具

问题描述 apachehttpd.tomcat.mysql.jboss.lighttpd是应用非常广泛的开源软件,我们在此分享一下监控它们的一个小工具1.mysql在mysql的监控界面上,您应该关注如下几个关键指标:1.当前已打开连接数:表示当前打开的数据库连接:2.启动以来同时处理的最大连接数:表示自从数据库启动来同时处理的最大连接请求,这个值对于提供数据库的处理能力比较重要,下面是两个优化的量化经验:假设数值tmpPercent=启动以来同时处理的最大连接数/设置的最大连接数l如果tmpP

C#加密解密文件小工具实现代码_C#教程

DebugLZQ在网上搜索相关文件加密的程序,发现给出的基本都是针对"字符创"."文本"的加密与解密.对视频文件.图片等一般文件的加密解密程序少之又少,故写下此文,实现一个对一般文件进行加密的小工具. 程序的主要功能是:用户通过文件选择框选择要加密的文件->输入密码进行加密:选择加密后的文件,输入密码进行解密. 程序的主界面如下: 三个按钮的Click事件处理程序如下: 复制代码 代码如下: private void btnSelectFile_Click(o

C#读取QQ纯真IP数据库QQWry.Dat的代码_C#教程

纯真版QQ IP数据库 复制代码 代码如下: using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Web; using System.Configuration; namespace BLL { public class IPLocationSearch { private static readonly QQWry qq = new QQWry(Conf

C#获取路由器外网IP,MAC地址的实现代码_C#教程

C#实现的获取路由器MAC地址,路由器外网地址.对于要获取路由器MAC地址,一定需要知道路由器web管理系统的用户名和密码.至于获取路由器的外网IP地址,可以不需要知道路由器web管理系统的用户名和密码,但是需要有一个代理页面获取客户端公网ip地址的,这样C#请求此页面即可获取到路由器公网ip地址.如 //getip.ashx 测试路由为水星 MR804,水星 MR808,都可以成功重启路由和获取到路由器MAC和外网IP地址 源代码 using System.Text; using System

C#独立域名查询代码_C#教程

whois.aspx  <% @Page Language="C#" %>  <% @Import Namespace="System.Net.Sockets" %>  <% @Import Namespace="System.Text" %>  <% @Import Namespace="System.IO" %>  <% @Import Namespace="

C#获取计算机名,IP,MAC信息实现代码_C#教程

利用C#获取计算机名,IP,MAC信息,如下为源代码: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Management; namespace Wenanry.Net { /// <summary> /// 获取计算机系统信息 /// </summary> public class ManagementSyst

用C#编写获取远程IP,MAC的方法_C#教程

如果要想获得远程的地址,需要用sendarp这个函数来实现.具体的代码如下:  [DllImport("Iphlpapi.dll")]  private static unsafe extern int SendARP(Int32 dest,Int32 host,ref IntPtr mac,ref IntPtr length);  [DllImport("Ws2_32.dll")]  private static extern Int32 inet_addr(st