<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>SlickThought.Net</title>
    <description>Thoughts, rants and a few useful tidbits</description>
    <link>http://www.slickthought.net/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.5.0.7</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://www.slickthought.net/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd?format=rss</blogChannel:blink>
    <dc:title>SlickThought.Net</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Slickthought" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Cool .NET Development Contest – Galapagos Islands</title>
      <description>&lt;p&gt;Check out this &lt;a href="http://www.mydotnetstory.com/submit.aspx"&gt;great new contest&lt;/a&gt; and your chance to win a &lt;strong&gt;12-Day Galapagos Islands Adventure&lt;/strong&gt; or a &lt;strong&gt;Smart Car&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/jj9w13oByfs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/jj9w13oByfs/post.aspx</link>
      <author>jab</author>
      <comments>http://www.slickthought.net/post/2009/11/07/Cool-NET-Development-Contest-e28093-Galapagos-Islands.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=93071a91-9c55-4789-88b7-7c380b36dc61</guid>
      <pubDate>Sat, 07 Nov 2009 01:16:48 -1400</pubDate>
      <category>Headlines</category>
      <dc:publisher>jab</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=93071a91-9c55-4789-88b7-7c380b36dc61</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=93071a91-9c55-4789-88b7-7c380b36dc61</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/11/07/Cool-NET-Development-Contest-e28093-Galapagos-Islands.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=93071a91-9c55-4789-88b7-7c380b36dc61</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=93071a91-9c55-4789-88b7-7c380b36dc61</feedburner:origLink></item>
    <item>
      <title>Peer to Peer Presentation from Code Camp Available</title>
      <description>&lt;p&gt;For those of you that want the Code Camp presentation, you can &lt;a href="http://slickthought.net/tracker.aspx?file=download\P2P.zip"&gt;get it here&lt;/a&gt;.&amp;#160; The code can be &lt;a href="http://slickthought.net/tracker.aspx?file=download\PeertoPeer.zip"&gt;downloaded here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/-96yVlsoR98" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/-96yVlsoR98/post.aspx</link>
      <author>jab</author>
      <comments>http://www.slickthought.net/post/2009/10/27/Peer-to-Peer-Presentation-from-Code-Camp-Available.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=8764bdd6-6174-40f5-835d-e3343534332d</guid>
      <pubDate>Tue, 27 Oct 2009 01:01:01 -1400</pubDate>
      <category>Peer2Peer</category>
      <dc:publisher>jab</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=8764bdd6-6174-40f5-835d-e3343534332d</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=8764bdd6-6174-40f5-835d-e3343534332d</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/10/27/Peer-to-Peer-Presentation-from-Code-Camp-Available.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=8764bdd6-6174-40f5-835d-e3343534332d</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=8764bdd6-6174-40f5-835d-e3343534332d</feedburner:origLink></item>
    <item>
      <title>Update to the Azure Storage App</title>
      <description>&lt;p&gt;Just a quick update to the Azure Storage app… added support for both Win 7 folder dialogs and older Windows as well.&amp;#160; Still not perfect by any stretch of the imagination, but slightly better. I would like to try and add drag and drop support and provide a progress indicator for larger files when uploading.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.slickthought.net/tracker.aspx?file=download\azurestorageapp.zip"&gt;Download Here&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/z2BFIIwKVO4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/z2BFIIwKVO4/post.aspx</link>
      <author>jab</author>
      <comments>http://www.slickthought.net/post/2009/10/20/Update-to-the-Azure-Storage-App.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=69e79d8f-4dde-41f1-bc59-c5b0b1579672</guid>
      <pubDate>Tue, 20 Oct 2009 08:03:07 -1400</pubDate>
      <category>Azure</category>
      <dc:publisher>jab</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=69e79d8f-4dde-41f1-bc59-c5b0b1579672</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=69e79d8f-4dde-41f1-bc59-c5b0b1579672</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/10/20/Update-to-the-Azure-Storage-App.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=69e79d8f-4dde-41f1-bc59-c5b0b1579672</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=69e79d8f-4dde-41f1-bc59-c5b0b1579672</feedburner:origLink></item>
    <item>
      <title>Spaghetti Code Podcast with Adam Grocholski</title>
      <description>&lt;p&gt;Spaghetti Code talks with Adam Grocholski&amp;#160; about the Text Template Transformation Toolkit, or T4.&amp;#160; Adam walks us through what T4 is, how it works, and how you can use it in your own software projects.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;li&gt;Direct Download - &lt;a href="http://slickthought.net/tracker.aspx?file=spaghetticode\podcast\spaghetticode-T4.mp3"&gt;click here&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;Subscribe - &lt;a href="http://feeds2.feedburner.com/SpaghettiCodePodcasts"&gt;click here&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;iTunes - &lt;a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=276543733"&gt;click here&lt;/a&gt;&lt;/li&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/2mFWPooUi1I" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/2mFWPooUi1I/post.aspx</link>
      <author>jab</author>
      <comments>http://www.slickthought.net/post/2009/10/19/Spaghetti-Code-Podcast-with-Adam-Grocholski.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=5bf65bf2-7bb5-4776-aa27-9ca828fbfbb1</guid>
      <pubDate>Mon, 19 Oct 2009 02:54:18 -1400</pubDate>
      <category>SpaghettiCode</category>
      <dc:publisher>jab</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=5bf65bf2-7bb5-4776-aa27-9ca828fbfbb1</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=5bf65bf2-7bb5-4776-aa27-9ca828fbfbb1</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/10/19/Spaghetti-Code-Podcast-with-Adam-Grocholski.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=5bf65bf2-7bb5-4776-aa27-9ca828fbfbb1</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=5bf65bf2-7bb5-4776-aa27-9ca828fbfbb1</feedburner:origLink></item>
    <item>
      <title>Quick Azure Storage Application</title>
      <description>&lt;p&gt;I had need to demo some Azure blob storage stuff to a customer the other day.&amp;#160; &lt;a href="http://www.slickthought.net/tracker.aspx?file=download\azurestorageapp.zip"&gt;This is what I churned out&lt;/a&gt;.&amp;#160; Quick and dirty, incomplete testing, and probably some design flaws, but it gets the point across. ;-)&lt;/p&gt;  &lt;p&gt;To use the sample, you need to modify the &lt;em&gt;DemoAuthorizationService.cs&lt;/em&gt; file to include your real Azure account and token information, or change it to use the local devstore account and key (though you&amp;#160; will need to modify the &lt;em&gt;DemoAuthToken.cs&lt;/em&gt; file to return the right Uri – like I said, some stuff that needed to be cleaned up).&lt;/p&gt;  &lt;p&gt;Oh, and I did some wonky stuff with the WPF interface as well as far as styling some buttons go – better way to do what I did – but I was learning styling as I went and just banged out something that worked.&amp;#160; Having said all that, not a bad example of MVVM/MVP/whatever you want to call it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.slickthought.net/tracker.aspx?file=download\azurestorageapp.zip"&gt;Download here&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/OtML6Rp_BQc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/OtML6Rp_BQc/post.aspx</link>
      <author>jab</author>
      <comments>http://www.slickthought.net/post/2009/10/12/Quick-Azure-Storage-Application.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=990fd748-4b7c-4955-820a-fd2e8559e391</guid>
      <pubDate>Mon, 12 Oct 2009 03:00:42 -1400</pubDate>
      <category>Azure</category>
      <dc:publisher>jab</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=990fd748-4b7c-4955-820a-fd2e8559e391</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=990fd748-4b7c-4955-820a-fd2e8559e391</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/10/12/Quick-Azure-Storage-Application.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=990fd748-4b7c-4955-820a-fd2e8559e391</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=990fd748-4b7c-4955-820a-fd2e8559e391</feedburner:origLink></item>
    <item>
      <title>Peer to Peer Series Part 5: Connecting Peers via WCF</title>
      <description>&lt;p&gt;In Part 5 of the Peer to Peer Series, I show a sample application that uses PNRP to connect a client application to a server application using WCF and PNRP Peer Host Names. The details of the actual WCF Service implementation.&amp;nbsp; Instead, I will focus on those areas of leveraging PNRP to establish connections via WCF.&lt;/p&gt;
