﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" 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/"><channel><title>BlogJava-用程序来创造财富-文章分类-c/c++</title><link>http://www2.blogjava.net/ioriqw/category/10524.html</link><description>在中国商界、尤其是互联网界，另一群“80后”青年正在集体浮出水面，以你可能想都想不到的方式崛起。</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 19:32:14 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 19:32:14 GMT</pubDate><ttl>60</ttl><item><title>Change Internet Proxy settings</title><link>http://www.blogjava.net/ioriqw/articles/96026.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Thu, 25 Jan 2007 12:06:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/96026.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/96026.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/96026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/96026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/96026.html</trackback:ping><description><![CDATA[
		<h2>摘选</h2>
		<h2>
				<a href="http://www.codeproject.com/internet/changeproxy1.asp">http://www.codeproject.com/internet/changeproxy1.asp</a>
		</h2>
		<h2>Introduction </h2>
		<p nd="1">Changing proxy settings of IE is a frequent requirement of mine. Then I got the idea of writing a tool by myself, at last. I have not found clear instructions on this. Many articles recommend to modify registry directly, but unfortunately their instruction is not enough. Most of them direct me to modify the following values in registry :-</p>
		<pre lang="text" nd="2">[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"ProxyEnable"=dword:00000001
"ProxyServer"=":"
"ProxyOverride"=""
"DisablePasswordCaching"=dword:00000001
</pre>
		<h2>Details</h2>
		<p nd="3">I tested it and find that it does not work at least on my computer.( I access internet by ADSL connection.) So I backed up registry and modified proxy settings via Internet Explorer, finding that [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections] is also changed. So I wrote the following code snippet to change proxy settings: </p>
		<div class="precollapse" id="premain1" style="WIDTH: 100%">
				<img id="preimg1" style="CURSOR: hand" height="9" src="http://www.codeproject.com/images/minus.gif" width="9" preid="1" />
				<span id="precollapse1" style="MARGIN-BOTTOM: 0px; CURSOR: hand" nd="4" preid="1">Collapse</span>
		</div>
		<pre id="pre1" style="MARGIN-TOP: 0px" nd="5">
				<span class="cpp-keyword">void</span> ShowError(<span class="cpp-keyword">long</span> lerr)
{
    LPVOID lpMsgBuf;
    <span class="cpp-keyword">if</span> (!FormatMessage( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM | 
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        lerr,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), <span class="cpp-comment">// Default language</span>
        (LPTSTR) &amp;lpMsgBuf,
        <span class="cpp-literal">0</span>,
        NULL ))
    {
        <span class="cpp-keyword">return</span>;
    }
    MessageBox( NULL, (LPCTSTR)lpMsgBuf, <span class="cpp-string" nd="6">"Error"</span>, MB_OK | MB_ICONINFORMATION );
    LocalFree( lpMsgBuf );
}
<span class="cpp-keyword">void</span> CieproxyDlg::OnBnClickedOk()
{<span class="cpp-comment">//set proxy server</span>
    UpdateData();
    GetDlgItemText(IDC_EDIT1,m_sIEProxy);
    HKEY hk;
    LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER,
        <span class="cpp-string" nd="7">"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"</span>,
        NULL,KEY_WRITE|KEY_SET_VALUE,&amp;hk);
    <span class="cpp-keyword">if</span>(lret==ERROR_SUCCESS&amp;&amp;NULL!=hk)
    {
        TCHAR* pbuf=m_sIEProxy.GetBuffer(<span class="cpp-literal">1</span>);
        lret=RegSetValueEx( hk,<span class="cpp-string" nd="8">"ProxyServer"</span>,NULL,REG_SZ,pbuf,m_sIEProxy.GetLength());
        DWORD dwenable=<span class="cpp-literal">1</span>;
        lret=RegSetValueEx(hk,<span class="cpp-string" nd="9">"ProxyEnable"</span>,NULL,REG_DWORD,
           (LPBYTE)&amp;dwenable,<span class="cpp-keyword">sizeof</span>(dwenable));
        RegCloseKey(hk);
    }
    <span class="cpp-keyword">const</span> TCHAR* keyname3=_T(
      <span class="cpp-string" nd="10">"software\\Microsoft\\windows\\currentversion\\Internet Settings\\Connections"</span>);
    lret=RegOpenKeyEx(HKEY_CURRENT_USER,keyname3,NULL,
        KEY_READ|KEY_WRITE|KEY_SET_VALUE,&amp;hk);
    <span class="cpp-keyword">if</span>(lret==ERROR_SUCCESS&amp;&amp;NULL!=hk)
    {
        DWORD dwtype;
        <span class="cpp-keyword">char</span> pbuf[<span class="cpp-literal">256</span>];
        DWORD dwlen=<span class="cpp-keyword">sizeof</span>(pbuf);
        <span class="cpp-keyword">const</span><span class="cpp-keyword">char</span>* valname=<span class="cpp-string" nd="11">"Connection to adsl3"</span>;
        lret=RegQueryValueEx(hk,valname,NULL,&amp;dwtype,pbuf,&amp;dwlen);
        <span class="cpp-keyword">if</span>(lret!=ERROR_SUCCESS)
        {
            ShowError(lret);
        }
        pbuf[<span class="cpp-literal">8</span>] = <span class="cpp-literal">3</span>;<span class="cpp-comment">//enable proxy</span>
        pbuf[<span class="cpp-literal">4</span>]=pbuf[<span class="cpp-literal">4</span>]+<span class="cpp-literal">1</span>;
        <span class="cpp-keyword">const</span><span class="cpp-keyword">char</span>* p=m_sIEProxy.GetBuffer(<span class="cpp-literal">1</span>);
        memcpy(pbuf+<span class="cpp-literal">16</span>,p,m_sIEProxy.GetLength());
        <span class="cpp-keyword">char</span> c=<span class="cpp-literal">0</span>;
        <span class="cpp-keyword">for</span>(<span class="cpp-keyword">int</span> i=m_sIEProxy.GetLength();i&lt;<span class="cpp-literal">20</span>;i++)
            pbuf[<span class="cpp-literal">16</span>+i]=c;
        m_sIEProxy.ReleaseBuffer();
        lret=RegSetValueEx(hk,valname,NULL,REG_BINARY,pbuf,dwlen);
        RegCloseKey(hk);
    }
    DWORD dwret;
    SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL,
        SMTO_NORMAL,<span class="cpp-literal">1000</span>,&amp;dwret);
}

