Homegrown Dynamic IP Tracking

I often need to remotely access my home computer. Since dynamic DNS services are not always available to me, I needed a way to be notified when my ISP issued a new IP address. The first task was to choose one of the many services that happily provide your public address. The ideal candidate would be one that gives a relatively easy to parse response. After a bit of searching, I found that the nice folks over at [http://dyndns.org](http://dyndns.org/) offer just that with [http://checkip.dyndns.org](http://checkip.dyndns.org/) The .Net WebClient provides an easy means to retrieve the response: ```csharp var client = new WebClient(); var response = client.DownloadString("http://checkip.dyndns.org"); ``` After a bit of simple parsing, we have our public IP address: ```csharp const string startToken = "Current IP Address: "; var startIndex = response.IndexOf(startToken); startIndex += startToken.Length; var endIndex = response.IndexOf(""); var ip = response.Substring(startIndex, endIndex - startIndex); ``` Now that we have the public IP address, notification becomes a task for the .Net SmtpClient. Using email as the notification method certainly isn’t the only solution, but has the benefit of being private. For this particular project, I’m using an App.config to populate properties of the SmtpClient. ```csharp var appSettings = ConfigurationManager.AppSettings; var email = Convert.ToString(appSettings["EmailAddress"]); var displayName = Convert.ToString(appSettings["DisplayName"]); var fromAddress = new MailAddress(email, displayName); var toAddress = new MailAddress(email, displayName); var fromPassword = Convert.ToString(appSettings["EmailPassword"]); var smtp = new SmtpClient { Host = Convert.ToString(appSettings["EmailHost"]), Port = Convert.ToInt32(appSettings["EmailPort"]), EnableSsl = Convert.ToBoolean(appSettings["EnableSsl"]), DeliveryMethod = SmtpDeliveryMethod.Network, UseDefaultCredentials = false, Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
}; ``` And now, sending the message is simply a matter of constructing a .Net MailMessage and passing it to the SmtpClient Send method. ```csharp var subject = "Current Home IP Address: " + ip; var body = subject; using (var message = new MailMessage(fromAddress, toAddress) { Subject = subject, Body = body }) { smtp.Send(message); } ``` It is certainly feasible to schedule a daily task for this to run, but I decided to wrap it into a service so notification emails are only sent if the public IP changes. The entire project can be found in our brand new github repository linked below. [https://github.com/yojimbocorp/blog-posts](https://github.com/yojimbocorp/blog-posts)