&lt;p&gt;The video will show a sample application that is comprised of a client and a server application.&amp;nbsp; You could use a more &amp;ldquo;peer-to-peer&amp;rdquo; duplex-style of communication, but the client-server arrangement makes the two key parts of establishing a WCF connection easier to explain.&lt;/p&gt;
&lt;p&gt;When hosting a WCF service, the key code from the &lt;em&gt;IntelServiceHost.cs&lt;/em&gt; file is shown below:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.PeerRegistration.Start(peerClassifier, port);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;Uri tcpUri = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Uri(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;"net.tcp://{0}:{1}/IntelService"&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.PeerRegistration.PeerUri, port));&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;_serviceHost = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ServiceHost(service, tcpUri);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;NetTcpBinding tcpBinding = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NetTcpBinding(SecurityMode.None);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;_serviceHost.AddServiceEndpoint(&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;(IIntelService), tcpBinding, &lt;span style="color: #006080"&gt;""&lt;/span&gt;);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The PeerRegistration property exposes a wrapper class around the PNRP API.&amp;nbsp; The &lt;em&gt;Start&lt;/em&gt; method registers the application with a given peer classifier and port as an unsecure peer name in the Global PNRP Cloud.&amp;nbsp; The &lt;em&gt;PeerUri&lt;/em&gt; property passes back the &lt;em&gt;peerhostname.&amp;nbsp; &lt;/em&gt;That uri is used to setup a new Uri, along with the port, that is then used to configure the ServiceHost using a NetTcpBinding.&amp;nbsp; Some of this could have been configured in the application&amp;rsquo;s config file, but I put it all here so you can see how the different parts relate.&lt;/p&gt;
&lt;p&gt;The client side of the equation is even easier (found in the &lt;em&gt;IntelClient.cs&lt;/em&gt; file):&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;PeerNameResult peerRecord = PeerResolution.ResolveHostName(hostPeerName);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;System.ServiceModel.Channels.Binding netBinding = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; NetTcpBinding(SecurityMode.None);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;EndpointAddress endpointAddress = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; EndpointAddress(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;"net.tcp://{0}:{1}/IntelService"&lt;/span&gt;, peerRecord.Uri, peerRecord.Port));&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;IntelServiceProxy = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; IntelProxy(netBinding, endpointAddress);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;em&gt;PeerResolution&lt;/em&gt; class is another wrapper around the PNRP API, this time providing resolving a given unsecure peer name in the Global PNRP cloud.&amp;nbsp; It returns an object containing the remote peer&amp;rsquo;s &lt;em&gt;peerhostname&lt;/em&gt; and port. The rest of the code is just setting up the client side of the WCF connection.&lt;/p&gt;
&lt;p&gt;Other documentation for PNRP:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/netframework/aa663324.aspx"&gt;Windows Communication Foundation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.net.peertopeer.aspx"&gt;System.Net.PeerToPeer Namespace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.leastprivilege.com/P2PAndWCFRegisteringAService.aspx"&gt;P2P Registration Article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb726971.aspx"&gt;Peer Name Resolution Protocol&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;View the Screencast:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://slickthought.net/tracker.aspx?file=TV\PeerToPeer\Peer-Part5.wmv"&gt;Direct Download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://www.youtube.com/watch?v=4TauQ-PsmQ4&amp;amp;via=PeerPart5"&gt;YouTube Part A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://www.youtube.com/watch?v=vDjTxEWyVR8&amp;amp;via=PeerPart5"&gt;YouTube Part B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/3/9/9/6/9/4/PeerPart5_Zune_ch9.wmv"&gt;Zune&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/3/9/9/6/9/4/PeerPart5_ch9.mp4"&gt;iPod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/3/9/9/6/9/4/PeerPart5_ch9.mp3"&gt;Mp3 Audio&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=download\peertopeer.zip"&gt;Download the Demo Code&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/MShv3GR73CM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/MShv3GR73CM/post.aspx</link>
      <author>JAB</author>
      <comments>http://www.slickthought.net/post/2009/10/08/Peer-to-Peer-Series-Part-5-Connecting-Peers-via-WCF.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=acdda077-ac7f-4e8a-bbba-681c4407ab7a</guid>
      <pubDate>Thu, 08 Oct 2009 03:48:00 -1400</pubDate>
      <category>Peer2Peer</category>
      <dc:publisher>JAB</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=acdda077-ac7f-4e8a-bbba-681c4407ab7a</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=acdda077-ac7f-4e8a-bbba-681c4407ab7a</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/10/08/Peer-to-Peer-Series-Part-5-Connecting-Peers-via-WCF.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=acdda077-ac7f-4e8a-bbba-681c4407ab7a</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=acdda077-ac7f-4e8a-bbba-681c4407ab7a</feedburner:origLink></item>
    <item>
      <title>Special Edition Spaghetti Code Podcast on the PHP Bridge</title>
      <description>&lt;p&gt;Spaghetti Code teams up with the &lt;a href="http://www.thirstydeveloper.com/"&gt;Thirsty Developer&lt;/a&gt;podcast to conduct a special edition, joint interview of Claudio Caldato, Senior Program Manager for Microsoft’s Interoperability Team.&amp;#160; Thirsty Developer Host Dave Bost and I talk to Claudio about his team, what they do, and more specifically about the recently released PHP Bridge to ADO.NET Data Services.&amp;#160; &lt;/p&gt;  &lt;p&gt;You can get more information on the PHP Bridge from these locations:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://phpdataservices.codeplex.com/"&gt;CodePlex Home of PHP Bridge&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/interoperability/archive/2009/08/21/a-new-bridge-for-php-developers-to-net-through-rest-php-toolkit-for-ado-net-data-services.aspx"&gt;Interop @ Microsoft&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://community.phpmagazine.net/2009/08/php-toolkit-for-adonet-data-se.html"&gt;PHP Community Magazine Overview&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;li&gt;Direct Download - &lt;a href="http://slickthought.net/tracker.aspx?file=spaghetticode\podcast\spaghetticode-PHPBridge.mp3"&gt;click here&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;Subscribe - &lt;a href="http://feeds2.feedburner.com/SpaghettiCodePodcasts"&gt;click here&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;iTunes - &lt;a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=276543733"&gt;click here&lt;/a&gt;&lt;/li&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/1F8pbXPF0ss" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/1F8pbXPF0ss/post.aspx</link>
      <author>jab</author>
      <comments>http://www.slickthought.net/post/2009/10/07/Special-Edition-Spaghetti-Code-Podcast-on-the-PHP-Bridge.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=1e764b8a-3e58-4c38-8d35-4c8881f09490</guid>
      <pubDate>Wed, 07 Oct 2009 00:18:59 -1400</pubDate>
      <category>SpaghettiCode</category>
      <dc:publisher>jab</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=1e764b8a-3e58-4c38-8d35-4c8881f09490</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=1e764b8a-3e58-4c38-8d35-4c8881f09490</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/10/07/Special-Edition-Spaghetti-Code-Podcast-on-the-PHP-Bridge.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=1e764b8a-3e58-4c38-8d35-4c8881f09490</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=1e764b8a-3e58-4c38-8d35-4c8881f09490</feedburner:origLink></item>
    <item>
      <title>Making Windows Friendly for .NET Developers</title>
      <description>&lt;p&gt;I know… it does seem odd that I would have a title of saying that Windows needs to be friendly to .NET developers.&amp;#160; Considering that .NET is &lt;u&gt;THE&lt;/u&gt; development environment for Windows (no offense to my C++ or Mono friends), it seems a strange that I would have some “complaints” about Windows not being friendly towards .NET developers.&amp;#160; But it’s true.&lt;/p&gt;  &lt;p&gt;It is not that Windows isn’t a good platform to develop on. Quite the contrary.&amp;#160; Great tools, lots of great OS features that are readily accessible, etc.&amp;#160; The problem is that the Windows team sometimes forgets that the vast majority of Windows development is now done in .NET.&amp;#160; I am sure many of you read that and said, “Duh! Of course.”&amp;#160; So what am I talking about?&lt;/p&gt;  &lt;p&gt;As you start getting into the back corners of the operating system, it suddenly feels like some Microsoft teams have never heard of .NET.&amp;#160; Example?&amp;#160; Windows Firewall.&amp;#160; I have been writing some peer-to-peer stuff and it would be nice to be able to set some firewall rules when an app is installed, or better yet, prompt the user at runtime to change the rules and dynamically set them.&amp;#160; Can you do that?&amp;#160; Sure, if you are writing in C++ or want to use a COM object and wrap it with .NET.&amp;#160; There is no .NET implementation out of the box.&amp;#160; Talk about a pain in the ass!&amp;#160; I have spent enough time playing with p/invoke and COM wrappers to know that I don’t want to go there unless absolutely necessary.&lt;/p&gt;  &lt;p&gt;Peer to peer is another example.&amp;#160; Great team – good guys on it.&amp;#160; They have been fantastic helping me work my way through my learning.&amp;#160;&amp;#160; The problem is, some of the coolest parts of their stack do not have a managed implementation.&amp;#160; Distributed routing tables? Absolutely wicked stuff but C++ only.&amp;#160; Peer Groups; C++ only. Peer Graphs; C++ only.&amp;#160; Double argghhh!&lt;/p&gt;  &lt;p&gt;Even with the release of Windows 7, the problem continues.&amp;#160; The &lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack#"&gt;Windows API Code Pack&lt;/a&gt; certainly helped expose some of the new Win 7 features, but still no Windows Firewall support.&amp;#160; Peer to peer still missing.&amp;#160; Some other APIs are still native only.&amp;#160; Considering that .NET has been around for quite a while now, you would think that 100% of the Windows API would be covered with managed implementations by now.&lt;/p&gt;  &lt;p&gt;Some day, my friends, some day….&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/nOzkO9YreQA" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/nOzkO9YreQA/post.aspx</link>
      <author>jab</author>
      <comments>http://www.slickthought.net/post/2009/10/06/Making-Windows-Friendly-for-NET-Developers.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=b7401f0e-bf7d-48df-b586-b3aa20f2a332</guid>
      <pubDate>Tue, 06 Oct 2009 02:44:37 -1400</pubDate>
      <category>Rant</category>
      <dc:publisher>jab</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=b7401f0e-bf7d-48df-b586-b3aa20f2a332</pingback:target>
      <slash:comments>8</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=b7401f0e-bf7d-48df-b586-b3aa20f2a332</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/10/06/Making-Windows-Friendly-for-NET-Developers.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=b7401f0e-bf7d-48df-b586-b3aa20f2a332</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=b7401f0e-bf7d-48df-b586-b3aa20f2a332</feedburner:origLink></item>
    <item>
      <title>Real World Azure Online Live Event - Tuesday, September 29th</title>
      <description>&lt;p&gt;If you will not be able to make it to one of the local Read World Azure events (like this one in Minneapolis), there will be an online delivery of the event on Tuesday, September 29th.&amp;#160; The details of the event are the same as the in-person events:&lt;/p&gt;  &lt;p&gt;TechNet &amp;amp; MSDN Events Present: &lt;/p&gt;  &lt;p&gt;Real World Azure &lt;/p&gt;  &lt;p&gt;We invite you to explore Windows Azure™ – Microsoft’s platform for building and deploying cloud based applications – from a real world point of view!&lt;/p&gt;  &lt;p&gt;During this event, we’ll review critical lessons Microsoft IT has learned migrating internal line-of-business applications to Windows Azure™.&lt;/p&gt;  &lt;p&gt;What is Windows Azure™? When should I use it? How does it apply to my job?&amp;#160; Whether you’re an IT Professional, Developer or Architect, we’ll address your top of mind questions about cloud computing.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;TechNet Events Presents – for the IT Professional from 8:30am to noon&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In this session, we will discuss: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Azure architecture from the IT professional’s point of view&lt;/li&gt;    &lt;li&gt;Why an IT operations team would want to pursue Azure as an extension to the data center&lt;/li&gt;    &lt;li&gt;Configuration, deployment and scaling Azure-based applications&lt;/li&gt;    &lt;li&gt;The Azure roles (web, web service and worker)&lt;/li&gt;    &lt;li&gt;Azure storage options&lt;/li&gt;    &lt;li&gt;Azure security and identity options&lt;/li&gt;    &lt;li&gt;How Azure-based applications can be integrated with on-premises applications&lt;/li&gt;    &lt;li&gt;How operations teams can manage and monitor Azure-based applications&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;TechNet LIVE Webcast | &lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032425946&amp;amp;EventCategory=2&amp;amp;culture=en-US&amp;amp;CountryCode=US"&gt;REGISTER &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;MSDN Events Presents – for the Developer &amp;amp; Architect from 1:00pm to 5:00pm&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In this session, we will discuss:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Cloud computing architectures in general and the Azure architecture in particular&lt;/li&gt;    &lt;li&gt;Several aspects of Azure from the developer’s and architect’s perspective&lt;/li&gt;    &lt;li&gt;Azure roles (web, web service and worker)&lt;/li&gt;    &lt;li&gt;Azure storage options&lt;/li&gt;    &lt;li&gt;Azure security and identity options&lt;/li&gt;    &lt;li&gt;How Azure-based applications can be integrated with on-premise applications&lt;/li&gt;    &lt;li&gt;Configuration, deployment and scaling Azure-based applications&lt;/li&gt;    &lt;li&gt;How development teams can optimize their applications for better management and monitoring&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;MSDN LIVE Webcast | &lt;a href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032425948&amp;amp;EventCategory=2&amp;amp;culture=en-US&amp;amp;CountryCode=US"&gt;REGISTER &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/mxvamtc31nQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/mxvamtc31nQ/post.aspx</link>
      <author>jab</author>
      <comments>http://www.slickthought.net/post/2009/09/25/Real-World-Azure-Online-Live-Event-Tuesday-September-29th.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=d520c814-183c-4865-8761-c2c335b294e4</guid>
      <pubDate>Fri, 25 Sep 2009 00:55:46 -1400</pubDate>
      <category>Headlines</category>
      <dc:publisher>jab</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=d520c814-183c-4865-8761-c2c335b294e4</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=d520c814-183c-4865-8761-c2c335b294e4</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/09/25/Real-World-Azure-Online-Live-Event-Tuesday-September-29th.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=d520c814-183c-4865-8761-c2c335b294e4</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=d520c814-183c-4865-8761-c2c335b294e4</feedburner:origLink></item>
    <item>
      <title>Spaghetti Code Podcast with Robert Boedigheimer</title>
      <description>&lt;p&gt;Spaghetti Code Talks with Robert Boedigheimer about some of the things Robert has learned over the years as an ASP.NET developer on a real-world commercial web site.&amp;#160; Robert shares everything from operational settings for IIS to useful programming tips.&amp;#160; Even if you have been doing ASP.NET development for a while, there is sure to be at least one useful nugget in this informative podcast.&lt;/p&gt;  &lt;li&gt;Direct Download - &lt;a href="http://slickthought.net/spaghetticode/podcast/spaghetticode-ASPNETDev.mp3"&gt;click here&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;Subscribe - &lt;a href="http://feeds2.feedburner.com/SpaghettiCodePodcasts"&gt;click here&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;iTunes - &lt;a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=276543733"&gt;click here&lt;/a&gt;&lt;/li&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/9FNRWTH7u04" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/9FNRWTH7u04/post.aspx</link>
      <author>jab</author>
      <comments>http://www.slickthought.net/post/2009/09/20/Spaghetti-Code-Podcast-with-Robert-Boedigheimer.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=125fe990-3f19-43a6-8da9-5a5b7dec9466</guid>
      <pubDate>Sun, 20 Sep 2009 23:09:54 -1400</pubDate>
      <category>SpaghettiCode</category>
      <dc:publisher>jab</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=125fe990-3f19-43a6-8da9-5a5b7dec9466</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=125fe990-3f19-43a6-8da9-5a5b7dec9466</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/09/20/Spaghetti-Code-Podcast-with-Robert-Boedigheimer.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=125fe990-3f19-43a6-8da9-5a5b7dec9466</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=125fe990-3f19-43a6-8da9-5a5b7dec9466</feedburner:origLink></item>
    <item>
      <title>Peer to Peer Series: Sample WPF PNRP Application</title>
      <description>&lt;p&gt;&lt;a href="http://www.slickthought.net/image.axd?picture=PNRP_1.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 20px 20px; display: inline; border-top: 0px; border-right: 0px" title="PNRP" border="0" alt="PNRP" align="right" src="http://www.slickthought.net/image.axd?picture=PNRP_thumb_1.png" width="124" height="114" /&gt;&lt;/a&gt; Building on the examples for the first four installments, I whipped up a little WPF app that uses PNRP.&amp;#160; You can create registrations and look them up.&amp;#160; It is a good example of using the various features of PNRP to form the foundation of a P2P application. I banged this app out pretty quickly so no snarking on things that may be incorrect, designed poorly, whatever.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=download\peertopeer.zip"&gt;Download PeerToPeer Code Here&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/B_GZX5ksAQ8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/B_GZX5ksAQ8/post.aspx</link>
      <author>jab</author>
      <comments>http://www.slickthought.net/post/2009/09/18/Peer-to-Peer-Series-Sample-WPF-PNRP-Application.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=1a82065b-d9d3-47c8-a642-a7b4d9b36a14</guid>
      <pubDate>Fri, 18 Sep 2009 02:52:08 -1400</pubDate>
      <category>Peer2Peer</category>
      <dc:publisher>jab</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=1a82065b-d9d3-47c8-a642-a7b4d9b36a14</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=1a82065b-d9d3-47c8-a642-a7b4d9b36a14</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/09/18/Peer-to-Peer-Series-Sample-WPF-PNRP-Application.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=1a82065b-d9d3-47c8-a642-a7b4d9b36a14</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=1a82065b-d9d3-47c8-a642-a7b4d9b36a14</feedburner:origLink></item>
    <item>
      <title>Peer to Peer Series Part 4: Resolving Peer Names Asynchronously</title>
      <description>&lt;p&gt;In Part 4 of the Peer to Peer Series, I modify the Resolve program to find Peer Names using the asynchronous methods.&amp;nbsp; Below is a very simple example of using the ResolveAsync method:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;PeerNameResolver resolver = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PeerNameResolver();&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;    resolver.ResolveCompleted += &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; EventHandler&amp;lt;ResolveCompletedEventArgs&amp;gt;(resolver_ResolveCompleted);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;    resolver.ResolveAsync(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PeerName(classifier, PeerNameType.Secured), Guid.NewGuid());&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (PeerToPeerException ex)&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;    &lt;span style="color: #008000"&gt;// There are other standard exceptions you can also catch - see docs&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;"PeerToPeer Excpetion: {0)"&lt;/span&gt;, ex.Message);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; resolver_ResolveCompleted(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; sender, ResolveCompletedEventArgs e)&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (!e.Cancelled &amp;amp;&amp;amp; e.Error == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; e.PeerNameRecordCollection != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;        records = e.PeerNameRecordCollection;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;        DisplayResults();&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;}&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There is also a ResolveProgress event you can also wire up.&amp;nbsp; As the name implies, it will fire periodically to indicate the progress being made in resolving the Peer Name.&amp;nbsp; It was not overly useful when resolving a Peer Name that had a small number of results, but your mileage may vary.&lt;/p&gt;