<span class="cpp-keyword">void</span> CieproxyDlg::OnBnClickedDisableProxy()
{
    UpdateData();
    GetDlgItemText(IDC_EDIT1,m_sIEProxy);
    HKEY hk;
    LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER,
        <span class="cpp-string" nd="12">"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"</span>,
        NULL,KEY_WRITE|KEY_SET_VALUE,&amp;hk);
    <span class="cpp-keyword">if</span>(lret==ERROR_SUCCESS&amp;&amp;NULL!=hk)
    {
        DWORD dwenable=<span class="cpp-literal">0</span>;
        lret=RegSetValueEx(hk,<span class="cpp-string" nd="13">"ProxyEnable"</span>,NULL,REG_DWORD,
            (LPBYTE)&amp;dwenable,<span class="cpp-keyword">sizeof</span>(dwenable));
        RegCloseKey(hk);
    }
    <span class="cpp-keyword">const</span> TCHAR* keyname3=_T(
      <span class="cpp-string" nd="14">"software\\Microsoft\\windows\\currentversion\\Internet Settings\\Connections"</span>);
    lret=RegOpenKeyEx(HKEY_CURRENT_USER,keyname3,
        NULL,KEY_READ|KEY_WRITE|KEY_SET_VALUE,&amp;hk);
    <span class="cpp-keyword">if</span>(lret==ERROR_SUCCESS&amp;&amp;NULL!=hk)
    {
        DWORD dwtype;
        <span class="cpp-keyword">char</span> pbuf[<span class="cpp-literal">256</span>];
        DWORD dwlen=<span class="cpp-keyword">sizeof</span>(pbuf);
        <span class="cpp-keyword">const</span><span class="cpp-keyword">char</span>* valname=<span class="cpp-string" nd="15">"Connection to adsl3"</span>;
        lret=RegQueryValueEx(hk,valname,NULL,&amp;dwtype,pbuf,&amp;dwlen);
        <span class="cpp-keyword">if</span>(lret!=ERROR_SUCCESS)
        {
            ShowError(lret);
        }
        pbuf[<span class="cpp-literal">8</span>] = <span class="cpp-literal">1</span>;<span class="cpp-comment">//enable proxy</span>
        pbuf[<span class="cpp-literal">4</span>]=pbuf[<span class="cpp-literal">4</span>]+<span class="cpp-literal">1</span>;
        lret=RegSetValueEx(hk,valname,NULL,REG_BINARY,pbuf,dwlen);
        RegCloseKey(hk);
    }
    DWORD dwret;
    SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL,SMTO_NORMAL,
        <span class="cpp-literal">1000</span>,&amp;dwret);
}</pre>
		<p nd="16">Problem with above code is that existing Internet Explorer instances don't know the change of settings. What is more, changing registry directly is not an elegant method. Then the following must be more attractive : </p>
		<div class="precollapse" id="premain2" style="WIDTH: 100%">
				<img id="preimg2" style="CURSOR: hand" height="9" src="http://www.codeproject.com/images/minus.gif" width="9" preid="2" />
				<span id="precollapse2" style="MARGIN-BOTTOM: 0px; CURSOR: hand" nd="17" preid="2">Collapse</span>
		</div>
		<pre id="pre2" style="MARGIN-TOP: 0px" nd="18">BOOL SetConnectionOptions(LPCTSTR conn_name,LPCTSTR proxy_full_addr)
{
    <span class="cpp-comment">//conn_name: active connection name. </span><span class="cpp-comment">//proxy_full_addr : eg "210.78.22.87:8000"</span>
    INTERNET_PER_CONN_OPTION_LIST list;
    BOOL    bReturn;
    DWORD   dwBufSize = <span class="cpp-keyword">sizeof</span>(list);
    <span class="cpp-comment">// Fill out list struct.</span>
    list.dwSize = <span class="cpp-keyword">sizeof</span>(list);
    <span class="cpp-comment">// NULL == LAN, otherwise connectoid name.</span>
    list.pszConnection = conn_name;
    <span class="cpp-comment">// Set three options.</span>
    list.dwOptionCount = <span class="cpp-literal">3</span>;
    list.pOptions = <span class="cpp-keyword">new</span> INTERNET_PER_CONN_OPTION[<span class="cpp-literal">3</span>];
    <span class="cpp-comment">// Make sure the memory was allocated.</span><span class="cpp-keyword">if</span>(NULL == list.pOptions)
    {
        <span class="cpp-comment">// Return FALSE if the memory wasn't allocated.</span>
        OutputDebugString(<span class="cpp-string" nd="19">"failed to allocat memory in SetConnectionOptions()"</span>);
        <span class="cpp-keyword">return</span> FALSE;
    }
    <span class="cpp-comment">// Set flags.</span>
    list.pOptions[<span class="cpp-literal">0</span>].dwOption = INTERNET_PER_CONN_FLAGS;
    list.pOptions[<span class="cpp-literal">0</span>].Value.dwValue = PROXY_TYPE_DIRECT |
        PROXY_TYPE_PROXY;

    <span class="cpp-comment">// Set proxy name.</span>
    list.pOptions[<span class="cpp-literal">1</span>].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
    list.pOptions[<span class="cpp-literal">1</span>].Value.pszValue = proxy_full_addr;<span class="cpp-comment">//"http://proxy:80";</span><span class="cpp-comment">// Set proxy override.</span>
    list.pOptions[<span class="cpp-literal">2</span>].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
    list.pOptions[<span class="cpp-literal">2</span>].Value.pszValue = <span class="cpp-string" nd="20">"local"</span>;

    <span class="cpp-comment">// Set the options on the connection.</span>
    bReturn = InternetSetOption(NULL,
        INTERNET_OPTION_PER_CONNECTION_OPTION, &amp;list, dwBufSize);

    <span class="cpp-comment">// Free the allocated memory.</span><span class="cpp-keyword">delete</span> [] list.pOptions;
    InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, <span class="cpp-literal">0</span>);
    InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, <span class="cpp-literal">0</span>);
    <span class="cpp-keyword">return</span> bReturn;
}
BOOL DisableConnectionProxy(LPCTSTR conn_name)
{
    <span class="cpp-comment">//conn_name: active connection name. </span>
    INTERNET_PER_CONN_OPTION_LIST list;
    BOOL    bReturn;
    DWORD   dwBufSize = <span class="cpp-keyword">sizeof</span>(list);
    <span class="cpp-comment">// Fill out list struct.</span>
    list.dwSize = <span class="cpp-keyword">sizeof</span>(list);
    <span class="cpp-comment">// NULL == LAN, otherwise connectoid name.</span>
    list.pszConnection = conn_name;
    <span class="cpp-comment">// Set three options.</span>
    list.dwOptionCount = <span class="cpp-literal">1</span>;
    list.pOptions = <span class="cpp-keyword">new</span> INTERNET_PER_CONN_OPTION[list.dwOptionCount];
    <span class="cpp-comment">// Make sure the memory was allocated.</span><span class="cpp-keyword">if</span>(NULL == list.pOptions)
    {
        <span class="cpp-comment">// Return FALSE if the memory wasn't allocated.</span>
        OutputDebugString(<span class="cpp-string" nd="21">"failed to allocat memory in DisableConnectionProxy()"</span>);
        <span class="cpp-keyword">return</span> FALSE;
    }
    <span class="cpp-comment">// Set flags.</span>
    list.pOptions[<span class="cpp-literal">0</span>].dwOption = INTERNET_PER_CONN_FLAGS;
    list.pOptions[<span class="cpp-literal">0</span>].Value.dwValue = PROXY_TYPE_DIRECT  ;
    <span class="cpp-comment">// Set the options on the connection.</span>
    bReturn = InternetSetOption(NULL,
        INTERNET_OPTION_PER_CONNECTION_OPTION, &amp;list, dwBufSize);
    <span class="cpp-comment">// Free the allocated memory.</span><span class="cpp-keyword">delete</span> [] list.pOptions;
    InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, <span class="cpp-literal">0</span>);
    InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, <span class="cpp-literal">0</span>);
    <span class="cpp-keyword">return</span> bReturn;
}</pre>
		<p nd="22">The usage is very straightforward:</p>
		<pre nd="23">
				<span class="cpp-comment">//set proxy</span>
				<span class="cpp-keyword">const</span>
				<span class="cpp-keyword">char</span>* connection_name=<span class="cpp-string" nd="24">"Connection to adsl3"</span>;
    SetConnectionOptions(connection_name,<span class="cpp-string" nd="25">"62.81.236.23:80"</span>);
<span class="cpp-comment">//disable proxy </span>
    DisableConnectionProxy(connection_name);
    </pre>
		<p nd="26">Existing Internet Explorer instances are notified by <code nd="27">INTERNET_OPTION_SETTINGS_CHANGED </code>and <code nd="28">INTERNET_OPTION_REFRESH </code></p>
