<?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>Sunshow Life &#187; C</title>
	<atom:link href="http://blog.sunshow.net/category/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sunshow.net</link>
	<description>回到最初的美好</description>
	<lastBuildDate>Mon, 16 Aug 2010 03:49:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>libcurl与CLOSE_WAIT</title>
		<link>http://blog.sunshow.net/2010/03/libcurl-and-close-wait/</link>
		<comments>http://blog.sunshow.net/2010/03/libcurl-and-close-wait/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 05:41:49 +0000</pubDate>
		<dc:creator>Sunshow</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[libcurl]]></category>
		<category><![CDATA[TCP]]></category>
		<category><![CDATA[下载]]></category>

		<guid isPermaLink="false">http://blog.sunshow.net/?p=730</guid>
		<description><![CDATA[调用libcurl下载，然后使用netstat查看发现有大量的TCP连接保持在CLOSE_WAIT状态 查看libcurl的文档说明，有这样一个选项： CURLOPT_FORBID_REUSE Pass a long. Set to 1 to make the next transfer explicitly close the connection when done. Normally, libcurl keeps all connections alive when done with one transfer in case a succeeding one follows that can re-use them. This option should be used with caution and only if you understand what it [...]]]></description>
			<content:encoded><![CDATA[<p>调用libcurl下载，然后使用netstat查看发现有大量的TCP连接保持在CLOSE_WAIT状态<br />
查看libcurl的文档说明，有这样一个选项：</p>
<blockquote><p>
CURLOPT_FORBID_REUSE</p>
<p>Pass a long. Set to 1 to make the next transfer explicitly close the connection when done. Normally, libcurl keeps all connections alive when done with one transfer in case a succeeding one follows that can re-use them. This option should be used with caution and only if you understand what it does. Set to 0 to have libcurl keep the connection open for possible later re-use (default behavior).
</p></blockquote>
<p>也就是说，默认情况下libcurl完成一个任务以后，出于重用连接的考虑不会马上关闭<br />
如果没有新的TCP请求来重用这个连接，那么只能等到CLOSE_WAIT超时，这个时间默认在7200秒甚至更高，太多的CLOSE_WAIT连接会导致性能问题</p>
<p>解决方法：</p>
<div class="hl-surround"><div class="hl-main">curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1);</div></div>
<p>最好再修改一下TCP参数调低CLOSE_WAIT和TIME_WAIT的超时时间</p>

	<div style="clear:both;"></div>标签：<a href="http://blog.sunshow.net/tag/libcurl/" title="libcurl" rel="tag">libcurl</a>, <a href="http://blog.sunshow.net/tag/tcp/" title="TCP" rel="tag">TCP</a>, <a href="http://blog.sunshow.net/tag/%e4%b8%8b%e8%bd%bd/" title="下载" rel="tag">下载</a><br /><br />

	<div style="clear:both;"></div><strong>相关日志</strong>
	<ul class="st-related-posts">
	<li><a href="http://blog.sunshow.net/2008/06/firefox-3-%e4%b8%8b%e8%bd%bd%e6%97%a5/" title="Firefox 3 下载日 (2008-06-18)">Firefox 3 下载日</a> (1)</li>
	<li><a href="http://blog.sunshow.net/2009/12/css-sprites-styles-producing-tool/" title="CSS Sprites样式生成工具 (2009-12-14)">CSS Sprites样式生成工具</a> (0)</li>
	<li><a href="http://blog.sunshow.net/2009/03/ie-8-released/" title="IE8正式发布 (2009-03-20)">IE8正式发布</a> (1)</li>
	<li><a href="http://blog.sunshow.net/2007/02/%ce%bctorrent-1.6.1-build-488released/" title="μTorrent 1.6.1 (build 488) released (2007-02-15)">μTorrent 1.6.1 (build 488) released</a> (1)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sunshow.net/2010/03/libcurl-and-close-wait/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>url的encode和decode</title>
		<link>http://blog.sunshow.net/2009/11/url-encode-decode/</link>
		<comments>http://blog.sunshow.net/2009/11/url-encode-decode/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 08:34:39 +0000</pubDate>
		<dc:creator>Sunshow</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[decode]]></category>
		<category><![CDATA[encode]]></category>
		<category><![CDATA[url]]></category>

		<guid isPermaLink="false">http://blog.sunshow.net/?p=716</guid>
		<description><![CDATA[相关RFC：http://curl.haxx.se/rfc/rfc2396.txt /* --------------------------------------------------------------------------- * Encode URL by converting special characters to %XX (where XX are hexadecimal digits) * Don't forget to free the return value. */ char *urlencode(const char *url) { #define&#160;COPY_TO_ENCODE_URL(c) \ &#160; &#160; &#160; &#160; if&#160;(outlen &#60; pos) { \ &#160; &#160; &#160; &#160; &#160; &#160; outlen += 10; \ &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>相关RFC：<a href="http://curl.haxx.se/rfc/rfc2396.txt">http://curl.haxx.se/rfc/rfc2396.txt</a></p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span class="hl-mlcomment">/* ---------------------------------------------------------------------------</span></li>
<li><span class="hl-mlcomment"> * Encode URL by converting special characters to %XX (where XX are hexadecimal digits)</span></li>
<li><span class="hl-mlcomment"> * Don't forget to free the return value.</span></li>
<li><span class="hl-mlcomment"> */</span></li>
<li><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">urlencode</span><span style="color: Olive;">(</span><span class="hl-types">const</span><span style="color: Gray;"> </span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">url</span><span style="color: Olive;">)</span></li>
<li><span style="color: Olive;">{</span></li>
<li><span class="hl-prepro">#define</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">COPY_TO_ENCODE_URL</span><span style="color: Olive;">(</span><span style="color: Blue;">c</span><span style="color: Olive;">)</span><span style="color: Gray;"> \</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">outlen</span><span style="color: Gray;"> &lt; </span><span style="color: Blue;">pos</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> \</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">outlen</span><span style="color: Gray;"> += </span><span style="color: Maroon;">10</span><span style="color: Gray;">; \</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">out</span><span style="color: Gray;"> = </span><span style="color: Blue;">realloc</span><span style="color: Olive;">(</span><span style="color: Blue;">out</span><span style="color: Gray;">, </span><span style="color: Blue;">outlen</span><span style="color: Gray;"> + </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">; \</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;"> \</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">out</span><span style="color: Gray;">[</span><span style="color: Blue;">pos</span><span style="color: Gray;"> ++] = </span><span style="color: Blue;">c</span><span style="color: Gray;">; \</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="hl-prepro"></span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">size_t</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">i</span><span style="color: Gray;">, </span><span style="color: Blue;">len</span><span style="color: Gray;"> = </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: Blue;">outlen</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">outlen</span><span style="color: Gray;"> = </span><span style="color: Blue;">len</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">out</span><span style="color: Gray;"> = </span><span style="color: Blue;">malloc</span><span style="color: Olive;">(</span><span style="color: Blue;">outlen</span><span style="color: Gray;"> + </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span class="hl-types">int</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">pos</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">pos</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;"> &lt; </span><span style="color: Blue;">len</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;"> ++</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">((</span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> &gt;= </span><span style="color: Maroon;">48</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> &lt;= </span><span style="color: Maroon;">57</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp; </span><span style="color: #ffa500;">// 0-9</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || </span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> &gt;= </span><span style="color: Maroon;">65</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> &lt;= </span><span style="color: Maroon;">90</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;&nbsp; </span><span style="color: #ffa500;">//a-z</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || </span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> &gt;= </span><span style="color: Maroon;">97</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> &lt;= </span><span style="color: Maroon;">122</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp; </span><span style="color: #ffa500;">//A-Z</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == ';' || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '/' || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '?'</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == ':' || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '@' || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '&amp;'</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '=' || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '+' || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '$'</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == ',' || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '-' || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '</span><span style="color: Blue;">_</span><span style="color: Gray;">'</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '.' || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '!' || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '~'</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '*' || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '\'' || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '</span><span style="color: Olive;">(</span><span style="color: Gray;">'</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '</span><span style="color: Olive;">)</span><span style="color: Gray;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="hl-mlcomment">/* straight copy */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">COPY_TO_ENCODE_URL</span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">])</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span class="hl-prepro">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #undef</span><span style="color: Gray;"> </span><span style="color: Blue;">HEX_TO_DIGIT</span><span class="hl-prepro"></span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="hl-types">char</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">dig1</span><span style="color: Gray;"> = </span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> &amp; </span><span style="color: Maroon;">0xF0</span><span style="color: Olive;">)</span><span style="color: Gray;"> &gt;&gt; </span><span style="color: Maroon;">4</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="hl-types">char</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">dig2</span><span style="color: Gray;"> = </span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> &amp; </span><span style="color: Maroon;">0x0F</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">dig1</span><span style="color: Gray;"> &gt;= </span><span style="color: Maroon;">0</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">dig1</span><span style="color: Gray;"> &lt;= </span><span style="color: Maroon;">9</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">dig1</span><span style="color: Gray;"> += </span><span style="color: Maroon;">48</span><span style="color: Gray;">;&nbsp; &nbsp; </span><span style="color: #ffa500;">//0,48inascii</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">dig1</span><span style="color: Gray;"> &gt;= </span><span style="color: Maroon;">10</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">dig1</span><span style="color: Gray;"> &lt;= </span><span style="color: Maroon;">15</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">dig1</span><span style="color: Gray;"> += </span><span style="color: Maroon;">65</span><span style="color: Gray;"> - </span><span style="color: Maroon;">10</span><span style="color: Gray;">;&nbsp; &nbsp; </span><span style="color: #ffa500;">//A,65inascii</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">dig2</span><span style="color: Gray;"> &gt;= </span><span style="color: Maroon;">0</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">dig2</span><span style="color: Gray;"> &lt;= </span><span style="color: Maroon;">9</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">dig2</span><span style="color: Gray;"> += </span><span style="color: Maroon;">48</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">dig2</span><span style="color: Gray;"> &gt;= </span><span style="color: Maroon;">10</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">dig2</span><span style="color: Gray;"> &lt;= </span><span style="color: Maroon;">15</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">dig2</span><span style="color: Gray;"> += </span><span style="color: Maroon;">65</span><span style="color: Gray;"> - </span><span style="color: Maroon;">10</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">COPY_TO_ENCODE_URL</span><span style="color: Olive;">(</span><span style="color: Gray;">'%'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">COPY_TO_ENCODE_URL</span><span style="color: Olive;">(</span><span style="color: Blue;">dig1</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">COPY_TO_ENCODE_URL</span><span style="color: Olive;">(</span><span style="color: Blue;">dig2</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">out</span><span style="color: Olive;">[</span><span style="color: Blue;">pos</span><span style="color: Olive;">]</span><span style="color: Gray;"> = '\</span><span style="color: Maroon;">0</span><span style="color: Gray;">';</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">out</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span class="hl-mlcomment">/* ---------------------------------------------------------------------------</span></li>
<li><span class="hl-mlcomment"> * Decode URL by converting %XX (where XX are hexadecimal digits) to the</span></li>
<li><span class="hl-mlcomment"> * character it represents.&nbsp; Don't forget to free the return value.</span></li>
<li><span class="hl-mlcomment"> */</span></li>
<li><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">urldecode</span><span style="color: Olive;">(</span><span class="hl-types">const</span><span style="color: Gray;">&nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">url</span><span style="color: Olive;">)</span></li>
<li><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">size_t</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">i</span><span style="color: Gray;">, </span><span style="color: Blue;">len</span><span style="color: Gray;"> = </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">out</span><span style="color: Gray;"> = </span><span style="color: Blue;">malloc</span><span style="color: Olive;">(</span><span style="color: Blue;">len</span><span style="color: Gray;"> + </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span class="hl-types">int</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">pos</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">pos</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;"> &lt; </span><span style="color: Blue;">len</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;"> ++</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == '%' &amp;&amp; </span><span style="color: Blue;">i</span><span style="color: Gray;">+</span><span style="color: Maroon;">2</span><span style="color: Gray;"> &lt; </span><span style="color: Blue;">len</span><span style="color: Gray;"> &amp;&amp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">isxdigit</span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Gray;"> + </span><span style="color: Maroon;">1</span><span style="color: Olive;">])</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">isxdigit</span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Gray;"> + </span><span style="color: Maroon;">2</span><span style="color: Olive;">]))</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="hl-mlcomment">/* decode %XX */</span></li>
<li><span class="hl-prepro">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #define</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">HEX_TO_DIGIT</span><span style="color: Olive;">(</span><span style="color: Blue;">hex</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"> \</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">((</span><span style="color: Blue;">hex</span><span style="color: Olive;">)</span><span style="color: Gray;"> &gt;= '</span><span style="color: Blue;">A</span><span style="color: Gray;">' &amp;&amp; </span><span style="color: Olive;">(</span><span style="color: Blue;">hex</span><span style="color: Olive;">)</span><span style="color: Gray;"> &lt;= '</span><span style="color: Blue;">F</span><span style="color: Gray;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> ? </span><span style="color: Olive;">((</span><span style="color: Blue;">hex</span><span style="color: Olive;">)</span><span style="color: Gray;"> - '</span><span style="color: Blue;">A</span><span style="color: Gray;">' + </span><span style="color: Maroon;">10</span><span style="color: Olive;">)</span><span style="color: Gray;">: \</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">((</span><span style="color: Blue;">hex</span><span style="color: Olive;">)</span><span style="color: Gray;"> &gt;= '</span><span style="color: Blue;">a</span><span style="color: Gray;">' &amp;&amp; </span><span style="color: Olive;">(</span><span style="color: Blue;">hex</span><span style="color: Olive;">)</span><span style="color: Gray;"> &lt;= '</span><span style="color: Blue;">f</span><span style="color: Gray;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> ? </span><span style="color: Olive;">((</span><span style="color: Blue;">hex</span><span style="color: Olive;">)</span><span style="color: Gray;"> - '</span><span style="color: Blue;">a</span><span style="color: Gray;">' + </span><span style="color: Maroon;">10</span><span style="color: Olive;">)</span><span style="color: Gray;">: \</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">((</span><span style="color: Blue;">hex</span><span style="color: Olive;">)</span><span style="color: Gray;"> - '</span><span style="color: Maroon;">0</span><span style="color: Gray;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">)</span><span class="hl-prepro"></span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">out</span><span style="color: Olive;">[</span><span style="color: Blue;">pos</span><span style="color: Gray;"> ++</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">HEX_TO_DIGIT</span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Gray;"> + </span><span style="color: Maroon;">1</span><span style="color: Olive;">])</span><span style="color: Gray;"> * </span><span style="color: Maroon;">16</span><span style="color: Gray;"> +</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: Blue;">HEX_TO_DIGIT</span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Gray;"> + </span><span style="color: Maroon;">2</span><span style="color: Olive;">])</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">i</span><span style="color: Gray;"> += </span><span style="color: Maroon;">2</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span class="hl-prepro">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #undef</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">HEX_TO_DIGIT</span><span class="hl-prepro"></span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">else</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="hl-mlcomment">/* straight copy */</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">out</span><span style="color: Olive;">[</span><span style="color: Blue;">pos</span><span style="color: Gray;"> ++</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">url</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">out</span><span style="color: Olive;">[</span><span style="color: Blue;">pos</span><span style="color: Olive;">]</span><span style="color: Gray;"> = '\</span><span style="color: Maroon;">0</span><span style="color: Gray;">';</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">out</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>

	<div style="clear:both;"></div>标签：<a href="http://blog.sunshow.net/tag/decode/" title="decode" rel="tag">decode</a>, <a href="http://blog.sunshow.net/tag/encode/" title="encode" rel="tag">encode</a>, <a href="http://blog.sunshow.net/tag/url/" title="url" rel="tag">url</a><br /><br />

	<div style="clear:both;"></div><strong>相关日志</strong>
	<ul class="st-related-posts">
	<li><a href="http://blog.sunshow.net/2007/05/tinyurl%e4%b8%8d%e9%94%99/" title="TinyURL不错 (2007-05-07)">TinyURL不错</a> (1)</li>
	<li><a href="http://blog.sunshow.net/2010/06/remove-index-php-from-urls-of-expression-engine/" title="[Expression Engine]去除URL里的index.php (2010-06-17)">[Expression Engine]去除URL里的index.php</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sunshow.net/2009/11/url-encode-decode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Socket]获取客户端IP</title>
		<link>http://blog.sunshow.net/2009/07/get-client-ip-from-socket/</link>
		<comments>http://blog.sunshow.net/2009/07/get-client-ip-from-socket/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 05:41:47 +0000</pubDate>
		<dc:creator>Sunshow</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[accept]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[socket]]></category>

		<guid isPermaLink="false">http://blog.sunshow.net/?p=709</guid>
		<description><![CDATA[有两种方法，一种是在accept的时候获取，一种是通过getpeername获取 #include &#60;sys/socket.h&#62;&#160;int accept(int socket, struct sockaddr *restrict address,&#160;&#160; &#160; &#160; socklen_t *restrict address_len);&#160;int getpeername(int socket, struct sockaddr *restrict address,&#160;&#160; &#160; &#160; socklen_t *restrict address_len); 两者区别主要在取IP的fd不一样，前者是在监听的fd，后者是在连接建立的fd struct sockaddr_in addr;socklen_t addr_len;int32_t listen_fd, sock_fd;&#160;/* create listening port */&#160;addr_len = sizeof(addr);&#160;memset(&#38;addr, 0, addr_len);sock_fd = accept(listen_fd, (struct sockaddr *)&#38;addr, &#38;addr_len);printf(&#34;%d\n&#34;, addr.sin_addr.s_addr);&#160;memset(&#38;addr, 0, addr_len);getpeername(sock_fd, (struct sockaddr *)&#38;addr, &#38;addr_len);printf(&#34;%d\n&#34;, addr.sin_addr.s_addr); 当然这种长整型格式的IP不一定是我们想要的，可以通过inet_ntoa转换 [...]]]></description>
			<content:encoded><![CDATA[<p>有两种方法，一种是在<a href="http://www.opengroup.org/onlinepubs/000095399/functions/accept.html">accept</a>的时候获取，一种是通过<a href="http://www.opengroup.org/onlinepubs/000095399/functions/getpeername.html">getpeername</a>获取</p>
<div class="hl-surround"><div class="hl-main"><span class="hl-prepro">#include </span><span style="color: #8b0000;">&lt;</span><span style="color: Red;">sys/socket.h</span><span style="color: #8b0000;">&gt;</span><span class="hl-prepro"></span><span style="color: Gray;"><br />&nbsp;<br /></span><span class="hl-types">int</span><span style="color: Gray;"> </span><span style="color: Blue;">accept</span><span style="color: Olive;">(</span><span class="hl-types">int</span><span style="color: Gray;"> </span><span style="color: Blue;">socket</span><span style="color: Gray;">, </span><span class="hl-types">struct</span><span style="color: Gray;"> </span><span style="color: Blue;">sockaddr</span><span style="color: Gray;"> *</span><span style="color: Blue;">restrict</span><span style="color: Gray;"> </span><span style="color: Blue;">address</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">socklen_t</span><span style="color: Gray;"> *</span><span style="color: Blue;">restrict</span><span style="color: Gray;"> </span><span style="color: Blue;">address_len</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span class="hl-types">int</span><span style="color: Gray;"> </span><span style="color: Blue;">getpeername</span><span style="color: Olive;">(</span><span class="hl-types">int</span><span style="color: Gray;"> </span><span style="color: Blue;">socket</span><span style="color: Gray;">, </span><span class="hl-types">struct</span><span style="color: Gray;"> </span><span style="color: Blue;">sockaddr</span><span style="color: Gray;"> *</span><span style="color: Blue;">restrict</span><span style="color: Gray;"> </span><span style="color: Blue;">address</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">socklen_t</span><span style="color: Gray;"> *</span><span style="color: Blue;">restrict</span><span style="color: Gray;"> </span><span style="color: Blue;">address_len</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>两者区别主要在取IP的fd不一样，前者是在监听的fd，后者是在连接建立的fd</p>
<div class="hl-surround"><div class="hl-main"><span class="hl-types">struct</span><span style="color: Gray;"> </span><span style="color: Blue;">sockaddr_in</span><span style="color: Gray;"> </span><span style="color: Blue;">addr</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">socklen_t</span><span style="color: Gray;"> </span><span style="color: Blue;">addr_len</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">int32_t</span><span style="color: Gray;"> </span><span style="color: Blue;">listen_fd</span><span style="color: Gray;">, </span><span style="color: Blue;">sock_fd</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span class="hl-mlcomment">/* create listening port */</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Blue;">addr_len</span><span style="color: Gray;"> = </span><span style="color: Green;">sizeof</span><span style="color: Olive;">(</span><span style="color: Blue;">addr</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: Blue;">memset</span><span style="color: Olive;">(</span><span style="color: Gray;">&amp;</span><span style="color: Blue;">addr</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">addr_len</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">sock_fd</span><span style="color: Gray;"> = </span><span style="color: Blue;">accept</span><span style="color: Olive;">(</span><span style="color: Blue;">listen_fd</span><span style="color: Gray;">, </span><span style="color: Olive;">(</span><span class="hl-types">struct</span><span style="color: Gray;"> </span><span style="color: Blue;">sockaddr</span><span style="color: Gray;"> *</span><span style="color: Olive;">)</span><span style="color: Gray;">&amp;</span><span style="color: Blue;">addr</span><span style="color: Gray;">, &amp;</span><span style="color: Blue;">addr_len</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">printf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">%d</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">addr</span><span style="color: Gray;">.</span><span style="color: Blue;">sin_addr</span><span style="color: Gray;">.</span><span style="color: Blue;">s_addr</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: Blue;">memset</span><span style="color: Olive;">(</span><span style="color: Gray;">&amp;</span><span style="color: Blue;">addr</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">addr_len</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">getpeername</span><span style="color: Olive;">(</span><span style="color: Blue;">sock_fd</span><span style="color: Gray;">, </span><span style="color: Olive;">(</span><span class="hl-types">struct</span><span style="color: Gray;"> </span><span style="color: Blue;">sockaddr</span><span style="color: Gray;"> *</span><span style="color: Olive;">)</span><span style="color: Gray;">&amp;</span><span style="color: Blue;">addr</span><span style="color: Gray;">, &amp;</span><span style="color: Blue;">addr_len</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">printf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">%d</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">addr</span><span style="color: Gray;">.</span><span style="color: Blue;">sin_addr</span><span style="color: Gray;">.</span><span style="color: Blue;">s_addr</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>当然这种长整型格式的IP不一定是我们想要的，可以通过<a href="http://www.opengroup.org/onlinepubs/000095399/functions/inet_ntoa.html">inet_ntoa</a>转换</p>
<div class="hl-surround"><div class="hl-main"><span class="hl-prepro">#include </span><span style="color: #8b0000;">&lt;</span><span style="color: Red;">arpa/inet.h</span><span style="color: #8b0000;">&gt;</span><span class="hl-prepro"></span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Blue;">in_addr_t</span><span style="color: Gray;"> </span><span style="color: Blue;">inet_addr</span><span style="color: Olive;">(</span><span class="hl-types">const</span><span style="color: Gray;"> </span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">cp</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">inet_ntoa</span><span style="color: Olive;">(</span><span class="hl-types">struct</span><span style="color: Gray;"> </span><span style="color: Blue;">in_addr</span><span style="color: Gray;"> </span><span style="color: Blue;">in</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">printf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">%s</span><span style="color: Navy;">\</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">inet_ntoa</span><span style="color: Olive;">(</span><span style="color: Blue;">addr</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></div></div>

	<div style="clear:both;"></div>标签：<a href="http://blog.sunshow.net/tag/accept/" title="accept" rel="tag">accept</a>, <a href="http://blog.sunshow.net/tag/ip/" title="ip" rel="tag">ip</a>, <a href="http://blog.sunshow.net/tag/socket/" title="socket" rel="tag">socket</a><br /><br />
]]></content:encoded>
			<wfw:commentRss>http://blog.sunshow.net/2009/07/get-client-ip-from-socket/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