&lt;p&gt;The one thing that is also a &amp;ldquo;brute force&amp;rdquo; implementation in the demo code is how I pass a Guid.NewGuid() into the ResolveAsync method.&amp;nbsp; The Guid is being used as the UserState parameter in the method, and can actually be any Object. In a real implementation where you may have multiple ResovleAsync requests in-flight at any one time, you would want to implement a tracking system using this UserState parameter so&amp;nbsp; you could match up the corresponding ResolveCompleted event with the correct initiating request.&amp;nbsp; The ResolveCompleteEventArgs parameter contains the UserState used to initiate the request, so the matching is pretty straightforward.&amp;nbsp; I did not go the extra mile and implement that since the demo only fired a single ResolveAsync request.&amp;nbsp; You cannot pass in a null UserState object, so I went with a simple Guid for no particularly good reason.&lt;/p&gt;
&lt;p&gt;Other documentation for PNRP:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.net.peertopeer.aspx"&gt;System.Net.PeerToPeer Namespace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.leastprivilege.com/P2PAndWCFRegisteringAService.aspx"&gt;P2P Registration Article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb726971.aspx"&gt;Peer Name Resolution Protocol&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;View the Screencast:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=TV\PeerToPeer\Peer-Part4.wmv"&gt;Direct Download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://www.youtube.com/watch?v=h-B5ZLFfpW0&amp;amp;via=PeerPart4"&gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/7/7/4/2/9/4/PeerPart4_Zune_ch9.wmv"&gt;Zune&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/7/7/4/2/9/4/PeerPart4_ch9.mp4"&gt;iPod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/7/7/4/2/9/4/PeerPart4_ch9.mp3"&gt;Mp3 Audio&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=download\peertopeer.zip"&gt;Download the Demo Code&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/u8cT07DmFWI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/u8cT07DmFWI/post.aspx</link>
      <author>JAB</author>
      <comments>http://www.slickthought.net/post/2009/09/16/Peer-to-Peer-Series-Part-4-Resolving-Peer-Names-Asynchronously.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=930656c4-f6c4-4a9a-a33d-86f2aca3b34e</guid>
      <pubDate>Wed, 16 Sep 2009 01:08:00 -1400</pubDate>
      <category>Peer2Peer</category>
      <dc:publisher>JAB</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=930656c4-f6c4-4a9a-a33d-86f2aca3b34e</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=930656c4-f6c4-4a9a-a33d-86f2aca3b34e</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/09/16/Peer-to-Peer-Series-Part-4-Resolving-Peer-Names-Asynchronously.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=930656c4-f6c4-4a9a-a33d-86f2aca3b34e</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=930656c4-f6c4-4a9a-a33d-86f2aca3b34e</feedburner:origLink></item>
    <item>
      <title>Peer to Peer Series Part 3: Resolving Names Synchronously with the PNRP API</title>
      <description>&lt;p&gt;In Part 3 of the Peer to Peer Series, I add another Command Prompt application to the demo solution and use the PNRP API to resolve a Peer Name using C#.&amp;nbsp; As with registering a Peer Name, resolving Peer Names is straightforward:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&lt;p&gt;PeerNameResolver resolver = new PeerNameResolver();&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;    records = resolver.Resolve(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PeerName(classifier, PeerNameType.Unsecured));&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (records.Count &amp;gt; 0)&lt;br /&gt;       {&lt;br /&gt;           &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var record &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; records)&lt;br /&gt;           {&lt;br /&gt;               Console.WriteLine(&lt;span style="color: #006080"&gt;"***Peer: {0},record.PeerName.ToString());&lt;br /&gt;               Console.Writeline("&lt;/span&gt;***Host Name: {0}, record.PeerName.PeerHostName);&lt;br /&gt;               Console.Writeline(&lt;span style="color: #006080"&gt;"***Comment: {0}"&lt;/span&gt;, record.Comment);&lt;br /&gt;               &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var endpoint &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; record.EndPointCollection)&lt;br /&gt;                   Console.WriteLine(&lt;span style="color: #006080"&gt;"\tEndpoint: {0}, Port: {1}"&lt;/span&gt;, endpoint.Address.ToString(), endpoint.Port);&lt;br /&gt;    &lt;br /&gt;               Console.WriteLine();&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (PeerToPeerException ex)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #008000"&gt;//Other standard execptions can also be caught&lt;/span&gt;&lt;br /&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;"PeerToPeer Excpetion: {0)"&lt;/span&gt;, ex.Message);&lt;br /&gt;}&lt;/p&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;One of the interesting things about resolving a Peer Name is that the resulting PeerNameRecords include the endpoint information for each of the Peer Names found.&amp;nbsp; This means you can establish direct connections with those peers if necessary.&amp;nbsp; I will show how to do just that in an upcoming screencast.&amp;nbsp; Of course, that assumes we don&amp;rsquo;t have any firewalls or other types of security blockades preventing direct communication.&lt;/p&gt;