<img src ="http://www.blogjava.net/ioriqw/aggbug/96026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2007-01-25 20:06 <a href="http://www.blogjava.net/ioriqw/articles/96026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visual Assist X 破解</title><link>http://www.blogjava.net/ioriqw/articles/85724.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Tue, 05 Dec 2006 16:29:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/85724.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/85724.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/85724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/85724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/85724.html</trackback:ping><description><![CDATA[
		<p> 发信人: xjwai (Shong), 信区: NewSoftware<br />标  题: Visual Assist X 破解报告<br />发信站: 水木社区 (Wed Sep 20 21:05:46 2006), 站内</p>
		<p>    好久没用VA了, 今天有人发了新版本1535, 就试了试, 先想用以前版本的code结果没有<br />成功. VA试用期一个月, 试用是全功能的, 这点还不错. 但是到期的话就不能继续了.这篇<br />短文的目的就是无限期扩展试用期, 使你能够尽情享受VA带来的快乐,  免去大家寻找破解<br />的痛苦,</p>
		<p>    本来不想发的, Visual Assist X确实做得不错.如果觉得VA好用, 请支持正版, 呵呵.</p>
		<p>    用到的工具: Registry Workshop, 附件中有一份.</p>
		<p>    以下的内容参考了一些网上的文章, 另外有一些猜测的成分, 请自担风险.</p>
		<p>    主要的方法就是消去VA记录下的一些安装及试用时间信息.VA记录这些信息的地方有三<br />个:</p>
		<p>1) HKEY_LOCAL_MACHINE\SOFTWARE\Licenses</p>
		<p>    这一个很好找. 建议加入Registry Workshop收藏夹.</p>
		<p>2)<br />HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{ACABBB00-02A4-CF3E-B293-188330493F10}</p>
		<p>    {XXX...}对于不同的版本以及不同的机器可能不同, 比如<br />{ACABBB00-02A4-CF3E-B293-188330493F10}是我XP虚拟机上的值, 我实际机器上的是<br />{2401839D-8A0E-F7A3-3A39-201EB8E3078D}.</p>
		<p>    要找到这一条, 就要用到Registry Workshop, 浏览至<br />HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\, 然后所有条目按时间倒序排序, 与<br />Visual Assist安装时间差不多的那几个(3~10个吧, 跟具体机器有关, 还有其他的软件吧)<br />逐一检查, 有一个的子项不规则, 而其他的都比较规则. 如</p>
		<p>{ACABBB00-02A4-CF3E-B293-188330493F10}<br />    fMNvzvRluw<br />    paowhf<br />    Jvielmgrzqpm<br />    durvuNbfybvH<br />    Psohy<br />    wqGi<br />    zydrzwfqWyFs<br />    InProcServer32</p>
		<p>而其他的一般是<br />{XXXXXXXX...}<br />    Description<br />    InprocServer32<br />    ProgID<br />    VersionIndependentProgID</p>
		<p>等等, 实际上目标项{ACABBB00-02A4-CF3E-B293-188330493F10}是VA的时间信息记录, 当然<br />只有VA的人知道它的格式了. 为掩人耳目, {ACABBB00-02A4-CF3E-B293-188330493F10} 又<br />合并另外的一个随机的已注册的CLSID, 因此当你看到<br />{ACABBB00-02A4-CF3E-B293-188330493F10} 下的 InprocServer32 好像是另外的某个感觉<br />很重要的东西, 我想, 如果你在 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\ 下搜索的<br />话, 应该搜得到它真正的条目.</p>
		<p>    找到<br />HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{ACABBB00-02A4-CF3E-B293-188330493F10<br />}或者你机器上的相应项后, 建议加入收藏夹.</p>
		<p>    3) 你的temp用户变量%USERPROFILE%\Local Settings\Temp 中的临时文件<br />1489AFE4.TMP.<br />如果你的Temp用户变量设置到了其他的地方(比如, 我的在F:\Temp\UTemp), 请到相应的位<br />置找到这个文件, 这个文件的修改时间和创建时间都与VA安装时间相差不多. 相信不难找到<br />. 具体的文件名可能和版本相关.<br />当然也可以把此目录全部清空, 一般情况下应该没有什么问题.</p>
		<p>    以上三处记录的信息应该是一样的, 破解时留下任何一处都不能成功. 卸载VA时, 这三<br />处的信息都保留着, 卸载VA然后重装的办法是行不通的. 就算重装系统, 如果你把temp用户<br />变量目录设到以前的位置且没有清理过, 则注册表是全新的估计也无济于事.</p>
		<p>    下面给一个简单的批处理的例子, 可能需要根据自己的情况和版本修改其中的一些数据</p>
		<p>    VAClean运行时请关闭Visual Studio</p>
		<p>####################### VAClean.cmd 开始 #######################</p>
		<p>@echo off</p>
		<p>rem 此两项请自行填写为合适的值<br />set cid={2401839D-8A0E-F7A3-3A39-201EB8E3078D}<br />set tpf="F:\Temp\UTemp\1489AFE4.TMP"</p>
		<p>reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Licenses /f<br />reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\%cid% /f<br />del /q %tpf%</p>
		<p>echo.<br />pause</p>
		<p>####################### VAClean.cmd 结束 #######################</p>
		<p>以上测试基于<br />Visual Assist X 10.3.1535.0<br />Visual Assist X 10.3.1534.0 (此方法以前的版本以及以后的若干个版本可能有效)<br />以及<br />Visual C++ 6<br />Visual Studio 2005<br />以及<br />XP SP2</p>
		<p>下载:<br /><a href="http://www.wholetomato.com/downloads/VA_X_Setup1301.exe">http://www.wholetomato.com/downloads/VA_X_Setup1301.exe</a><br /><a href="http://www.wholetomato.com/downloads/VA_X_Setup1534.exe">http://www.wholetomato.com/downloads/VA_X_Setup1534.exe</a><br /><a href="http://www.wholetomato.com/downloads/VA_X_Setup1535.exe">http://www.wholetomato.com/downloads/VA_X_Setup1535.exe</a></p>
		<p>--</p>
		<p>※ 来源:·水木社区 <a href="http://newsmth.net·[from/">http://newsmth.net·[FROM</a>: 166.111.86.*]</p>
		<p>附件: Registry_Workshop.rar (388 KB) 链接:<br /><a href="http://www.newsmth.net/att.php?p.99.950977.3575.rar">http://www.newsmth.net/att.php?p.99.950977.3575.rar</a><br />全文链接：<a href="http://www.newsmth.net/bbscon.php?bid=99&amp;id=950977">http://www.newsmth.net/bbscon.php?bid=99&amp;id=950977</a><br /></p>
		<br />
		<br />
		<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1258267</p>
