<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dirty Trolls &#187; PHP Magic</title>
	<atom:link href="http://www.dirtytrolls.com/categories/php-magic/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dirtytrolls.com</link>
	<description>...random crap from a keyboard</description>
	<lastBuildDate>Mon, 02 Aug 2010 21:51:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1-alpha</generator>
		<item>
		<title>Remote debugging with UDP sockets part 2</title>
		<link>http://www.dirtytrolls.com/2009/03/15/remote-debugging-with-udp-sockets-part-2/</link>
		<comments>http://www.dirtytrolls.com/2009/03/15/remote-debugging-with-udp-sockets-part-2/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 22:55:30 +0000</pubDate>
		<dc:creator>Terry Valladon</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP Magic]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sockets]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[udp]]></category>

		<guid isPermaLink="false">http://www.dirtytrolls.com/?p=211</guid>
		<description><![CDATA[With our last article on debugging PHP with UDP sockets we created a new class able to send debugging information from PHP to a remote netcat client. The limit of the code was that it could only send strings and not arrays or an object. Today we will modify the code to send arrays to [...]]]></description>
			<content:encoded><![CDATA[<a class='entry_img' href='/tags/code'><img src='/assets/post_photos/code.jpg'></a>
<p>With our last article on <a href="/2009/02/11/remote-php-debugging-with-udp-sockets-part-1/">debugging PHP with UDP sockets </a>we created a new class able to send debugging information from PHP to a remote netcat client. The limit of the code was that it could only send strings and not arrays or an object. Today we will modify the code to send arrays to our remote listening client.</p>
<p>First, I will show you what happens if we try to send an array using the UDPDEBUG class that we currently have. To do this we will create a very simple array and then attempt to send it.</p>
<div class='code' class='code'>&nbsp;php&nbsp;(udptest2.phps)&nbsp;<a href='/assets/udptest2.phps'>download</a><pre lang='php'><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?<br />&nbsp;&nbsp;&nbsp;&nbsp;$ThisWeek&nbsp;</span><span style="color: #007700">=&nbsp;array(</span><span style="color: #0000BB">1&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'Monday'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'Tuesday'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'Wednesday'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'Thursday'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'Friday'</span><span style="color: #007700">,&nbsp;&nbsp;</span><span style="color: #DD0000">'Saturday'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'Sunday'</span><span style="color: #007700">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;require_once(</span><span style="color: #DD0000">"UDPDEBUG_CLASS.php"</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$UDPDEBUG&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">UDPDEBUG</span><span style="color: #007700">(</span><span style="color: #DD0000">"127.0.0.1"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">4545</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$UDPDEBUG</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">SEND</span><span style="color: #007700">(</span><span style="color: #0000BB">$ThisWeek</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'LOW'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">TRUE</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;<br /></span>
</span>
</code>
    </pre></div>
<p>This test code results in no useful information other then the fact we are dealing with an array.</p>
<a href='/assets/udp_test2_output.jpg'><img src='/assets/udp_test2_output.jpg'></a>
<p><span id="more-211"></span>What we really want is to output the array in much the way print_f does; nice and formatted for easy viewing. To do this we are going to modify our <em>send</em> function from our UDP class and add in some array checking.</p>
<p>Here is our <em>send</em> function before and after the edit we are going to make:</p>
<div class='code' class='code'>&nbsp;php&nbsp;(udpdebug_send_function_before.phps)&nbsp;<a href='/assets/udpdebug_send_function_before.phps'>download</a><pre lang='php'><code><span style="color: #000000">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;SEND($STRING,&nbsp;$LEVEL&nbsp;=&nbsp;1,&nbsp;$VERBOSE&nbsp;=&nbsp;FALSE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$LEVEL&nbsp;=&nbsp;$this-&gt;LEVEL[$LEVEL];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($VERBOSE&nbsp;==&nbsp;TRUE){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$OUTPUT&nbsp;=&nbsp;sprintf("[%s]:%s:%s%s\n",$this-&gt;ESC_CHR.$this-&gt;ANSI_FG['CYAN'].$this-&gt;PORT,$this-&gt;ESC_CHR.$this-&gt;ANSI_FG[$this-&gt;LEVEL_COLORS[$LEVEL]].str_pad($this-&gt;LEVEL_WORDS[$LEVEL],&nbsp;9),$this-&gt;ESC_CHR.$this-&gt;ANSI_SPECIAL['NORMAL'],&nbsp;$STRING);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$OUTPUT&nbsp;=&nbsp;sprintf("%s\n",$this-&gt;ESC_CHR.$this-&gt;ANSI_FG[$this-&gt;LEVEL_COLORS[$LEVEL]].$STRING.$this-&gt;ESC_CHR.$this-&gt;ANSI_SPECIAL['NORMAL']);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;UPD_OBJECT&nbsp;=&nbsp;fsockopen("udp://"&nbsp;.&nbsp;$this-&gt;IP_ADDRESS,&nbsp;$this-&gt;PORT,&nbsp;$this-&gt;ERR_NO,&nbsp;$this-&gt;ERR_STR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!$this-&gt;UPD_OBJECT)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"ERROR&nbsp;IN&nbsp;UDP&nbsp;SYSTEM:&nbsp;$this-&gt;ERR_NO&nbsp;-&nbsp;$this-&gt;ERR_STR&lt;br&nbsp;/&gt;\n";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite($this-&gt;UPD_OBJECT,&nbsp;$OUTPUT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose($this-&gt;UPD_OBJECT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span>
</code>
    </pre></div> <div class='code' class='code'>&nbsp;php&nbsp;(udpdebug_send_function_after.phps)&nbsp;<a href='/assets/udpdebug_send_function_after.phps'>download</a><pre lang='php'><code><span style="color: #000000">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;SEND($STRING,&nbsp;$LEVEL&nbsp;=&nbsp;1,&nbsp;$VERBOSE&nbsp;=&nbsp;FALSE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$LEVEL&nbsp;=&nbsp;$this-&gt;LEVEL[$LEVEL];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(is_array($STRING))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$STRING&nbsp;=&nbsp;print_r($STRING,&nbsp;true);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($VERBOSE&nbsp;==&nbsp;TRUE){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$OUTPUT&nbsp;=&nbsp;sprintf("[%s]:%s:%s%s\n",$this-&gt;ESC_CHR.$this-&gt;ANSI_FG['CYAN'].$this-&gt;PORT,$this-&gt;ESC_CHR.$this-&gt;ANSI_FG[$this-&gt;LEVEL_COLORS[$LEVEL]].str_pad($this-&gt;LEVEL_WORDS[$LEVEL],&nbsp;9),$this-&gt;ESC_CHR.$this-&gt;ANSI_SPECIAL['NORMAL'],&nbsp;$STRING);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$OUTPUT&nbsp;=&nbsp;sprintf("%s\n",$this-&gt;ESC_CHR.$this-&gt;ANSI_FG[$this-&gt;LEVEL_COLORS[$LEVEL]].$STRING.$this-&gt;ESC_CHR.$this-&gt;ANSI_SPECIAL['NORMAL']);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;UPD_OBJECT&nbsp;=&nbsp;fsockopen("udp://"&nbsp;.&nbsp;$this-&gt;IP_ADDRESS,&nbsp;$this-&gt;PORT,&nbsp;$this-&gt;ERR_NO,&nbsp;$this-&gt;ERR_STR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!$this-&gt;UPD_OBJECT)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"ERROR&nbsp;IN&nbsp;UDP&nbsp;SYSTEM:&nbsp;$this-&gt;ERR_NO&nbsp;-&nbsp;$this-&gt;ERR_STR&lt;br&nbsp;/&gt;\n";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite($this-&gt;UPD_OBJECT,&nbsp;$OUTPUT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose($this-&gt;UPD_OBJECT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /></span>
</code>
    </pre></div>
<p>As you can see, what we added was a simple if clause that will redefine our $STRING as $STRING = print_r($STRING, true) if our passed item is an array.</p>
<div class='article-ad'>
<script type='text/javascript'><!--
google_ad_client = 'pub-0797652291746169';
/* 468x60, created 2/23/08 */
google_ad_slot = '8955222875';
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type='text/javascript'
src='http://pagead2.googlesyndication.com/pagead/show_ads.js'>
</script>
</div>

<p>With this simple modification our test code above now produces some useful output when the passed object is an array.</p>
<a href='/assets/udp_test2_output_fixed.jpg'><img src='/assets/udp_test2_output_fixed.jpg'></a>
<p>This modification will work even with very large and complicated multidimensional arrays.</p>
<p>Till next time, code sexy.<br />
&#8211;Terry Valladon</p>

<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/class' rel='tag' target='_self'>class</a>, <a class='technorati-link' href='http://technorati.com/tag/code' rel='tag' target='_self'>code</a>, <a class='technorati-link' href='http://technorati.com/tag/debugging' rel='tag' target='_self'>debugging</a>, <a class='technorati-link' href='http://technorati.com/tag/php' rel='tag' target='_self'>php</a>, <a class='technorati-link' href='http://technorati.com/tag/sockets' rel='tag' target='_self'>sockets</a>, <a class='technorati-link' href='http://technorati.com/tag/tutorial' rel='tag' target='_self'>tutorial</a>, <a class='technorati-link' href='http://technorati.com/tag/udp' rel='tag' target='_self'>udp</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.dirtytrolls.com/2009/03/15/remote-debugging-with-udp-sockets-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Remote debugging with UDP sockets part 1</title>
		<link>http://www.dirtytrolls.com/2009/02/11/remote-php-debugging-with-udp-sockets-part-1/</link>
		<comments>http://www.dirtytrolls.com/2009/02/11/remote-php-debugging-with-udp-sockets-part-1/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 18:13:32 +0000</pubDate>
		<dc:creator>Terry Valladon</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[PHP Magic]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sockets]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[udp]]></category>

		<guid isPermaLink="false">http://www.dirtytrolls.com/?p=105</guid>
		<description><![CDATA[The nature of Internet applications creates an issue with debugging. For example, how do you debug an application that may be getting hundreds or even thousands of hits every minute? How do you debug this application without sending sensitive data to the user in the form of comments or debug statements that are &#8220;hidden&#8221; for [...]]]></description>
			<content:encoded><![CDATA[<a class='entry_img' href='/tags/code'><img src='/assets/post_photos/code.jpg'></a>
<p>The nature of Internet applications creates an issue with debugging. For example, how do you debug an application that may be getting hundreds or even thousands of hits every minute? How do you debug this application without sending sensitive data to the user in the form of comments or debug statements that are &#8220;hidden&#8221; for only as long as nobody is looking for them? What do you do when you are unable to trigger an error but your user base is, though they lack the knowledge to be of much assistance other then &#8220;I borked it!&#8221;?</p>
<p>There are several new contenders on the debugging scene for <a href='http://www.php.net'>PHP</a> code, the most popular of which is <a href='http://www.firephp.org/'>FirePHP</a> and their unholy union with <a href='http://http://getfirebug.com/'>FireBug</a>. These two are great tools for debugging an Internet application but they both suffer from one fatal flaw in my eyes: the ability to view debugging information from anonymous Internet users.</p>
<p>Sure, it is a great feature to be able to hit a site and have debugging information pop up in a panel in my browser but how does that help me when dealing with users that I do not personally know? It doesn&#8217;t&#8230; Dumping data to a .log file offers several problems in and of itself, the largest of which is the rate at which said log file can reach an unwieldy size.</p>
<p>Another flaw in <a href='http://www.firephp.org/'>FirePHP</a> is that sometimes you just want it short, sweet and not sent to the client. For years I have gone with a tried and true method of remote debugging which allows for me to view dumped data on a remote server. Yes, a REMOTE server&#8230; as in 3000 miles away and not in my browser.</p>
<p><span id="more-105"></span></p>
<p>UDP is a stateless Internet protocol which allows for no handshaking or error checking, this creates an almost &#8220;fire and forget&#8221; method of sending packets to a remote system. UDP is perfect when you do not want to stop things to make sure the other side gets the information and you don&#8217;t really care if there is even someone at the other end listening.</p>
<p>USAGE:</p>
<div class='code'>&nbsp;php snippet<pre lang='php'>require_once("UDPDEBUG_CLASS.php");
$UDPDEBUG = new UDPDEBUG("127.0.0.1", 4545);
$UDPDEBUG-&gt;SEND("This is a simple test", 'LOW', TRUE);
    </pre></div>
<p>Line:</p>
<p>1. Include the debugging class</p>
<p>2. Create a new object and tell it we are using the ip address 127.0.0.1 and port 4545</p>
<p>3. Send our data debug statement to the server with a low priority and display the PORT and LEVEL.</p>
<p>Three lines is all it takes to send the data off and we can easily replace &#8220;This is a simple test&#8221; with $our_value.</p>
<div class='article-ad'>
<script type='text/javascript'><!--
google_ad_client = 'pub-0797652291746169';
/* 468x60, created 2/23/08 */
google_ad_slot = '8955222875';
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type='text/javascript'
src='http://pagead2.googlesyndication.com/pagead/show_ads.js'>
</script>
</div>

<p>Reading this data can be done using several different tools but the one I will focus on here is <a href='http://netcat.sourceforge.net/'>Netcat</a>, which is a network diagnostic tool.</p>
<p>From a command console (or windows CMD prompt with access to the NC binary) type:</p>
<p>nc -u -l -p 4545</p>
<p>This will start <a href='http://netcat.sourceforge.net/'>Netcat</a> listening (-l) on UDP (-u) port (-p) 4545, now when we hit our udpdebug enabled page <a href='http://netcat.sourceforge.net/'>Netcat</a> will spit out the information we wish to see. For this example I am using this test file:</p>
<div class='code' class='code'>&nbsp;php&nbsp;(udptest.phps)&nbsp;<a href='/assets/udptest.phps'>download</a><pre lang='php'><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?<br /></span><span style="color: #007700">require_once(</span><span style="color: #DD0000">"UDPDEBUG_CLASS.php"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$UDPDEBUG&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">UDPDEBUG</span><span style="color: #007700">(</span><span style="color: #DD0000">"127.0.0.1"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">4545</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$UDPDEBUG</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">SEND</span><span style="color: #007700">(</span><span style="color: #DD0000">"This&nbsp;is&nbsp;a&nbsp;simple&nbsp;test"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'LOW'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">TRUE</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$UDPDEBUG</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">SEND</span><span style="color: #007700">(</span><span style="color: #DD0000">"This&nbsp;is&nbsp;a&nbsp;simple&nbsp;test"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'MEDIUM'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">TRUE</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$UDPDEBUG</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">SEND</span><span style="color: #007700">(</span><span style="color: #DD0000">"This&nbsp;is&nbsp;a&nbsp;simple&nbsp;test"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'HIGH'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">TRUE</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$UDPDEBUG</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">SEND</span><span style="color: #007700">(</span><span style="color: #DD0000">"This&nbsp;is&nbsp;a&nbsp;simple&nbsp;test"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'LOW'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">FALSE</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$UDPDEBUG</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">SEND</span><span style="color: #007700">(</span><span style="color: #DD0000">"This&nbsp;is&nbsp;a&nbsp;simple&nbsp;test"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'MEDIUM'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">FALSE</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$UDPDEBUG</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">SEND</span><span style="color: #007700">(</span><span style="color: #DD0000">"This&nbsp;is&nbsp;a&nbsp;simple&nbsp;test"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'HIGH'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">FALSE</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;<br /></span>
</span>
</code>
    </pre></div>
<p>Which produces the following output if everything works right:</p>
<a href='/assets/udp_test_output.jpg'><img src='/assets/udp_test_output.jpg'></a>
<p>The reason that UDP will send the port and level if requested is because I often assign a unique port number to each application I am working on. Meaning that I have created a simple application that listens full time on a list of ports I have specified. This way I can check and see if all of the sudden my_nifty_webapp.com is throwing a database error because its port number is 12127.</p>
<div class='code' class='code'>&nbsp;php&nbsp;(UDPDEBUG_CLASS.phps)&nbsp;<a href='/assets/UDPDEBUG_CLASS.phps'>download</a><pre lang='php'><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/**********************************************************************<br />*&nbsp;&nbsp;&nbsp;&nbsp;Author:&nbsp;&nbsp;&nbsp;&nbsp;Terry&nbsp;Valladon&nbsp;(terry@terryvalladon.com)<br />*&nbsp;&nbsp;&nbsp;&nbsp;Web...:&nbsp;&nbsp;&nbsp;&nbsp;http://www.terryvalladon.com<br />*&nbsp;&nbsp;&nbsp;&nbsp;Name..:&nbsp;&nbsp;&nbsp;&nbsp;UDBDebug&nbsp;Class<br />*&nbsp;&nbsp;&nbsp;&nbsp;Desc..:&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;class&nbsp;is&nbsp;used&nbsp;to&nbsp;send&nbsp;debug&nbsp;messages&nbsp;as&nbsp;a&nbsp;datagram&nbsp;packet&nbsp;to&nbsp;a&nbsp;UDP&nbsp;port<br />*<br />*&nbsp;&nbsp;&nbsp;&nbsp;Notes.:&nbsp;&nbsp;&nbsp;&nbsp;&lt;IP&nbsp;ADDRESS&gt;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;The&nbsp;IP&nbsp;address&nbsp;you&nbsp;want&nbsp;the&nbsp;packet&nbsp;sent&nbsp;to<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;PORT&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;The&nbsp;port&nbsp;you&nbsp;want&nbsp;the&nbsp;packet&nbsp;sent&nbsp;to<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;LEVEL&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;LOW,&nbsp;MEDIUM,&nbsp;HIGH<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;VERBOSE&gt;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;TRUE,&nbsp;FALSE&nbsp;-&nbsp;Display&nbsp;information&nbsp;like&nbsp;LEVEL&nbsp;and&nbsp;PORT<br />*<br />*&nbsp;&nbsp;&nbsp;&nbsp;Usage.:&nbsp;&nbsp;&nbsp;&nbsp;require_once("UDPDEBUG_CLASS.php");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$UDPDEBUG&nbsp;=&nbsp;new&nbsp;UDPDEBUG(&lt;IP&nbsp;ADDRESS&gt;,&nbsp;&lt;PORT&gt;);<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$UDPDEBUG-&gt;SEND($MESSAGE,&nbsp;&lt;LEVEL&gt;,&nbsp;&lt;VERBOSE&gt;);<br />*<br />*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">UDPDEBUG&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000BB">$IP_ADDRESS</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000BB">$PORT</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000BB">$UDP_OBJECT</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000BB">$ERR_NO</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000BB">$ERR_STR</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000BB">$ESC_CHR</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000BB">$LEVEL&nbsp;</span><span style="color: #007700">=&nbsp;array(</span><span style="color: #DD0000">'LOW'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">0</span><span style="color: #007700">,</span><span style="color: #DD0000">'MEDIUM'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">1</span><span style="color: #007700">,</span><span style="color: #DD0000">'HIGH'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">2</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000BB">$LEVEL_WORDS&nbsp;</span><span style="color: #007700">=&nbsp;array(</span><span style="color: #0000BB">0</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'LOW'</span><span style="color: #007700">,</span><span style="color: #0000BB">1</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'MEDIUM'</span><span style="color: #007700">,</span><span style="color: #0000BB">2</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'HIGH'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000BB">$LEVEL_COLORS&nbsp;</span><span style="color: #007700">=&nbsp;array(</span><span style="color: #0000BB">0</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'GREEN'</span><span style="color: #007700">,</span><span style="color: #0000BB">1</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'YELLOW'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">2</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'RED'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000BB">$ANSI_BG&nbsp;</span><span style="color: #007700">=&nbsp;array(</span><span style="color: #DD0000">'RED'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'[41m'</span><span style="color: #007700">,</span><span style="color: #DD0000">'GREEN'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'[42m'</span><span style="color: #007700">,</span><span style="color: #DD0000">'YELLOW'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'[43m'</span><span style="color: #007700">,</span><span style="color: #DD0000">'CYAN'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'[46m'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000BB">$ANSI_FG&nbsp;</span><span style="color: #007700">=&nbsp;array(</span><span style="color: #DD0000">'RED'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'[1;31m'</span><span style="color: #007700">,</span><span style="color: #DD0000">'GREEN'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'[1;32m'</span><span style="color: #007700">,</span><span style="color: #DD0000">'YELLOW'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'[1;33m'</span><span style="color: #007700">,</span><span style="color: #DD0000">'CYAN'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'[1;36m'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000BB">$ANSI_SPECIAL&nbsp;</span><span style="color: #007700">=&nbsp;array(</span><span style="color: #DD0000">'NORMAL'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'[0m'</span><span style="color: #007700">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">UDPDEBUG</span><span style="color: #007700">(</span><span style="color: #0000BB">$IP_ADDRESS</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$PORT</span><span style="color: #007700">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ESC_CHR&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">chr</span><span style="color: #007700">(</span><span style="color: #0000BB">27</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">IP_ADDRESS&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$IP_ADDRESS</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">PORT&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$PORT</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;</span><span style="color: #0000BB">SEND</span><span style="color: #007700">(</span><span style="color: #0000BB">$STRING</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$LEVEL&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$VERBOSE&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">FALSE</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$LEVEL&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">LEVEL</span><span style="color: #007700">[</span><span style="color: #0000BB">$LEVEL</span><span style="color: #007700">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</span><span style="color: #0000BB">$VERBOSE&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #0000BB">TRUE</span><span style="color: #007700">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$OUTPUT&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">sprintf</span><span style="color: #007700">(</span><span style="color: #DD0000">"[%s]:%s:%s%s\n"</span><span style="color: #007700">,</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ESC_CHR</span><span style="color: #007700">.</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ANSI_FG</span><span style="color: #007700">[</span><span style="color: #DD0000">'CYAN'</span><span style="color: #007700">].</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">PORT</span><span style="color: #007700">,</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ESC_CHR</span><span style="color: #007700">.</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ANSI_FG</span><span style="color: #007700">[</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">LEVEL_COLORS</span><span style="color: #007700">[</span><span style="color: #0000BB">$LEVEL</span><span style="color: #007700">]].</span><span style="color: #0000BB">str_pad</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">LEVEL_WORDS</span><span style="color: #007700">[</span><span style="color: #0000BB">$LEVEL</span><span style="color: #007700">],&nbsp;</span><span style="color: #0000BB">9</span><span style="color: #007700">),</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ESC_CHR</span><span style="color: #007700">.</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ANSI_SPECIAL</span><span style="color: #007700">[</span><span style="color: #DD0000">'NORMAL'</span><span style="color: #007700">],&nbsp;</span><span style="color: #0000BB">$STRING</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$OUTPUT&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">sprintf</span><span style="color: #007700">(</span><span style="color: #DD0000">"%s\n"</span><span style="color: #007700">,</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ESC_CHR</span><span style="color: #007700">.</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ANSI_FG</span><span style="color: #007700">[</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">LEVEL_COLORS</span><span style="color: #007700">[</span><span style="color: #0000BB">$LEVEL</span><span style="color: #007700">]].</span><span style="color: #0000BB">$STRING</span><span style="color: #007700">.</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ESC_CHR</span><span style="color: #007700">.</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ANSI_SPECIAL</span><span style="color: #007700">[</span><span style="color: #DD0000">'NORMAL'</span><span style="color: #007700">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">UPD_OBJECT&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">fsockopen</span><span style="color: #007700">(</span><span style="color: #DD0000">"udp://"&nbsp;</span><span style="color: #007700">.&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">IP_ADDRESS</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">PORT</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ERR_NO</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ERR_STR</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">UPD_OBJECT</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"ERROR&nbsp;IN&nbsp;UDP&nbsp;SYSTEM:&nbsp;$this-&gt;ERR_NO&nbsp;-&nbsp;$this-&gt;ERR_STR&lt;br&nbsp;/&gt;\n"</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">UPD_OBJECT</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$OUTPUT</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">UPD_OBJECT</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #0000BB">?&gt;<br /></span>
</span>
</code>
    </pre></div>
<p>Come back next week when we will modify our base UDPDEBUG class to add in array handling. This will enhance our debugging ability and open up for a future change of passing objects and even mysql record sets.</p>
<p><strong>UPDATE</strong>.<br />
Please visit part two of this article series at <a href="/2009/03/15/remote-debugging-with-udp-sockets-part-2/">Remote debugging with UDP sockets part 2</a>.</p>
<p>Till next week, code sexy.</p>
<p>&#8211;Terry Valladon</p>

<!-- start wp-tags-to-technorati 1.02 -->

<p class='technorati-tags'>Technorati Tags: <a class='technorati-link' href='http://technorati.com/tag/class' rel='tag' target='_self'>class</a>, <a class='technorati-link' href='http://technorati.com/tag/code' rel='tag' target='_self'>code</a>, <a class='technorati-link' href='http://technorati.com/tag/debugging' rel='tag' target='_self'>debugging</a>, <a class='technorati-link' href='http://technorati.com/tag/php' rel='tag' target='_self'>php</a>, <a class='technorati-link' href='http://technorati.com/tag/sockets' rel='tag' target='_self'>sockets</a>, <a class='technorati-link' href='http://technorati.com/tag/tutorial' rel='tag' target='_self'>tutorial</a>, <a class='technorati-link' href='http://technorati.com/tag/udp' rel='tag' target='_self'>udp</a></p>

<!-- end wp-tags-to-technorati -->
]]></content:encoded>
			<wfw:commentRss>http://www.dirtytrolls.com/2009/02/11/remote-php-debugging-with-udp-sockets-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