&lt;p&gt;The example in this installment is done synchronously.&amp;nbsp; In the next screencast, I will show you how you can do the same operation asynchronously.&amp;nbsp; This is useful because the Resolve method can take quite a while to return so your program&amp;rsquo;s execution is blocked while waiting for the method to complete.&amp;nbsp; This is especially bad in the case of GUI applications since the app will become non-responsive while waiting for Resolve to finish.&lt;/p&gt;
&lt;p&gt;Other documentation for PNRP:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.net.peertopeer.aspx"&gt;System.Net.PeerToPeer Namespace&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.leastprivilege.com/P2PAndWCFRegisteringAService.aspx"&gt;P2P Registration Article&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb726971.aspx"&gt;Peer Name Resolution Protocol&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;View the Screencast:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=TV\PeerToPeer\Peer-Part3.wmv"&gt;Direct Download&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=xguPr6tPclU"&gt;YouTube&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/6/7/4/2/9/4/PeerPart3_Zune_ch9.wmv"&gt;Zune&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/6/7/4/2/9/4/PeerPart3_ch9.mp4"&gt;iPod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/6/7/4/2/9/4/PeerPart3_ch9.mp3"&gt;Mp3 Audio&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=download\peertopeer.zip"&gt;Download the Demo Code&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/J7Yj2_liH3U" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/J7Yj2_liH3U/post.aspx</link>
      <author>JAB</author>
      <comments>http://www.slickthought.net/post/2009/09/16/Peer-to-Peer-Series-Part-3-Resolving-Names-Synchronously-with-the-PNRP-API.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=b611d746-7d5f-4188-9243-eb2e60fd615f</guid>
      <pubDate>Wed, 16 Sep 2009 00:29:00 -1400</pubDate>
      <category>Peer2Peer</category>
      <dc:publisher>JAB</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=b611d746-7d5f-4188-9243-eb2e60fd615f</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=b611d746-7d5f-4188-9243-eb2e60fd615f</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/09/16/Peer-to-Peer-Series-Part-3-Resolving-Names-Synchronously-with-the-PNRP-API.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=b611d746-7d5f-4188-9243-eb2e60fd615f</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=b611d746-7d5f-4188-9243-eb2e60fd615f</feedburner:origLink></item>
    <item>
      <title>Peer to Peer Series Part 2: Registering Names with PNRP API</title>
      <description>&lt;p&gt;In Part Two of the Peer to Peer Screencast series by SlickThought Productions, we look at using C# and the PNRP API to register a peer name.&amp;nbsp; This example uses a simple Command Prompt application to register the Peer Name, but the same techniques can be used to register a Peer Name from a WinForm or WPF application.&amp;nbsp; It could even be used inside a Windows Service which opens up some interesting scenarios as well.&lt;/p&gt;