<img src ="http://www.blogjava.net/ioriqw/aggbug/85724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-12-06 00:29 <a href="http://www.blogjava.net/ioriqw/articles/85724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在CB中用socket api来写网络通讯程序</title><link>http://www.blogjava.net/ioriqw/articles/44081.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Sat, 29 Apr 2006 12:52:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/44081.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/44081.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/44081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/44081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/44081.html</trackback:ping><description><![CDATA[
		<font color="#000080" size="2">本文转自csdn，作者：kingcaiyao<br />原标题：在C++ Builder中用socket api来写网络通讯程序（同时支持TCP和UDP协议）<br />原文:  http://www.csdn.net/develop/read_article.asp?id=19883<br /><br /><br />在7月4日看完sockcomp.pas后，我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议，于是我就去做，现将代码贴出来（已调试通过）<br />Socket api Client:<br /><br />#ifndef UDPClientH<br />#define UDPClientH<br />#include &lt;Classes.hpp&gt;<br />#include &lt;Controls.hpp&gt;<br />#include &lt;StdCtrls.hpp&gt;<br />#include &lt;Forms.hpp&gt;<br />#include &lt;stdio.h&gt;<br />#include "CCEdit.h"<br />#define WM_SOCK WM_USER+100<br />class TLANForm : public TForm<br />{<br />__published: // IDE-managed Components<br />   TEdit *Port;<br />   TLabel *Label1;<br />   TLabel *Label2;<br />   TComboBox *Prot;<br />   TButton *Button1;<br />   TLabel *Label3;<br />   TEdit *Addr;<br />   TCCEdit *TxtEdit;<br />   void __fastcall FormCreate(TObject *Sender);<br />   void __fastcall Button1Click(TObject *Sender);<br />   void __fastcall FormDestroy(TObject *Sender);<br />private: // User declarations<br />   void __fastcall OnRecv(TMessage &amp;Message);<br />public:  // User declarations<br />   __fastcall TLANForm(TComponent* Owner);<br />   BEGIN_MESSAGE_MAP<br />      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);<br />   END_MESSAGE_MAP(TForm);<br />};<br />extern PACKAGE TLANForm *LANForm;<br />#endif<br /><br /><br />.cpp File<br /><br />#include &lt;vcl.h&gt;<br />#pragma hdrstop<br />#include "UDPClient.h"<br />#include "WinSock.h"<br />#pragma package(smart_init)<br />#pragma link "CCEdit"<br />#pragma resource "*.dfm"<br />TLANForm *LANForm;<br />enum PROTO {TCP=0,UDP=1};<br />SOCKET m_Socket=INVALID_SOCKET;<br />PROTO m_Protocol=TCP;<br />__fastcall TLANForm::TLANForm(TComponent* Owner)<br />   : TForm(Owner)<br />{<br /><br />}<br />void __fastcall TLANForm::FormCreate(TObject *Sender)<br />{<br />   ::SendMessage(Prot-&gt;Handle,CB_SETCURSEL,0,0);<br />}<br />void __fastcall TLANForm::OnRecv(TMessage &amp;Message)<br />{<br />   char buf[4096];<br />   int nLen;<br />   struct sockaddr_in from;<br />   int nLength=sizeof(struct sockaddr_in);<br />   switch(WSAGETSELECTEVENT(Message.LParam))<br />   {<br />      case FD_READ:<br />         switch(m_Protocol)<br />         {<br />            case TCP:<br />               nLen=recv(m_Socket,buf,4096,0);<br />               if(nLen&gt;0){<br />                  buf[nLen]='\0';<br />                  TxtEdit-&gt;Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);<br />               }<br />               break;<br />            case UDP:<br />               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&amp;from,&amp;nLength);<br />               if(nLen&gt;0){<br />                  buf[nLen]='\0';<br />                  TxtEdit-&gt;Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);<br />               }<br />               break;<br />         }<br />         break;<br />      case FD_CLOSE:<br />         closesocket(m_Socket);<br />         break;<br />   }<br />}<br /><br />void __fastcall TLANForm::Button1Click(TObject *Sender)<br />{<br />   char szTmp[256],buf[4096];<br />   int nSize=0;<br />   UINT m_Port;<br />   AnsiString addr;<br />   addr=Addr-&gt;Text.Trim();<br />   if(addr.IsEmpty()){<br />      ::MessageBox(0,"Please enter the server IP!","Error",MB_OK+MB_ICONERROR);<br />      return;<br />   }<br />   unsigned long nAddr=inet_addr(addr.c_str());<br />   if(nAddr==INADDR_NONE){<br />      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);<br />      return;}<br /><br />   try<br />   {<br />      m_Port=Port-&gt;Text.ToInt();<br />   }<br />   catch(Exception &amp;e)<br />   {<br />      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);<br />      return;<br />   }<br />   switch(Prot-&gt;ItemIndex)<br />   {<br />      case 0:<br />         m_Protocol=TCP;<br />         break;<br />      case 1:<br />         m_Protocol=UDP;<br />         break;<br />   }<br />   if(TxtEdit-&gt;Text.IsEmpty()){<br />      ::MessageBox(0,"Please enter the text you want to send!","Error",MB_OK+MB_ICONERROR);<br />      return;}<br /><br />   //Initialize Winsocket<br />   WSAData wsaData;<br />   ::ZeroMemory(&amp;wsaData,sizeof(WSAData));<br />   WORD version=MAKEWORD(2,0);<br />   if(::WSAStartup(version,&amp;wsaData)){<br />      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());<br />      return;}<br /><br />   //Obtain the active connection<br />   char ComputerName[255];<br />   gethostname(ComputerName,255);<br />   struct hostent* he=gethostbyname(ComputerName);<br />   if(!he){<br />      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);<br />      ::WSACleanup();<br />      return;<br />   }<br />   //create new socket<br />   m_Socket=INVALID_SOCKET;<br />   switch(m_Protocol)<br />   {<br />      case TCP:<br />         m_Socket=socket(AF_INET,SOCK_STREAM,0);<br />         break;<br />      case UDP:<br />         m_Socket=socket(AF_INET,SOCK_DGRAM,0);<br />         break;<br />   }<br />   if(m_Socket==INVALID_SOCKET){<br />      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());<br />      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);<br />      ::WSACleanup();<br />      return;<br />   }<br />   //bind socket<br />   struct sockaddr_in client;<br />   unsigned long nClient;<br />   memcpy(&amp;nClient,he-&gt;h_addr_list[0],sizeof(int));<br />   if(nClient==INADDR_NONE){<br />      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);<br />      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);<br />      closesocket(m_Socket);<br />      ::WSACleanup();<br />      return;<br />   }<br />   client.sin_family=AF_INET;<br />   client.sin_port=0;<br />   client.sin_addr.S_un.S_addr=(int)nClient;<br />   if(bind(m_Socket,(struct sockaddr*)&amp;client,sizeof(struct sockaddr))){<br />      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);<br />      closesocket(m_Socket);<br />      ::WSACleanup();<br />      return;}<br />   //connect socket<br />   struct sockaddr_in To;<br />   To.sin_family=AF_INET;<br />   To.sin_port=htons(m_Port);<br />   To.sin_addr.S_un.S_addr=(int)nAddr;<br />   fd_set FDSET;<br />   FD_ZERO(&amp;FDSET);<br />   FD_SET(m_Socket,&amp;FDSET);<br /><br /><br />   if(m_Protocol==TCP){<br />      if(connect(m_Socket,(struct sockaddr*)&amp;To,sizeof(struct sockaddr))){<br />         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());<br />         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);<br />         closesocket(m_Socket);<br />         ::WSACleanup();<br />         return;<br />      }<br />      int nError=select(1,0,&amp;FDSET,0,0);<br />      if(nError&lt;=0){<br />      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());<br />      closesocket(m_Socket);<br />      ::WSACleanup();<br />      return;}<br />   }<br />   //Send data<br />   int nLen=TxtEdit-&gt;Text.Length();<br />   if(nLen&gt;4096){<br />      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");<br />      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);<br />      closesocket(m_Socket);<br />      ::WSACleanup();<br />      return;<br />   }<br />   strncpy(buf,TxtEdit-&gt;Text.c_str(),nLen);<br />   switch(m_Protocol)<br />   {<br />      case TCP:<br />         nSize=send(m_Socket,buf,nLen,0);<br />         //ShowMessage(nSize);<br />         break;<br />      case UDP:<br />         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&amp;To,sizeof(struct sockaddr));<br />         //ShowMessage(nSize);<br />         break;<br /><br />   }<br />   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){<br />      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());<br />      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);<br />      closesocket(m_Socket);<br />      ::WSACleanup();<br />      return;}<br />}<br />void __fastcall TLANForm::FormDestroy(TObject *Sender)<br />{<br />   closesocket(m_Socket);<br />   ::WSACleanup();<br />}<br /><br />Socket api Server:<br />.h File<br />#ifndef UDPServerH<br />#define UDPServerH<br />#include &lt;Classes.hpp&gt;<br />#include &lt;Controls.hpp&gt;<br />#include &lt;StdCtrls.hpp&gt;<br />#include &lt;Forms.hpp&gt;<br />#include &lt;stdio.h&gt;<br />#include "WinSock.h"<br />/*#define WM_SOCKET WM_USER+1000<br />#define INITSOCKETSUCCESS 0<br />#define INITSOCKETFAILURE 1<br />#define CREATELISTENSOCKETSUCCESS 2<br />#define CREATELISTENSOCKETFAILURE 3<br />#define SETLISTENSOCKETSUCCESS 4<br />#define SETLISTENSOCKETFAILURE 5<br />#define BINDLISTENSOCKETSUCCESS 6<br />#define BINDLISTENSOCKETFAILURE 7<br />#define LISTENSOCKETSUCCESS 8<br />#define LISTENSOCKETFAILURE 9<br />#define ACCEPTSOCKETSUCCESS 10<br />#define ACCEPTSOCKETFAILURE 11<br />*/<br />class TPSTNForm : public TForm<br />{<br />__published: // IDE-managed Components<br />   TEdit *Port;<br />   TLabel *Label1;<br />   TMemo *Memo1;<br />   TButton *Button1;<br />   TButton *Button2;<br />   TLabel *Label2;<br />   TComboBox *Prot;<br />   void __fastcall Button1Click(TObject *Sender);<br />   void __fastcall Button2Click(TObject *Sender);<br />   void __fastcall FormCreate(TObject *Sender);<br />   void __fastcall FormDestroy(TObject *Sender);<br />private: // User declarations<br />public:  // User declarations<br />   __fastcall TPSTNForm(TComponent* Owner);<br />};<br />enum PROTO {TCP,UDP};<br />class TCommunication:public TThread    //Communication Thread<br />{<br />private:<br />   SOCKET m_AcceptSocket;<br />   char szTmp[256];//ERROR MESSAGE<br />public:<br />   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);<br />   __fastcall ~TCommunication();<br />protected:<br />   virtual void __fastcall Execute();<br />};<br />class TListenThread:public TThread //Listen Thread<br />{<br />private:<br />   WSAData wsaData;<br />   struct sockaddr_in server;<br />   fd_set FDS;<br />   UINT m_Port;<br />   PROTO m_Protocol;<br />   char szTmp[256];//Error Message<br />public:<br />   SOCKET m_Socket;<br />   void __fastcall DoError();<br />   void __fastcall InitSocket();<br />   void __fastcall CreateListenSocket();<br />   void __fastcall SetListenSocket();<br />   void __fastcall BindListenSocket();<br />   void __fastcall ListenSocket();<br /><br />public:<br />   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);<br />   virtual __fastcall ~TListenThread();<br />protected:<br />   virtual void __fastcall Execute();<br />};<br />extern PACKAGE TPSTNForm *PSTNForm;<br />#endif<br />.cpp File<br />#include &lt;vcl.h&gt;<br />#pragma hdrstop<br />#include "UDPServer.h"<br />#pragma package(smart_init)<br />#pragma resource "*.dfm"<br />TPSTNForm *PSTNForm;<br />TListenThread *pThread=0;<br />//******************************CLASS TCommunication For TCP****************************************************<br />__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)<br />{<br />   m_AcceptSocket=m_Socket;<br />   szTmp[0]='\0';<br />   FreeOnTerminate=true;<br />}<br />__fastcall TCommunication::~TCommunication()<br />{<br />  // closesocket(m_AcceptSocket);<br />}<br />void __fastcall TCommunication::Execute()<br />{<br />   char buf[4096];<br />   int nSize=0;<br />   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);<br />   if(nSize&gt;0)<br />   {<br />      buf[nSize]='\0';<br />      //Display<br />      PSTNForm-&gt;Memo1-&gt;Lines-&gt;Add("Received Length:"+String(nSize));<br />      PSTNForm-&gt;Memo1-&gt;Lines-&gt;Add("Received:"+StrPas(buf));<br />      //Deliver<br />      ::Sleep(100);<br />      send(m_AcceptSocket,buf,nSize,0);<br />   }<br /><br />}<br />//******************************CLASS TListenThread*****************************************************<br />__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)<br />{<br />   m_Socket=INVALID_SOCKET;<br />   m_Port=m_PortA;<br />   m_Protocol=m_ProtocolA;<br />   szTmp[0]='\0';<br />   ::ZeroMemory(&amp;wsaData,sizeof(WSAData));<br />   ::ZeroMemory(&amp;server,sizeof(struct sockaddr_in));<br />   FreeOnTerminate=TRUE;//Automatically delete while terminating.<br />}<br />__fastcall TListenThread::~TListenThread()<br />{<br />   closesocket(m_Socket);<br />   ::WSACleanup();<br />   m_Socket=INVALID_SOCKET;<br />   m_Port=0;<br />   m_Protocol=TCP;<br />   szTmp[0]='\0';<br />   ::ZeroMemory(&amp;wsaData,sizeof(WSAData));<br />   ::ZeroMemory(&amp;server,sizeof(struct sockaddr_in));<br />}<br />void __fastcall TListenThread::DoError()<br />{<br />   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);<br />   WSACleanup();<br />   return;<br />}<br />void __fastcall TListenThread::InitSocket()<br />{<br />   WORD version=MAKEWORD(2,0);<br />   if(::WSAStartup(version,&amp;wsaData)){<br />      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());<br />      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);<br />      DoError();<br />      return;<br />   }<br />}<br />void __fastcall TListenThread::CreateListenSocket()<br />{<br />   switch(m_Protocol)<br />   {<br />      case UDP:<br />         m_Socket=socket(AF_INET,SOCK_DGRAM,0);<br />         break;<br />      case TCP:<br />         m_Socket=socket(AF_INET,SOCK_STREAM,0);<br />         break;<br />      default:<br />         sprintf(szTmp,"Error protocol!");<br />         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);<br />         DoError();<br />         break;<br />   }<br />   if(m_Socket==INVALID_SOCKET){<br />      sprintf(szTmp,"Failed to create socket!");<br />      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);<br />      DoError();<br />      return;<br />   }<br />}<br />void __fastcall TListenThread::SetListenSocket()<br />{<br />   server.sin_family=AF_INET;<br />   server.sin_port=htons(m_Port);<br />   server.sin_addr.S_un.S_addr=INADDR_ANY;<br />   int NewOpenType=SO_SYNCHRONOUS_NONALERT;<br />   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&amp;NewOpenType,4)){<br />      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());<br />      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);<br />      DoError();<br />      return;<br />   }<br />}<br />void __fastcall TListenThread::BindListenSocket()<br />{<br />    if(bind(m_Socket,(sockaddr*)&amp;server,sizeof(struct sockaddr_in))){<br />      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());<br />      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);<br />      DoError();<br />      return;<br />   }<br /><br />}<br />void __fastcall TListenThread::ListenSocket()<br />{<br />  if(listen(m_Socket,SOMAXCONN)){<br />     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());<br />     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);<br />     DoError();<br />     return;<br />  }<br />  //Determine whether there is any connection<br />  FD_ZERO(&amp;FDS);<br />  FD_SET(m_Socket,&amp;FDS);<br />}<br />void __fastcall TListenThread::Execute()<br />{<br />   char buf[4096];<br />   struct sockaddr_in from; //for UDP<br />   int nLen=sizeof(from),nSize=0;  //for UDP<br />   InitSocket();<br />   CreateListenSocket();<br />   SetListenSocket();<br />   BindListenSocket();<br />   if(m_Protocol==UDP){<br />      while(!Terminated){<br />         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&amp;from,&amp;nLen);<br />         if(nSize&gt;0){<br />            buf[nSize]='\0';<br />            PSTNForm-&gt;Memo1-&gt;Lines-&gt;Add("Received Length:"+String(nSize));<br />            PSTNForm-&gt;Memo1-&gt;Lines-&gt;Add("Received:"+StrPas(buf));<br />            ::Sleep(100);<br />            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&amp;from,sizeof(struct sockaddr_in));<br />         }<br />         else return;<br /><br />      }<br />   }<br />   ListenSocket();<br />   struct sockaddr_in client;<br />   int nLength=sizeof(struct sockaddr_in);<br />   while(!Terminated){<br />      int nError=select(1,&amp;FDS,0,0,0);<br />      if(nError&lt;=0) Terminate();<br />      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&amp;client,&amp;nLength);<br />      if(m_AcceptSocket==INVALID_SOCKET){<br />         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());<br />         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);<br />         DoError();<br />         Terminate();<br />         return;<br />      }<br />      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);<br />      pCThread-&gt;Terminate();<br />      pCThread-&gt;WaitFor();<br />   }<br />}<br />//************************PSTNForm*********************************************//<br />__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)<br />   : TForm(Owner)<br />{<br />}<br />void __fastcall TPSTNForm::Button1Click(TObject *Sender)<br />{<br />   Close();<br />}<br />void __fastcall TPSTNForm::Button2Click(TObject *Sender)<br />{<br />   if(pThread){<br />      pThread-&gt;Suspend();<br />      pThread-&gt;Terminate();<br />      delete pThread;<br />      pThread=0;<br />   }<br />   UINT m_Port;<br />   try<br />   {<br />      m_Port=Port-&gt;Text.ToInt();<br />   }<br />   catch(Exception &amp;e)<br />   {<br />      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);<br />      return;<br />   }<br />   PROTO m_Protocol;<br />   switch(Prot-&gt;ItemIndex)<br />   {<br />      case 0:<br />         m_Protocol=TCP;<br />         break;<br />      case 1:<br />         m_Protocol=UDP;<br />         break;<br />      default:<br />         break;<br />   }<br />   pThread=new TListenThread(m_Protocol,m_Port,FALSE);<br />   //pThread-&gt;Terminate();<br />}<br />void __fastcall TPSTNForm::FormCreate(TObject *Sender)<br />{<br />   ::SendMessage(Prot-&gt;Handle,CB_SETCURSEL,0,1);<br />}<br /><br />void __fastcall TPSTNForm::FormDestroy(TObject *Sender)<br />{<br />   if(pThread){<br />      pThread-&gt;Suspend();<br />      pThread-&gt;Terminate();}<br />}<br />上面的代码，各位可根据自已的需要和针对自已的应用，在数据处理方面加以改进就可以了</font>
