﻿<?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>C++博客-天书的博客</title><link>http://www.cppblog.com/skybook/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 04 Dec 2008 20:25:20 GMT</lastBuildDate><pubDate>Thu, 04 Dec 2008 20:25:20 GMT</pubDate><ttl>60</ttl><item><title>取光标所在行号   [DllImport("user32")]  public static extern bool GetCaretPos(ref   System.Drawing.Point lpPoint);   using System.Runtime.InteropServices;</title><link>http://www.cppblog.com/skybook/archive/2008/12/02/68359.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Tue, 02 Dec 2008 03:16:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2008/12/02/68359.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/68359.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2008/12/02/68359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/68359.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/68359.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff00ff; BACKGROUND-COLOR: #ccffff"><strong>&nbsp;using System.Runtime.InteropServices;<br><br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [DllImport("user32")]<br></strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static extern bool GetCaretPos(ref&nbsp;&nbsp; System.Drawing.Point lpPoint);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void&nbsp; GetCurRowNo()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Point P = new Point(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetCaretPos(ref&nbsp;&nbsp; P);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int Pos = txtCmdInput.GetCharIndexFromPosition(P);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_iCurRowNo = txtCmdInput.GetLineFromCharIndex(Pos);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_iCurRowNo = -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}</p>
<img src ="http://www.cppblog.com/skybook/aggbug/68359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2008-12-02 11:16 <a href="http://www.cppblog.com/skybook/archive/2008/12/02/68359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个线程中创建的控件不能成为另一个线程中创建的控件的父级——解决办法（委托）</title><link>http://www.cppblog.com/skybook/archive/2008/11/19/67255.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Wed, 19 Nov 2008 01:25:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2008/11/19/67255.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/67255.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2008/11/19/67255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/67255.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/67255.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在MonitorWnd.cs类中:事件处理函数：//tabControl1是Form窗体中创建的控件,也就是UI线程中创建的控件//要在事件处理函数中动态的创建TabPage，这个事件处理函数是被另一个read线程调用的&nbsp; private void MonitorWnd_Load(object sender, EventArgs e)&nbsp;&nbsp;&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.cppblog.com/skybook/archive/2008/11/19/67255.html'>阅读全文</a><img src ="http://www.cppblog.com/skybook/aggbug/67255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2008-11-19 09:25 <a href="http://www.cppblog.com/skybook/archive/2008/11/19/67255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线程关闭窗体时所有线程都退出的方法    readThread.IsBackground = true;</title><link>http://www.cppblog.com/skybook/archive/2008/11/19/67254.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Wed, 19 Nov 2008 01:11:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2008/11/19/67254.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/67254.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2008/11/19/67254.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/67254.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/67254.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readThread = new Thread(new ThreadStart(Read));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readThread<span style="COLOR: #ff0000; BACKGROUND-COLOR: #ffff99">.IsBackground = true;<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readThread.Start()
<img src ="http://www.cppblog.com/skybook/aggbug/67254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2008-11-19 09:11 <a href="http://www.cppblog.com/skybook/archive/2008/11/19/67254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# 打开IE网页 Process.Start("")   using System.Diagnostics;</title><link>http://www.cppblog.com/skybook/archive/2008/11/14/66881.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Fri, 14 Nov 2008 01:56:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2008/11/14/66881.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/66881.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2008/11/14/66881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/66881.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/66881.html</trackback:ping><description><![CDATA[如果要做在程序里面，用WEBBROWSER，如果要打开IE让单独运行，用Process.Start("")你机器上的IE程序即可<br><br>Process 命名空间 :&nbsp; using System.Diagnostics;
<img src ="http://www.cppblog.com/skybook/aggbug/66881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2008-11-14 09:56 <a href="http://www.cppblog.com/skybook/archive/2008/11/14/66881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xml文档读结点值</title><link>http://www.cppblog.com/skybook/archive/2008/11/12/66728.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Wed, 12 Nov 2008 08:35:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2008/11/12/66728.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/66728.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2008/11/12/66728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/66728.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/66728.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void ReadMutualXML()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strFilePath = Application.StartupPath + "\\" + "MutualConfig.xml";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlDocument xmlDoc = new XmlDocument();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlDoc.Load(strFilePath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XmlNode xn = xmlDoc.SelectSingleNode("Mutual");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (XmlNode cxn in xn.ChildNodes)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cxn.Name.Equals("IP"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_proxyIP = cxn.InnerText;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (cxn.Name.Equals("Port"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_proxyPort = Convert.ToInt32(cxn.InnerText);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (cxn.Name.Equals("UserName"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_username = cxn.InnerText;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (cxn.Name.Equals("Password"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_password = cxn.InnerText;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<img src ="http://www.cppblog.com/skybook/aggbug/66728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2008-11-12 16:35 <a href="http://www.cppblog.com/skybook/archive/2008/11/12/66728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCPClient 多对多聊天</title><link>http://www.cppblog.com/skybook/archive/2008/11/08/66305.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Sat, 08 Nov 2008 02:53:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2008/11/08/66305.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/66305.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2008/11/08/66305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/66305.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/66305.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 调用过程://初始化&nbsp; 始终开着服务器端进程监听有没有发消息过来的客户&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void MutualWnd_Load(object sender, EventArgs e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/skybook/archive/2008/11/08/66305.html'>阅读全文</a><img src ="http://www.cppblog.com/skybook/aggbug/66305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2008-11-08 10:53 <a href="http://www.cppblog.com/skybook/archive/2008/11/08/66305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visual C#.Net 网络程序开发-Socket篇(转载)</title><link>http://www.cppblog.com/skybook/archive/2008/11/01/65671.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Sat, 01 Nov 2008 02:44:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2008/11/01/65671.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/65671.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2008/11/01/65671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/65671.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/65671.html</trackback:ping><description><![CDATA[<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.Net Framework为应用程序访问Internet<a id=vad_6 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,6,fxEvent);" style="FONT-SIZE: 1em; CURSOR: pointer; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,6)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10760&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//www.qunar.com/twell/redirect.jsp%3Furl%3Dhttp%3A//www.qunar.com%3Fhj%3Dnw_P0T0M0&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=101917&amp;k=%u63D0%u4F9B" target=_blank name=6>提供</a>了分层的、可扩展的以及受管辖的网络</span><a id=vad_2 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,2,fxEvent);" style="FONT-SIZE: 1em; CURSOR: hand; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,2)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10735&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//ag.weelaa.com/reg.php%3Fid%3Dcpc020&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=400249&amp;k=%u670D%u52A1" target=_blank name=2>服务</a><span><span>，其名字空间System.Net和System.Net.Sockets包含丰富的类<a id=vad_8 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,8,fxEvent);" style="FONT-SIZE: 1em; CURSOR: hand; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,8)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10745&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//www.kaien.net.cn/vogate&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=461030&amp;k=%u53EF%u4EE5" target=_blank name=8>可以</a><span><span><span>开发多种网络应用程序。.Net类采用的分层<a id=vad_17 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,17,fxEvent);" style="FONT-SIZE: 1em; CURSOR: pointer; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,17)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10501&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//www.vancl.com/websource/websource.aspx%3Furl%3Dhttp%3A//www.vancl.com/%26source%3Dvogate&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=166161&amp;k=%u7ED3%u6784" target=_blank name=17>结构</a>允许应用程序在不同的</span><a id=vad_11 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,11,fxEvent);" style="FONT-SIZE: 1em; CURSOR: hand; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,11)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10485&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//auction1.taobao.com/auction/item_detail-0db1-6fa912772dc0e1403df25afb16fc31e2.jhtml&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=892832&amp;k=%u63A7%u5236" target=_blank name=11>控制</a><span>级别上访问网络，开发人员可以根据<a id=vad_13 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,13,fxEvent);" style="FONT-SIZE: 1em; CURSOR: pointer; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,13)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10760&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//www.qunar.com/twell/redirect.jsp%3Furl%3Dhttp%3A//www.qunar.com%3Fhj%3Dnw_P0T0M0&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=968509&amp;k=%u9700%u8981" target=_blank name=13>需要</a></span></span></span></span><a id=vad_3 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,3,fxEvent);" style="FONT-SIZE: 1em; CURSOR: pointer; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,3)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10734&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//ag.weelaa.com/reg.php%3Fid%3Dcpc020&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=923812&amp;k=%u9009%u62E9" target=_blank name=3>选择</a><span><span>针对不同的级别编制程序，这些级别几乎囊括了Internet的所有需要--从socket套接字到普通的请求/响应，更重要的是，这种分层是可以扩展的，能够适应Internet不断扩展的需要。 </span></span></span></span><br><br><span><span>抛开ISO/OSI<a id=vad_9 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,9,fxEvent);" style="FONT-SIZE: 1em; CURSOR: pointer; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,9)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10744&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//www.kaien.net.cn/vogate&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=248226&amp;k=%u6A21%u578B" target=_blank name=9>模型</a>的7层构架，单从TCP/IP模型上的逻辑层面上看，.Net类可以视为包含3个层次：请求/响应层、应用协议层、传输层。WebReqeust和WebResponse 代表了请求/响应层，支持Http、Tcp和Udp的类组成了应用协议层，而Socket类处于传输层。可以如下示意： </span></span><br><br><br><span><span>可见，传输层位于这个结构的最底层，当其上面的应用协议层和请求/响应层不能满足应用程序的特殊需要时，就需要使用这一层进行Socket套接字编程。 </span></span><br><br><span><span><span><span><span><span>而在.Net中，System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。System.Net 命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上，如TCPClient、TCPListener 和 UDPClient 类封装有关创建到 Internet 的 TCP 和 UDP 连接的详细信息；NetworkStream类则提供用于网络访问的</span></span></span></span><a id=vad_5 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,5,fxEvent);" style="FONT-SIZE: 1em; CURSOR: pointer; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,5)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10761&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//www.qunar.com/twell/redirect.jsp%3Furl%3Dhttp%3A//www.qunar.com%3Fhj%3Dnw_P0T0M0&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=610245&amp;k=%u57FA%u7840" target=_blank name=5>基础</a><span>数据流等，常见的许多Internet服务都可以见到Socket的踪影，如Telnet、Http、Email、Echo等，这些服务尽管通讯协议Protocol的定义不同，但是其基础的传输都是采用的Socket。 </span></span></span><br><br><span><span><span>其实，Socket可以象流Stream一样被视为一个数据通道，这个通道架设在应用程序端（客户端）和<a id=vad_16 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,16,fxEvent);" style="FONT-SIZE: 1em; CURSOR: pointer; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,16)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10745&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//www.kaien.net.cn/vogate&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=590899&amp;k=%u8FDC%u7A0B" target=_blank name=16>远程</a>服务器端之间，而后，数据的读取（接收）和写入（发送）均针对这个通道来进行。 </span></span></span><br><br><span><span>可见，在应用程序端或者服务器端创建了Socket对象之后，就可以使用Send/SentTo方法将数据发送到连接的Socket,或者使用Receive/ReceiveFrom方法接收来自连接Socket的数据； </span></span><br><br><span><span><span><span>针对Socket编程，.NET 框架的 Socket 类是 Winsock32 API 提供的套接字服务的托管代码版本。其中为实现网络编程提供了大量的方法，大多数情况下，Socket 类方法只是将数据封送到它们的本机 Win32 副本中并处理任何必要的安全检查。如果你<a id=vad_14 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,14,fxEvent);" style="FONT-SIZE: 1em; CURSOR: pointer; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,14)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10743&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//www.kaien.net.cn/vogate&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=322321&amp;k=%u719F%u6089" target=_blank name=14>熟悉</a>Winsock API函数，那么用Socket类编写网络程序会非常容易，当然，如果你不曾接触过，也不会太困难，跟随下面的解说，你会发觉使用Socket类开发windows 网络应用程序原来有规可寻，它们在大多数情况下遵循大致相同的步骤。 </span></span></span></span><br><br><span><span>在使用之前，你需要首先创建Socket对象的实例，这可以通过Socket类的构造方法来实现： </span></span><br><br>public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType); <br><br><br><span>其中，addressFamily 参数指定 Socket 使用的寻址<a id=vad_7 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,7,fxEvent);" style="FONT-SIZE: 1em; CURSOR: pointer; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,7)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10762&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//www.qunar.com/twell/redirect.jsp%3Furl%3Dhttp%3A//hotel.qunar.com%3Fhj%3Dnw_P1T0M0&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=133454&amp;k=%u65B9%u6848" target=_blank name=7>方案</a>，socketType 参数指定 Socket 的类型，protocolType 参数指定 Socket 使用的协议。 </span><br><br>下面的示例语句创建一个 Socket，它可用于在基于 TCP/IP 的网络（如 Internet）上通讯。 <br><br>Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); <br><br><br><span>若要使用 UDP 而不是 TCP，需要更改协议类型，如下面的示例所示： </span><br><br>Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); <br><br><br><span><span><span><span>一旦创建 Socket，在客户端，你将可以通过Connect方法连接到指定的服务器，并通过Send/SendTo方法向远程服务器发送数据，而后可以通过Receive/ReceiveFrom从服务端接收数据；而在服务器端，你需要使用Bind方法绑定所指定的接口使Socket与一个本地终结点相联，并通过Listen方法侦听该接口上的请求，当侦听到用户端的连接时，调用Accept完成连接的操作，创建新的Socket以处理传入的连接请求。使用完 Socket 后，记住使用 Shutdown 方法禁用 Socket，并使用 Close 方法关闭 Socket。其间用到的方法/函数有： </span></span></span></span><br><br><span>Socket.Connect方法:建立到远程设备的连接 </span><br>public void Connect(EndPoint remoteEP)（有重载方法） <br>Socket.Send 方法:从数据中的指示位置开始将数据发送到连接的 Socket。 <br>public int Send(byte[], int, SocketFlags);(有重载方法) <br>Socket.SendTo 方法 将数据发送到特定终结点。 <br>public int SendTo(byte[], EndPoint);（有重载方法） <br>Socket.Receive方法:将数据从连接的 Socket 接收到接收缓冲区的特定位置。 <br>public int Receive(byte[],int,SocketFlags); <br>Socket.ReceiveFrom方法：接收数据缓冲区中特定位置的数据并存储终结点。 <br>public int ReceiveFrom(byte[], int, SocketFlags, ref EndPoint); <br>Socket.Bind 方法：使 Socket 与一个本地终结点相关联： <br>public void Bind( EndPoint localEP ); <br>Socket.Listen方法：将 Socket 置于侦听状态。 <br>public void Listen( int backlog ); <br>Socket.Accept方法:创建新的 Socket 以处理传入的连接请求。 <br>public Socket Accept(); <br>Socket.Shutdown方法:禁用某 Socket 上的发送和接收 <br>public void Shutdown( SocketShutdown how ); <br>Socket.Close方法:强制 Socket 连接关闭 <br>public void Close(); <br><br><br><span><span><span><span>可以看出，以上许多方法包含EndPoint类型的参数，在Internet中，TCP/IP 使用一个网络地址和一个服务端口号来唯一标识设备。网络地址标识网络上的特定设备；端口号标识要连接到的该设备上的特定服务。网络地址和服务端口的组合称为终结点，在 .NET 框架中正是由 EndPoint 类表示这个终结点，它提供表示网络资源或服务的抽象，用以标志网络地址等信息。.Net同时也为<a id=vad_12 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,12,fxEvent);" style="FONT-SIZE: 1em; CURSOR: pointer; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,12)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10671&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//v.szinfo.com&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=447775&amp;k=%u6BCF%u4E2A" target=_blank name=12>每个</a>受支持的地址族定义了 EndPoint 的子代；对于 IP 地址族，该类为 IPEndPoint。IPEndPoint 类包含应用程序连接到主机上的服务所需的主机和端口信息，通过组合服务的主机IP地址和端口号，IPEndPoint 类形成到服务的连接点。 </span></span></span></span><br><br><span><span>用到IPEndPoint类的时候就不可避免地涉及到<a id=vad_15 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,15,fxEvent);" style="FONT-SIZE: 1em; CURSOR: pointer; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,15)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10742&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//www.kaien.net.cn/vogate&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=117233&amp;k=%u8BA1%u7B97%u673A" target=_blank name=15>计算机</a>IP地址，.Net中有两种类可以得到IP地址实例： </span></span><br><br><span>IPAddress类：IPAddress 类包含计算机在 IP 网络上的地址。其Parse方法可将 IP 地址字符串转换为 IPAddress 实例。下面的语句创建一个 IPAddress 实例： </span><br><br>IPAddress myIP = IPAddress.Parse("192.168.1.2"); <br><br><br><span><span><span>Dns 类：向使用 TCP/IP Internet 服务的应用程序提供域名服务。其Resolve 方法查询 DNS 服务器以将用户友好的域名（如"host.contoso.com"）映射到数字形式的 Internet 地址（如 192.168.1.1）。Resolve方法 返回一个 IPHostEnty 实例，该实例包含所请求名称的地址和别名的列表。大多数情况下，可以使用 AddressList 数组中返回的第一个地址。下面的代码获取一个 IPAddress 实例，该实例包含服务器 host.contoso.com 的 IP 地址。 </span></span></span><br><br>IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com"); <br>IPAddress ipAddress = ipHostInfo.AddressList[0]; <br><br><br><span>你也可以使用GetHostName方法得到IPHostEntry实例： </span><br><br>IPHosntEntry hostInfo=Dns.GetHostByName("host.contoso.com") <br><br><br><span>在使用以上方法时，你将可能需要处理以下几种异常： </span><br><br>SocketException异常：访问Socket时操作系统发生错误引发 <br><br>ArgumentNullException异常：参数为空引用引发 <br><br>ObjectDisposedException异常：Socket已经关闭引发 <br><br><span><span>在掌握上面得知识后，下面的代码将该服务器主机（ host.contoso.com的 IP 地址与端口号组合，以便为连接创建远程终结点： </span></span><br><br>IPEndPoint ipe = new IPEndPoint(ipAddress,11000); <br><br><br><span><span><span>确定了远程设备的地址并选择了用于连接的端口后，应用程序可以尝试建立与远程设备的连接。下面的示例使用现有的 IPEndPoint 实例与远程设备连接，并捕获可能引发的异常： </span></span></span><br><br>try { <br>s.Connect(ipe);//尝试连接 <br>} <br>//处理参数为空引用异常 <br>catch(ArgumentNullException ae) { <br>Console.WriteLine("ArgumentNullException : {0}", ae.ToString()); <br>} <br>//处理操作系统异常 <br>catch(SocketException se) { <br>Console.WriteLine("SocketException : {0}", se.ToString()); <br>} <br>catch(Exception e) { <br>Console.WriteLine("Unexpected exception : {0}", e.ToString()); <br>} <br><br><br><span><span>需要知道的是：Socket 类支持两种基本模式：同步和异步。其区别在于：在同步模式中，对执行网络操作的函数（如 Send 和 Receive）的调用一直等到操作完成后才将控制返回给调用程序。在异步模式中，这些调用立即返回。 </span></span><br><br><span><span><span><span>另外，很多时候，Socket编程视情况不同需要在客户端和服务器端分别予以实现，在客户端编制应用程序向服务端指定端口发送请求，同时编制服务端应用程序处理该请求，这个过程在上面的阐述中已经提及；当然，并非所有的Socket编程都需要你严格编写这两端程序；视应用情况不同，你可以在客户端构造出请求字符串，服务器相应端口捕获这个请求，交由其公用服务程序进行处理。以下事例语句中的字符串就向远程主机提出页面请求： </span></span></span></span><br><br>string Get = "GET / HTTP/1.1\r\nHost: " + server + "\r\nConnection: Close\r\n\r\n"; <br><br><br><span><span><span>远程主机指定端口接受到这一请求后，就可利用其公用服务程序进行处理而不需要另行编制服务器端应用程序。 </span></span></span><br><br><span><span><span>综合运用以上阐述的使用Visual C#进行Socket网络程序开发的知识，下面的程序段完整地实现了Web页面</span><a id=vad_4 onmouseover="this.style.borderBottom='2px #FF3366 solid';var fxEvent=arguments[0];kwmouseover(this,4,fxEvent);" style="FONT-SIZE: 1em; CURSOR: pointer; COLOR: #ff3366; BORDER-BOTTOM: #ff3366 1px dotted; TEXT-DECORATION: underline" onmouseout="this.style.borderBottom='1px #FF3366 dotted'; kwmouseout(this,4)" href="http://action.vogate.com/c/c.php?r=http%3A//www.google.cn/search%3Fhl%3Dzh-CN%26q%3Dc%2523+socket+receive%26meta%3D%26aq%3Df%26oq%3D&amp;aid=10698&amp;sid=6235007045041189&amp;click=1&amp;url=http%3A//ag.weelaa.com/reg.php%3Fid%3Dcpc020&amp;v=0&amp;s=http%3A//www.programfan.com/article/showarticle.asp%3Fid%3D1998&amp;rn=87453&amp;k=%u4E0B%u8F7D" target=_blank name=4>下载</a><span><span><span>功能。用户只需在窗体上输入远程主机名（Dns 主机名或以点分隔的四部分表示法格式的 IP 地址）和预保存的本地文件名，并利用专门提供Http服务的80端口，就可以获取远程主机页面并保存在本地机指定文件中。如果保存格式是.htm格式，你就可以在Internet浏览器中打开该页面。适当添加代码，你甚至可以实现一个简单的浏览器程序。 </span></span></span></span></span><br><br><br>实现此功能的主要源代码如下： <br><br>//"开始"按钮事件 <br>private void button1_Click(object sender, System.EventArgs e) { <br>//取得预保存的文件名 <br>string fileName=textBox3.Text.Trim(); <br><span>//远程主机 </span><br>string hostName=textBox1.Text.Trim(); <br>//端口 <br>int port=Int32.Parse(textBox2.Text.Trim()); <br>//得到主机信息 <br>IPHostEntry ipInfo=Dns.GetHostByName(hostName); <br>//取得IPAddress[] <br>IPAddress[] ipAddr=ipInfo.AddressList; <br>//得到ip <br>IPAddress ip=ipAddr[0]; <br><span>//组合出远程终结点 </span><br>IPEndPoint hostEP=new IPEndPoint(ip,port); <br>//创建Socket 实例 <br>Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); <br>try <br>{ <br>//尝试连接 <br>socket.Connect(hostEP); <br>} <br>catch(Exception se) <br>{ <br>MessageBox.Show("连接错误"+se.Message,"提示信息 <br>,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information); <br>} <br><span>//发送给远程主机的请求内容串 </span><br>string sendStr="GET / HTTP/1.1\r\nHost: " + hostName + <br>"\r\nConnection: Close\r\n\r\n"; <br>//创建bytes字节数组以转换发送串 <br>byte[] bytesSendStr=new byte[1024]; <br>//将发送内容字符串转换成字节byte数组 <br>bytesSendStr=Encoding.ASCII.GetBytes(sendStr); <br>try <br>{ <br>//向主机发送请求 <br>socket.Send(bytesSendStr,bytesSendStr.Length,0); <br>} <br>catch(Exception ce) <br>{ <br>MessageBox.Show("发送错误:"+ce.Message,"提示信息 <br>,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information); <br>} <br>//声明接收返回内容的字符串 <br>string recvStr=""; <br>//声明字节数组，一次接收数据的长度为1024字节 <br>byte[] recvBytes=new byte[1024]; <br>//返回实际接收内容的字节数 <br>int bytes=0; <br>//循环读取，直到接收完所有数据 <br>while(true) <br>{ <br>bytes=socket.Receive(recvBytes,recvBytes.Length,0); <br>//读取完成后退出循环 <br>if(bytes&lt;=0) <br>break; <br>//将读取的字节数转换为字符串 <br>recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes); <br>} <br>//将所读取的字符串转换为字节数组 <br>byte[] content=Encoding.ASCII.GetBytes(recvStr); <br>try <br>{ <br>//创建文件流对象实例 <br>FileStream fs=new FileStream(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite); <br>//写入文件 <br>fs.Write(content,0,content.Length); <br>} <br>catch(Exception fe) <br>{ <br>MessageBox.Show("文件创建/写入错误:"+fe.Message,"提示信息",MessageBoxButtons.RetryCancel,MessageBoxIcon.Information); <br>} <br>//禁用Socket <br>socket.Shutdown(SocketShutdown.Both); <br>//关闭Socket <br>socket.Close(); <br>} <br>} <br><br><br>程序在WindowsXP中文版、.Net Frameworkd 中文正式版、Visual Studio.Net中文正式版下调试通过 
<img src ="http://www.cppblog.com/skybook/aggbug/65671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2008-11-01 10:44 <a href="http://www.cppblog.com/skybook/archive/2008/11/01/65671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c# TreeView 控件选中子节点的判断 TreeNode tn = this.Netree.GetNodeAt(e.Location);    if (tn != null &amp;&amp; tn.Bounds.Contains(e.Location))</title><link>http://www.cppblog.com/skybook/archive/2008/10/31/65604.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Fri, 31 Oct 2008 02:24:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2008/10/31/65604.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/65604.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2008/10/31/65604.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/65604.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/65604.html</trackback:ping><description><![CDATA[<p>private void Netree_MouseClick(object sender, MouseEventArgs e)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(e.Button == MouseButtons.Left)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: red">TreeNode tn = <span style="BACKGROUND-COLOR: #ccffff">this.Netree.GetNodeAt(e.Location);</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">&nbsp; if (tn != null &amp;&amp;<span style="BACKGROUND-COLOR: #ccffff"> tn.Bounds.Contains(e.Location))</span><br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tn.Nodes.Count == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {...........................<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ............................</p>
<img src ="http://www.cppblog.com/skybook/aggbug/65604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2008-10-31 10:24 <a href="http://www.cppblog.com/skybook/archive/2008/10/31/65604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ftp上传下载进度条</title><link>http://www.cppblog.com/skybook/archive/2008/10/31/65602.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Fri, 31 Oct 2008 02:04:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2008/10/31/65602.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/65602.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2008/10/31/65602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/65602.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/65602.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ftp上传或下载过程中或提供一个事件，当上传一定比特流的时候就触发该事件，上传的比特数可以在此事件处理函数中处理，上传结束也会触发一个事件。**********************************UpLoadFtp类************************************************{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.cppblog.com/skybook/archive/2008/10/31/65602.html'>阅读全文</a><img src ="http://www.cppblog.com/skybook/aggbug/65602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2008-10-31 10:04 <a href="http://www.cppblog.com/skybook/archive/2008/10/31/65602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>当前工作目录问题—— OpenFileDialog对话框影响当前工作目录</title><link>http://www.cppblog.com/skybook/archive/2008/10/31/65600.html</link><dc:creator>天书</dc:creator><author>天书</author><pubDate>Fri, 31 Oct 2008 01:11:00 GMT</pubDate><guid>http://www.cppblog.com/skybook/archive/2008/10/31/65600.html</guid><wfw:comment>http://www.cppblog.com/skybook/comments/65600.html</wfw:comment><comments>http://www.cppblog.com/skybook/archive/2008/10/31/65600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/skybook/comments/commentRss/65600.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/skybook/services/trackbacks/65600.html</trackback:ping><description><![CDATA[<p>OpenFileDialog对话框影响当前工作目录，比如，当前工作目录为一个项目的bin/debug目录下，配置文件也在这下面，当OpenFileDialog选择文件时，目录改为选择文件所在目录，这样程序中的&nbsp; xmlDoc.Load("FileTyp.xml");就找不到文件FileTyp.xml了，解决此问题是方法是，OpenFileDialog之前保存一下当前目录，之后再还原：如下：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void butSelectFile_Click(object sender, EventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #993300">string curWD = System.IO.Directory.GetCurrentDirectory();</span></strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OpenFileDialog fd = new OpenFileDialog();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fd.ShowDialog(this) == DialogResult.OK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localFileName = fd.SafeFileName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInfo fi = new FileInfo(fd.SafeFileName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String path = fi.Directory.ToString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.localFilePath = path + "\\" + localFileName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textFile.Text = localFilePath;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="COLOR: #993300"> System.IO.Directory.SetCurrentDirectory(curWD);</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<img src ="http://www.cppblog.com/skybook/aggbug/65600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/skybook/" target="_blank">天书</a> 2008-10-31 09:11 <a href="http://www.cppblog.com/skybook/archive/2008/10/31/65600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>