&lt;p&gt;Using the API is very simple.&amp;nbsp; Here is the main code section from the demo:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;PeerName peerName = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PeerName(classifier, PeerNameType.Secured);&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (PeerNameRegistration registration = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; PeerNameRegistration(peerName, 8080))&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;{&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;    &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;        registration.Start();&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;        &lt;span style="color: #008000"&gt;// Do stuff&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;        registration.Stop();&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;    &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (PeerToPeerException ex)&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;    {&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;        &lt;span style="color: #008000"&gt;// There are other possible statndard exceptions to catch &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;        &lt;span style="color: #008000"&gt;// See documentation on for details&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;
&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;    }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pretty straightforward.&amp;nbsp; One of the interesting things you can do with a Peer Name is add a Comment and Data to the registration.&amp;nbsp; Doing so is straightforward:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"&gt;registration.Comment = &lt;span style="color: #006080"&gt;"My Comment"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;UnicodeEncoding encoder = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; UnicodeEncoding();&lt;br /&gt;&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] data = encoder.GetBytes(&lt;span style="color: #006080"&gt;"Some Data"&lt;/span&gt;);&lt;br /&gt;registration.Data = data;&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;In the snippet above, I am adding a simple string to the Comment property.&amp;nbsp; For the Data property, I am converting a simple string to an array of bytes and passing that to the property.&amp;nbsp; In the case of the Data property, you can pass in any byte array you want, so instead of a string I could have passed in an image, a data blob, whatever.&amp;nbsp; In the case of the Comment property, you are limited to 39 Unicode characters, and the Data property is limited to 4,096 bytes.&lt;/p&gt;
&lt;p&gt;The important thing to remember when working with PNRP and registering a Peer Name is that the process that called the Start method must remain open.&amp;nbsp; As soon as that process shuts down, the Peer Name registration is lost.&lt;/p&gt;
&lt;p&gt;Other documentation for PNRP:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.net.peertopeer.aspx"&gt;System.Net.PeerToPeer Namespace&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.leastprivilege.com/P2PAndWCFRegisteringAService.aspx"&gt;P2P Registration Article&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb726971.aspx"&gt;Peer Name Resolution Protocol&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;View the Screencast:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=TV\PeerToPeer\Peer-Part2.wmv"&gt;Direct Download&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=7bQ7Bz0MDrI"&gt;YouTube&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/5/7/4/2/9/4/PeerPart2_Zune_ch9.wmv"&gt;Zune&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/5/7/4/2/9/4/PeerPart2_ch9.mp4"&gt;iPod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/5/7/4/2/9/4/PeerPart2_ch9.mp3"&gt;Mp3 Audio&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=download\peertopeer.zip"&gt;Download the Demo Code&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/YolKMh0XKgQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/YolKMh0XKgQ/post.aspx</link>
      <author>JAB</author>
      <comments>http://www.slickthought.net/post/2009/09/15/Peer-to-Peer-Series-Part-2-Registering-Names-with-PNRP-API.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=b962908a-c6a5-4350-864c-30dcdebbf44d</guid>
      <pubDate>Tue, 15 Sep 2009 04:59:00 -1400</pubDate>
      <category>Peer2Peer</category>
      <dc:publisher>JAB</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=b962908a-c6a5-4350-864c-30dcdebbf44d</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=b962908a-c6a5-4350-864c-30dcdebbf44d</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/09/15/Peer-to-Peer-Series-Part-2-Registering-Names-with-PNRP-API.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=b962908a-c6a5-4350-864c-30dcdebbf44d</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=b962908a-c6a5-4350-864c-30dcdebbf44d</feedburner:origLink></item>
    <item>
      <title>Peer to Peer Series Part 1: Intro to PNRP</title>
      <description>&lt;p&gt;&lt;a href="http://www.slickthought.net/image.axd?picture=Intro%20to%20PNRP.png"&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 20px 20px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Intro to PNRP" src="http://www.slickthought.net/image.axd?picture=Intro%20to%20PNRP_thumb.png" border="0" alt="Intro to PNRP" width="244" height="184" align="right" /&gt;&lt;/a&gt; This kick-off screencast introduces you to the foundation of Peer-to-Peer applications, PNRP.&amp;nbsp; Peer Name Resolution Protocol is the the underlying mechanism used by applications to discover peers on a network.&amp;nbsp; This can either be a local subnet or the Internet at large.&amp;nbsp; One of the great things about PRNP is that is even works across NAT devices.&lt;/p&gt;