<img src ="http://www.blogjava.net/ioriqw/aggbug/44081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-29 20:52 <a href="http://www.blogjava.net/ioriqw/articles/44081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于目录处理的一些函数</title><link>http://www.blogjava.net/ioriqw/articles/44078.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Sat, 29 Apr 2006 12:46:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/44078.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/44078.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/44078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/44078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/44078.html</trackback:ping><description><![CDATA[
		<font face="Arial" color="#808080" size="2">在编程时,经常有一些针对目录的操作,如打开目录对话框选择一个目录,直接创建多级目录,直接删除多级目录,判断某个目录是否存在等。本文就这些问题给出编程实现方法，并给出详细的程序代码，供各位编程爱好者参考。<br /><br />一、判断目录是否存在：<br /><br />  C++ Builder中提供了检查文件是否存在的函数FileExists，但没有提供检查目录是否存在的函数，我们可以用Windows API函数FindFirstFile实现这个功能。程序实现如下：<br /><br />设char *Dir为带判断的目录<br />bool Exist;                                            // 最后结果，表示目录是否存在<br />if(Dir[strlen(Dir)]=='\\')Dir[strlen(Dir)-1]='\0';    // 先删除最后的“\”<br />WIN32_FIND_DATA wfd;                                  // 查找<br />HANDLE hFind=FindFirstFile(Dir,&amp;wfd);                  <br />if(hFind==INVALID_HANDLE_VALUE)Exist=false;            // 没有找到配备，目录肯定不存在<br />else<br />{<br />    if(wfd.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY) // 检查找到的结果是否目录<br />        Exist=true;                                      // 是目录,目录存在<br />    else<br />        Exist=false;                                    // 是目录,目录不存在<br />    FindClose(hFind);<br />} <br /><br />二、打开目录选择对话框选择一个目录：<br /><br />  大多专业软件在要求输入目录的编辑框旁都放了一个按钮，点击后打开一个目录窗口，很多编程爱好者也希望能掌握这个方法。实现这个功能要调用Windows API函数SHBrowseForFolder，完整声明为WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder(LPBROWSEINFO lpbi)，返回一个ITEMIDLIST类型的指针，通过这个指针调用函数SHGetPathFromIDList可以确定所选择的目录的全名称。入参为BROWSEINFO结构的指针，这个结构较为复杂，成员如下所示：<br /><br />HWND hwndOwner;        // 拥有对话框的窗口，可以设置为Application-&gt;Handle <br />LPCITEMIDLIST pidlRoot; // ITEMIDLIST类型的指针,表示在哪个路径下选择，一般可以设置为NULL<br />LPSTR pszDisplayName;  // 选择后，所选目录的名称(不包含父级目录)被拷贝到这个指针指向的位置 <br />LPCSTR lpszTitle;      // 作为标题显示在对话框中目录树的上面，可以根据实际情况设置 <br />UINT ulFlags;          // 标志位，有点复杂，一般设置为BIF_RETURNONLYFSDIRS <br />BFFCALLBACK lpfn;      // 回调函数，一般不用，设置为NULL <br />LPARAM lParam;          // 预定义的对话框传递给回调函数的值<br />int iImage;            // 与所选目录相关联的图标在系统图标集合中的索引 <br />可以看出，使用函数SHBrowseForFolder还真麻烦，普通爱好者掌握它确实有一定的难度，现给出完整程序段如下： <br />#include &lt;shlobj.h&gt;                    // 必须包含的头文件<br />char SelectedDir[MAX_PATH];              // 最终结果<br />BROWSEINFO bi;                          // 入参<br />char FolderName[MAX_PATH];              // 所选目录名称，例如选择C:\Windows\Font,则为Font <br />LPITEMIDLIST ItemID;                    // 所选目录的系统标志指针<br /><br />memset(SelectedDir, 0, MAX_PATH);              // 初始化最终结果<br />memset(&amp;bi, 0, sizeof(BROWSEINFO));    // 初始化入参所有数据<br />bi.hwndOwner = Application-&gt;Handle;<br />bi.pszDisplayName = FolderName;<br />bi.lpszTitle = "请选择目录";            // 改成自己希望的<br />bi.ulFlags=BIF_RETURNONLYFSDIRS;<br />ItemID = SHBrowseForFolder(&amp;bi);      // 调用函数，打开目录选择对话框<br />if(ItemID)<br />{<br />    SHGetPathFromIDList(ItemID, SelectedDir);      // 获取所选目录的全名<br />    GlobalFree(ItemID);                      // 返回的ItemID占用了系统资源，不要忘了释放<br />} <br /><br />三、直接建立多级目录：<br /><br />  Windows API提供了建立目录的函数CreateDirectory，但是调用前要保证父目录必须存在，否则会失败。其实，有时越级建立多级目录很有用，因为在建立目录特别是建立多层目录时，层层加以判断会大大地增加程序的复杂程度。如何实现这个功能呢？本人用递归方法设计了一个可以直接建立多级目录的函数，现说明如下，供各位朋友参考。<br /><br />bool MakeDirectoryEx(const AnsiString &amp;P)  // 入参为打算创建的目录名,根据操作结果返回"true"或"false"<br />{<br />    if(P.IsEmpty())return false;<br />    int len=P.Length();<br />    char *Path=P.c_str();<br />    if(Path[len-1]=='\\')<br />    {<br />        len--;<br />        Path[len]='\0';<br />    }                                      // 删除末尾的"\"<br />    AnsiString Dir=Path;<br />    // 分开父目录和本身目录名称<br />    AnsiString Parent;<br />    for(int i=len-1;i&gt;0;i--)<br />    {<br />        if(Dir.IsPathDelimiter(i))<br />        {<br />            Parent=Dir.SubString(0,i);<br />            break;<br />        }<br />    }<br />    if(Parent.IsEmpty())return false; // 目录名称错误<br />    bool Ret=true;<br />    if(Parent.Length()&gt;3)          // 如果长度小于3，表示为磁盘根目录<br />        Ret=DirectoryExistEx(Parent.c_str());// 检查父目录是否存在<br />    if(!Ret)Ret=MakeDirectoryEx(Parent);  // 父目录不存在,递归调用创建父目录<br />    if(Ret)                                        // 父目录存在,直接创建目录<br />    {<br />        SECURITY_ATTRIBUTES sa;<br />        sa.nLength=sizeof(SECURITY_ATTRIBUTES);<br />        sa.lpSecurityDescriptor=NULL;<br />        sa.bInheritHandle=0;<br />        Ret=CreateDirectory(Path,&amp;sa);<br />    }<br />    return Ret;<br />} <br />    可以看出基本方法是:<br />先检查父目录是否存在，这里用到的函数DirectoryExistEx可以按照前面介绍的方法设计； <br />如果父目录存在，则直接创建目录,否则自我调用创建父目录。 <br /><br /><br />四、直接删除整个目录：<br /><br />  在DOS下有一个Deltree命令，用来删除整个目录，这是一个很有用的功能，可惜，Windows API提供的函数RemoveDirectory只能删除控目录，就像DOS的RD命令一样。编程实现这个功能同样需要递归方法，基本流程是： <br /><br />查找目录下的所有文件和目录，即调用API函数FindFirstFile、FindNextFile(*.*) <br />如果找到文件，则强制删除。所谓强制删除，即删除前先调用SetFileAttributes把它的属性设置为Normal，然后调用DeleteFile删除它。 <br />如果找到目录，则进行自我调用，即开始递归过程。 <br />如果没有找到目录，即表示为控目录，调用RemoveDirectory直接删除。 <br />具体程序代码如下：<br /><br />bool DeleteDirectoryEx(const AnsiString &amp;P)<br />{<br />    if(P.IsEmpty() || P.Length()&lt;4)return false;        // 参数长度必须大于3，即不能为磁盘根目录或空白<br />    int len=P.Length();<br />    char *Path=P.c_str();<br />    AnsiString Dir=Path;<br />    if(Path[len-1]!='\\')Dir=Dir+'\\';<br />    AnsiString Files=Dir+"*.*";<br />    WIN32_FIND_DATA wfd;<br />    HANDLE hFind=FindFirstFile(Files.c_str(),&amp;wfd);<br />    bool Ret=true;<br />    AnsiString Tmp;<br />    if(hFind!=INVALID_HANDLE_VALUE)<br />    {<br />        bool bFind=true;<br />        while(bFind)<br />        {<br />            if(wfd.cFileName[0]!='.') // . ..<br />            {<br />                Tmp=Dir+wfd.cFileName;<br />                if(wfd.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)<br />                { // 删除所有子目录<br />                    Ret=Ret&amp;&amp;DeleteDirectoryEx(Tmp.c_str(),false);<br />                }else<br />                { // 删除所有文件<br />                    SetFileAttributes(Tmp.c_str(),FILE_ATTRIBUTE_NORMAL);<br />                    Ret=Ret&amp;&amp;DeleteFile(Tmp.c_str());<br />                }<br />            }<br />            bFind=FindNextFile(hFind,&amp;wfd);<br />        }<br />        FindClose(hFind);<br />    }<br />    if(Ret)return RemoveDirectory(Path);<br />    return false;<br />}</font>
