有时候需要在家里连接公司的服务器,但是它的外网IP会经常变换。当然可以用花生壳之类来解决,不过作为程序员,还是尝试用程序的方法解决吧。接口定义Windows里在外网IP改变时好像没有现成的事件,所以
有时候需要在家里连接公司的服务器,但是它的外网IP会经常变换。当然可以用花生壳之类来解决,不过作为程序员,还是尝试用程序的方法解决吧。
接口定义
Windows里在外网IP改变时好像没有现成的事件,所以定义了这样一个接口IPublicIPMonitor:
当监测到IP改变时会触发一个事件PublicIpChanged,有两个方法分别用来开始和停止监测。
事件参数PublicIpChangedEventArgs的定义如下,只有一个叫IP的属性:
还有一个IPublicIPNotifyReceiver的接口用来对IP改变事件进行响应:
它可以监听某个IPublicIPMonitor并在OnPublicIPChanged里响应。
IPublicIPMonitor实现
实现思路是定时去获取当前IP,如果和之前保存的IP不一样的话则触发PublicIpChanged事件:
IPublicIPNotifyReceiver实现 可以用短信、邮件等等需要的方式响应IP改变事件,这里用邮件做例子:
//设置邮件的标题 //设置邮件的发件人 //Pass:如果不想显示自己的邮箱地址,这里可以填符合mail格式的任意名称,真正发mail的用户不在这里设定,这个仅仅只做显示用 //设置邮件的收件人 //设置邮件的内容 //设置邮件的格式 //设置邮件的发送级别 //设置用于 SMTP 事务的主机的名称,填IP地址也可以了 //设置用于 SMTP 事务的端口,默认的是 25 //这里才是真正的邮箱登陆名和密码,比如我的邮箱地址是 hbgx@hotmail, 我的用户名为 hbgx ,我的密码是 xgbh
//都定义完了,正式发送了,很是简单吧!
在EmailNotifyReceiver的构造函数里,程序从EmailNotifyReceiverAddress.config里读取需要接收通知的邮件地址(用,隔开)。然后在OnPublicIPChanged里尝试给他们发邮件。
程序入口 现在已经可以实现我们需要的功能了,我们可以把IPublicIPMonitor的实现放在一个Windows服务里,然后在其OnStart方法里添加下面代码:
ImplementsLoader类 在上面的代码里有这样一个方法ImplementsLoader.LoadImplementsOf<IPublicIPNotifyReceiver>()。它的作用是获取程序所在目录所有的IPublicIPNotifyReceiver的实现。这样当我们添加一个新的接收者的时候不需要改现有代码,只要实现IPublicIPNotifyReceiver接口,然后把这个dll复制到程序目录下就可以了。
一些改进想法 在程序入口里创建IPublicIPMonitor实例的时候,可以用ioc或者读取配置文件等方式。还有EmailNotifyReceiver在代码里写发送者的邮箱密码也不太好,可以放到配置文件里并做加密。。。
本站技术原创栏目文章均为中睿原创或编译,转载请注明:文章来自中睿,本站保留追究责任的权利。