&lt;p&gt;In this screencast, I introduce you some fundamental PNRP concepts and show how you can use the command line to test out the basics.&amp;nbsp; This screencast is not intended to be a deep dive technical exploration.&amp;nbsp; Rather, it lays a sufficient foundation for you to understand what is going on in future screencasts and lets you get started building P2P applications as soon as possible.&lt;/p&gt;
&lt;p&gt;If you are interested in more technical information on PRNP, check out the following links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/p2p/default.aspx"&gt;Peer-to-Peer Team Blog&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb726971.aspx"&gt;Peer Name Resolution Protocol Technical Overview&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/network/bb545868.aspx"&gt;TechNet Windows Peer Networking Home Page&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb457079.aspx"&gt;Introduction to Windows Peer-To-Peer Networking&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/bb457011.aspx"&gt;Teredo Overview&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.microsoft.com/kb/968510"&gt;Firewall Requirements for Coexisting with Teredo&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc772249(WS.10).aspx"&gt;Netsh Commands for P2P Networking&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://social.msdn.microsoft.com/forums/en-US/peertopeer/threads/"&gt;Peer-to-Peer Networking Forum&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can watch the first installment of the P2P series using the links below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=TV\PeerToPeer\Peer-Part1.wmv"&gt;Direct Download&lt;/a&gt; (38.5 MB)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=REvwrHtXM90"&gt;YouTube-Part 1A&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=EbYWicezpYw"&gt;YouTube-Part 1B&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/8/6/4/2/9/4/PeerPart1_Zune_ch9.wmv"&gt;Zune&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/8/6/4/2/9/4/PeerPart1_ch9.mp4"&gt;iPod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slickthought.net/tracker.aspx?file=http://ecn.channel9.msdn.com/o9/ch9/8/6/4/2/9/4/PeerPart1_ch9.mp3"&gt;Mp3 Audio&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/Slickthought/~4/_HBgOBYOjZs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/Slickthought/~3/_HBgOBYOjZs/post.aspx</link>
      <author>JAB</author>
      <comments>http://www.slickthought.net/post/2009/09/15/Peer-to-Peer-Series-Part-1-Intro-to-PNRP.aspx#comment</comments>
      <guid isPermaLink="false">http://www.slickthought.net/post.aspx?id=15272a6f-24d3-4116-8260-83052a60b529</guid>
      <pubDate>Tue, 15 Sep 2009 01:44:00 -1400</pubDate>
      <category>Peer2Peer</category>
      <dc:publisher>JAB</dc:publisher>
      <pingback:server>http://www.slickthought.net/pingback.axd</pingback:server>
      <pingback:target>http://www.slickthought.net/post.aspx?id=15272a6f-24d3-4116-8260-83052a60b529</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.slickthought.net/trackback.axd?id=15272a6f-24d3-4116-8260-83052a60b529</trackback:ping>
      <wfw:comment>http://www.slickthought.net/post/2009/09/15/Peer-to-Peer-Series-Part-1-Intro-to-PNRP.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.slickthought.net/syndication.axd?post=15272a6f-24d3-4116-8260-83052a60b529</wfw:commentRss>
    <feedburner:origLink>http://www.slickthought.net/post.aspx?id=15272a6f-24d3-4116-8260-83052a60b529</feedburner:origLink></item>
  </channel>
</rss>