<img src ="http://www.blogjava.net/ioriqw/aggbug/44078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-29 20:46 <a href="http://www.blogjava.net/ioriqw/articles/44078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软ping程序源代码完整版</title><link>http://www.blogjava.net/ioriqw/articles/43476.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Thu, 27 Apr 2006 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/43476.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/43476.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/43476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/43476.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/43476.html</trackback:ping><description><![CDATA[
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">作者:侯志江</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">编写自己的一个ping程序,可以说是许多人迈出网络编程的第一步吧!!这个ping程序的源代码经过我的修改和调试,基本上可以取代windows中自带的ping程序. 各个模块后都有我的详细注释和修改日志,希望能够对大家的学习有所帮助!!</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">/*  本程序的主要源代码来自MSDN网站, 笔者只是做了一些改进和注释! 另外需要注意的是在Build之前,必须加入ws2_32.lib库文件,否则会提示"error LNK2001:"的错误！*/</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">/******************************************************************************\ <br />| Version 1.1 修改记录:                                                                                                              | <br />|    &lt;1&gt; 解决了socket阻塞的问题,从而能够正确地处理超时的请求!                                                        | <br />|----------------------------------------------------------------------------------------------------| <br />| Version 1.2 修改记录:                                                                                                              | <br />|    &lt;1&gt; 增加了由用户控制发送ICMP包的数目的功能(即命令的第二个参数).                                              |    <br />|    &lt;2&gt; 增加了对ping结果的统计功能.                                                                                           | <br />\******************************************************************************/ </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">#pragma pack(4) </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">#include <br />#include <br />#include </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">#define ICMP_ECHO 8 <br />#define ICMP_ECHOREPLY 0 </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">#define ICMP_MIN 8 // minimum 8 byte icmp packet (just header) </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">/* The IP header */ <br />typedef struct iphdr { <br />unsigned int h_len:4; // length of the header <br />unsigned int version:4; // Version of IP <br />unsigned char tos; // Type of service <br />unsigned short total_len; // total length of the packet <br />unsigned short ident; // unique identifier <br />unsigned short frag_and_flags; // flags <br />unsigned char ttl; <br />unsigned char proto; // protocol (TCP, UDP etc) <br />unsigned short checksum; // IP checksum </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">unsigned int sourceIP; <br />unsigned int destIP; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">}IpHeader; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">// <br />// ICMP header <br />// <br />typedef struct icmphdr { <br />BYTE i_type; <br />BYTE i_code; /* type sub code */ <br />USHORT i_cksum; <br />USHORT i_id; <br />USHORT i_seq; <br />/* This is not the std header, but we reserve space for time */ <br />ULONG timestamp; <br />}IcmpHeader; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">#define STATUS_FAILED 0xFFFF <br />#define DEF_PACKET_SIZE    32 <br />#define DEF_PACKET_NUMBER  4    /* 发送数据报的个数 */ <br />#define MAX_PACKET 1024 </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s)) <br />#define xfree(p) HeapFree (GetProcessHeap(),0,(p)) </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">void fill_icmp_data(char *, int); <br />USHORT checksum(USHORT *, int); <br />int decode_resp(char *,int ,struct sockaddr_in *); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">void Usage(char *progname){ </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">fprintf(stderr,"Usage:\n"); <br />fprintf(stderr,"%s [number of packets] [data_size]\n",progname); <br />fprintf(stderr,"datasize can be up to 1Kb\n"); <br />ExitProcess(STATUS_FAILED); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">} <br />int main(int argc, char **argv){ </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">WSADATA wsaData; <br />SOCKET sockRaw; <br />struct sockaddr_in dest,from; <br />struct hostent * hp; <br />int bread,datasize,times; <br />int fromlen = sizeof(from); <br />int timeout = 1000; <br />int statistic = 0;  /* 用于统计结果 */  <br />char *dest_ip; <br />char *icmp_data; <br />char *recvbuf; <br />unsigned int addr=0; <br />USHORT seq_no = 0; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">if (WSAStartup(MAKEWORD(2,1),&amp;wsaData) != 0){ <br />fprintf(stderr,"WSAStartup failed: %d\n",GetLastError()); <br />ExitProcess(STATUS_FAILED); <br />} </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">if (argc &lt;2 ) { <br />Usage(argv[0]); <br />} <br />sockRaw = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL, 0,WSA_FLAG_OVERLAPPED); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">// <br />//注：为了使用发送接收超时设置(即设置SO_RCVTIMEO, SO_SNDTIMEO)， <br />//    必须将标志位设为WSA_FLAG_OVERLAPPED ! <br />// </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">if (sockRaw == INVALID_SOCKET) { <br />fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError()); <br />ExitProcess(STATUS_FAILED); <br />} <br />bread = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&amp;timeout, <br />sizeof(timeout)); <br />if(bread == SOCKET_ERROR) { <br />fprintf(stderr,"failed to set recv timeout: %d\n",WSAGetLastError()); <br />ExitProcess(STATUS_FAILED); <br />} <br />timeout = 1000; <br />bread = setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&amp;timeout, <br />sizeof(timeout)); <br />if(bread == SOCKET_ERROR) { <br />fprintf(stderr,"failed to set send timeout: %d\n",WSAGetLastError()); <br />ExitProcess(STATUS_FAILED); <br />} <br />memset(&amp;dest,0,sizeof(dest)); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">hp = gethostbyname(argv[1]); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">if (!hp){ <br />addr = inet_addr(argv[1]); <br />} <br />if ((!hp) &amp;&amp; (addr == INADDR_NONE) ) { <br />fprintf(stderr,"Unable to resolve %s\n",argv[1]); <br />ExitProcess(STATUS_FAILED); <br />} </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">if (hp != NULL) <br />memcpy(&amp;(dest.sin_addr),hp-&gt;h_addr,hp-&gt;h_length); <br />else <br />dest.sin_addr.s_addr = addr; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">if (hp) <br />dest.sin_family = hp-&gt;h_addrtype; <br />else <br />dest.sin_family = AF_INET; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">dest_ip = inet_ntoa(dest.sin_addr); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">// <br />//  atoi函数原型是: int atoi( const char *string ); <br />//  The return value is 0 if the input cannot be converted to an integer ! <br />// <br />if(argc&gt;2) <br />{ <br /> times=atoi(argv[2]); <br /> if(times == 0) <br />  times=DEF_PACKET_NUMBER; <br />} <br />else <br />    times=DEF_PACKET_NUMBER; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">if (argc &gt;3) <br />{ <br /> datasize = atoi(argv[3]); <br />    if (datasize == 0) <br />        datasize = DEF_PACKET_SIZE; <br /> if (datasize &gt;1024)   /* 用户给出的数据包大小太大 */ <br /> { <br />  fprintf(stderr,"WARNING : data_size is too large !\n"); <br />  datasize = DEF_PACKET_SIZE; <br /> } <br />} <br />else <br />    datasize = DEF_PACKET_SIZE; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">datasize += sizeof(IcmpHeader); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">icmp_data = (char*)xmalloc(MAX_PACKET); <br />recvbuf = (char*)xmalloc(MAX_PACKET); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">if (!icmp_data) { <br />fprintf(stderr,"HeapAlloc failed %d\n",GetLastError()); <br />ExitProcess(STATUS_FAILED); <br />} </font>
		</p>
		<p>
				<br />
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">memset(icmp_data,0,MAX_PACKET); <br />fill_icmp_data(icmp_data,datasize); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">// <br />//显示提示信息 <br />// <br />fprintf(stdout,"\nPinging %s ....\n\n",dest_ip); </font>
		</p>
		<p>
				<br />
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">for(int i=0;i{ <br />int bwrote; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">((IcmpHeader*)icmp_data)-&gt;i_cksum = 0; <br />((IcmpHeader*)icmp_data)-&gt;timestamp = GetTickCount(); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">((IcmpHeader*)icmp_data)-&gt;i_seq = seq_no++; <br />((IcmpHeader*)icmp_data)-&gt;i_cksum = checksum((USHORT*)icmp_data,datasize); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&amp;dest,sizeof(dest)); <br />if (bwrote == SOCKET_ERROR){ <br />if (WSAGetLastError() == WSAETIMEDOUT) { <br />printf("Request timed out.\n"); <br />continue; <br />} <br />fprintf(stderr,"sendto failed: %d\n",WSAGetLastError()); <br />ExitProcess(STATUS_FAILED); <br />} <br />if (bwrote &lt; datasize ) { <br />fprintf(stdout,"Wrote %d bytes\n",bwrote); <br />} <br />bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&amp;from,&amp;fromlen); <br />if (bread == SOCKET_ERROR){ <br />if (WSAGetLastError() == WSAETIMEDOUT) { <br />printf("Request timed out.\n"); <br />continue; <br />} <br />fprintf(stderr,"recvfrom failed: %d\n",WSAGetLastError()); <br />ExitProcess(STATUS_FAILED); <br />} <br />if(!decode_resp(recvbuf,bread,&amp;from)) <br /> statistic++; /* 成功接收的数目++ */ <br />Sleep(1000); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">} <br />  <br />/* <br />Display the statistic result <br />*/ <br />fprintf(stdout,"\nPing statistics for %s \n",dest_ip); <br />fprintf(stdout,"    Packets: Sent = %d,Received = %d, Lost = %d (%2.0f%% loss)\n",times, <br />     statistic,(times-statistic),(float)(times-statistic)/times*100); </font>
		</p>
		<p>
				<br />
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">WSACleanup(); <br />return 0; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">} <br />/* <br />The response is an IP packet. We must decode the IP header to locate <br />the ICMP data <br />*/ <br />int decode_resp(char *buf, int bytes,struct sockaddr_in *from) { </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">IpHeader *iphdr; <br />IcmpHeader *icmphdr; <br />unsigned short iphdrlen; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">iphdr = (IpHeader *)buf; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">iphdrlen = (iphdr-&gt;h_len) * 4 ; // number of 32-bit words *4 = bytes </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">if (bytes &lt; iphdrlen + ICMP_MIN) { <br />printf("Too few bytes from %s\n",inet_ntoa(from-&gt;sin_addr)); <br />} </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">icmphdr = (IcmpHeader*)(buf + iphdrlen); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">if (icmphdr-&gt;i_type != ICMP_ECHOREPLY) { <br />fprintf(stderr,"non-echo type %d recvd\n",icmphdr-&gt;i_type); <br />return 1; <br />} <br />if (icmphdr-&gt;i_id != (USHORT)GetCurrentProcessId()) { <br />fprintf(stderr,"someone else's packet!\n"); <br />return 1; <br />} <br />printf("%d bytes from %s:",bytes, inet_ntoa(from-&gt;sin_addr)); <br />printf(" icmp_seq = %d. ",icmphdr-&gt;i_seq); <br />printf(" time: %d ms ",GetTickCount()-icmphdr-&gt;timestamp); <br />printf("\n"); <br />return 0; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">} </font>
		</p>
		<p>
				<br />
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">USHORT checksum(USHORT *buffer, int size) { </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">unsigned long cksum=0; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">while(size &gt;1) { <br />cksum+=*buffer++; <br />size -=sizeof(USHORT); <br />} </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">if(size) { <br />cksum += *(UCHAR*)buffer; <br />} </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff); <br />cksum += (cksum &gt;&gt;16); <br />return (USHORT)(~cksum); <br />} <br />/* <br />Helper function to fill in various stuff in our ICMP request. <br />*/ <br />void fill_icmp_data(char * icmp_data, int datasize){ </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">IcmpHeader *icmp_hdr; <br />char *datapart; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">icmp_hdr = (IcmpHeader*)icmp_data; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">icmp_hdr-&gt;i_type = ICMP_ECHO; <br />icmp_hdr-&gt;i_code = 0; <br />icmp_hdr-&gt;i_id = (USHORT)GetCurrentProcessId(); <br />icmp_hdr-&gt;i_cksum = 0; <br />icmp_hdr-&gt;i_seq = 0; </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">datapart = icmp_data + sizeof(IcmpHeader); <br />// <br />// Place some junk in the buffer. <br />// <br />memset(datapart,'E', datasize - sizeof(IcmpHeader)); </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">} </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">/******************* 附: ping命令执行时显示的画面 ***************\ <br />*  C:\Documents and Settings\houzhijiang&gt;ping 236.56.54.12               * <br />*                                                                                                      * <br />*  Pinging 236.56.54.12 with 32 bytes of data:                                      * <br />*                                                                                                      * <br />*  Request timed out.                                                                         * <br />*  Request timed out.                                                                         * <br />*  Request timed out.                                                                         * <br />*  Request timed out.                                                                         * <br />*                                                                                                      * <br />*  Ping statistics for 236.56.54.12:                                                      * <br />*     Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),                  * <br />*                                                                                                      * <br />\*********************************************************/ </font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #000000" face="Arial" color="#ffff00" size="2">/*********************************************************\ <br />*  C:\Documents and Settings\houzhijiang&gt;ping 127.0.0.1                    * <br />*                                                                                                     * <br />*  Pinging 127.0.0.1 with 32 bytes of data:                                          * <br />*                                                                                                     * <br />*  Reply from 127.0.0.1: bytes=32 time&lt;1ms TTL=128                        * <br />*  Reply from 127.0.0.1: bytes=32 time&lt;1ms TTL=128                        * <br />*  Reply from 127.0.0.1: bytes=32 time&lt;1ms TTL=128                        * <br />*  Reply from 127.0.0.1: bytes=32 time&lt;1ms TTL=128                        * <br />*                                                                                                     * <br />*  Ping statistics for 127.0.0.1:                                                          * <br />*     Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),                    * <br />*  Approximate round trip times in milli-seconds:                                 * <br />*     Minimum = 0ms, Maximum = 0ms, Average = 0ms                        * <br />*                                                                                                    * <br />\********************************************************/ <br /></font>
		</p>
<img src ="http://www.blogjava.net/ioriqw/aggbug/43476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-27 09:44 <a href="http://www.blogjava.net/ioriqw/articles/43476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>