﻿<?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>IT博客-牛牛猪－研究所-文章分类-C# socket</title><link>http://www.cnitblog.com/cmoron/category/7333.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 30 Sep 2011 15:27:10 GMT</lastBuildDate><pubDate>Fri, 30 Sep 2011 15:27:10 GMT</pubDate><ttl>60</ttl><item><title>Socket开发之通讯协议及处理</title><link>http://www.cnitblog.com/cmoron/articles/45656.html</link><dc:creator>牛牛猪</dc:creator><author>牛牛猪</author><pubDate>Thu, 12 Jun 2008 17:01:00 GMT</pubDate><guid>http://www.cnitblog.com/cmoron/articles/45656.html</guid><wfw:comment>http://www.cnitblog.com/cmoron/comments/45656.html</wfw:comment><comments>http://www.cnitblog.com/cmoron/articles/45656.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/cmoron/comments/commentRss/45656.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cmoron/services/trackbacks/45656.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在Socket应用开发中，还有一个话题是讨论的比较多的，那就是数据接收后如何处理的问题。这也是一个令刚接触Socket开发的人很头疼的问题。因为Socket的TCP通讯中有一个&#8220;粘包&#8221;的现象，既：大多数时候发送端多次发送的小数据包会被连在一起被接收端同时接收到，多个小包被组成一个大包被接收。有时候一个大数据包又会被拆成多个小数据包发送。这样就存在一个将数据包拆分和重新组...&nbsp;&nbsp;<a href='http://www.cnitblog.com/cmoron/articles/45656.html'>阅读全文</a><img src ="http://www.cnitblog.com/cmoron/aggbug/45656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cmoron/" target="_blank">牛牛猪</a> 2008-06-13 01:01 <a href="http://www.cnitblog.com/cmoron/articles/45656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Socket开发之通讯协议及处理</title><link>http://www.cnitblog.com/cmoron/articles/45657.html</link><dc:creator>牛牛猪</dc:creator><author>牛牛猪</author><pubDate>Thu, 12 Jun 2008 17:01:00 GMT</pubDate><guid>http://www.cnitblog.com/cmoron/articles/45657.html</guid><wfw:comment>http://www.cnitblog.com/cmoron/comments/45657.html</wfw:comment><comments>http://www.cnitblog.com/cmoron/articles/45657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cmoron/comments/commentRss/45657.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cmoron/services/trackbacks/45657.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在Socket应用开发中，还有一个话题是讨论的比较多的，那就是数据接收后如何处理的问题。这也是一个令刚接触Socket开发的人很头疼的问题。因为Socket的TCP通讯中有一个&#8220;粘包&#8221;的现象，既：大多数时候发送端多次发送的小数据包会被连在一起被接收端同时接收到，多个小包被组成一个大包被接收。有时候一个大数据包又会被拆成多个小数据包发送。这样就存在一个将数据包拆分和重新组...&nbsp;&nbsp;<a href='http://www.cnitblog.com/cmoron/articles/45657.html'>阅读全文</a><img src ="http://www.cnitblog.com/cmoron/aggbug/45657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cmoron/" target="_blank">牛牛猪</a> 2008-06-13 01:01 <a href="http://www.cnitblog.com/cmoron/articles/45657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.NET Socket开发之同步Socket实现两例 </title><link>http://www.cnitblog.com/cmoron/articles/45655.html</link><dc:creator>牛牛猪</dc:creator><author>牛牛猪</author><pubDate>Thu, 12 Jun 2008 17:00:00 GMT</pubDate><guid>http://www.cnitblog.com/cmoron/articles/45655.html</guid><wfw:comment>http://www.cnitblog.com/cmoron/comments/45655.html</wfw:comment><comments>http://www.cnitblog.com/cmoron/articles/45655.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/cmoron/comments/commentRss/45655.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cmoron/services/trackbacks/45655.html</trackback:ping><description><![CDATA[<div>.NET Socket开发之同步Socket实现两例</div>
<div style="TEXT-INDENT: 21pt">今天，我们来讲一下在.NET 网络应用程序开发中同步Socket的应用，很多人认为在网络应用的服务端Socket不应该使用同步Socket。是的，在大多数情况下是这样的，但是也有一些场景下我们使用同步Socket可能会得到更的结果。如在下面的两种场景下我们便可以考虑使用同步的Socket。</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>一、</span>客户端数量比较少：</div>
<div style="MARGIN-LEFT: 21pt">数量比较少是指会同时连接到服务器的客户端数量一般在50人以下。这种情况下我们可以考虑使用同步Socket＋Thread来实现我们的服务端。这样会让我们编写逻辑更清晰的代码而性能不会下降太多。</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>二、</span>客户端数量较多但都是短连接：</div>
<div style="MARGIN-LEFT: 21pt">短连接是指客户端的连接在处理完一次收发之后就产即断开的场景，比如说HTTP协议就是一种短连接。HTTP在客户端发出请求时建立一个Socket连接，并通过Socket发出一个URL请求，服务端在处理完这个请求并回发相应的页面后便会断开这个连接。那么在这种场景下我们也可以使用同步Socket来实现我们的需求。</div>
<div style="TEXT-INDENT: 21pt">那么应该如果实现我上面提到的两种需求呢。对于这两种需求，我将采用不同的方案来实现它们。</div>
<div style="TEXT-INDENT: 21pt">首先我们来看看第一种需求，这里我采用Socket＋Thread来实现，基本的流程如下：</div>
<div style="TEXT-INDENT: 21pt">首先创建一个Socket，并且给它绑定一个EndPoint后开始监听。接下来我们创建一个线程，在这个线程中我们用一个无限循环来接收来自客户端的连接请求。在接收到一个请求后，为这个客户端创建一个新的线程，并且在这个线程中也使用一个无限循环接收来自这个客户端的数据。下面让我们来看看代码：</div>
<div>&nbsp;</div>
<div align=left><span style="FONT-SIZE: 9pt">首先我们创建一个Socket用来侦听客户端的连接：</span></div>
<div align=left><span style="FONT-SIZE: 9pt">
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><font size=2><span style="COLOR: #000000">Socket&nbsp;listener&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span></font><font size=2><span style="COLOR: #000000">&nbsp;Socket(AddressFamily.InterNetwork,&nbsp;SocketType.Stream,&nbsp;ProtocolType.Tcp);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>IPEndPoint&nbsp;locEP</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;IPEndPoint(IPAddress.Any,&nbsp;</span><span style="COLOR: #000000">2000</span></font><font size=2><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>listener.Bind(locEP);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>listener.Listen(</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">);</span></font></div>
</div>
然后创建一个线程来处理客户端的连接请求：</span></div>
<div align=left><span style="FONT-SIZE: 9pt">
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><font size=2><span style="COLOR: #000000">Thread&nbsp;acceptThread&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Thread(</span><span style="COLOR: #0000ff">new</span></font><font size=2><span style="COLOR: #000000">&nbsp;ThreadStart(AcceptWorkThread));<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>acceptThread.Start();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span></font><font size=2><span style="COLOR: #000000">&nbsp;AcceptWorkThread()<br><img id=_125_601_Open_Image onclick="this.style.display='none'; document.getElementById('_125_601_Open_Text').style.display='none'; document.getElementById('_125_601_Closed_Image').style.display='inline'; document.getElementById('_125_601_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_125_601_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_125_601_Closed_Text').style.display='none'; document.getElementById('_125_601_Open_Image').style.display='inline'; document.getElementById('_125_601_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=_125_601_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span></font><span id=_125_601_Open_Text><font size=2><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Thread.CurrentThread.IsBackground&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span></font><font size=2><span style="COLOR: #000000">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">true</span></font><font size=2><span style="COLOR: #000000">)<br><img id=_194_599_Open_Image onclick="this.style.display='none'; document.getElementById('_194_599_Open_Text').style.display='none'; document.getElementById('_194_599_Closed_Image').style.display='inline'; document.getElementById('_194_599_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_194_599_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_194_599_Closed_Text').style.display='none'; document.getElementById('_194_599_Open_Image').style.display='inline'; document.getElementById('_194_599_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_194_599_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span></font><span id=_194_599_Open_Text><font size=2><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;accept&nbsp;</span><span style="COLOR: #000000">=</span></font><font size=2><span style="COLOR: #000000">&nbsp;listener.Accept();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPEndPoint&nbsp;remoEP&nbsp;</span><span style="COLOR: #000000">=</span></font><font size=2><span style="COLOR: #000000">&nbsp;(IPEndPoint)accept.RemoteEndPoint;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;recString&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">接收到来自</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;remoEP.Address.ToString()&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">的连接。</span><span style="COLOR: #000000">"</span></font><font size=2><span style="COLOR: #000000">;<br><img id=_450_462_Open_Image onclick="this.style.display='none'; document.getElementById('_450_462_Open_Text').style.display='none'; document.getElementById('_450_462_Closed_Image').style.display='inline'; document.getElementById('_450_462_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_450_462_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_450_462_Closed_Text').style.display='none'; document.getElementById('_450_462_Open_Image').style.display='inline'; document.getElementById('_450_462_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Invoke(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;AddListItemHandler(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.AddListItem),&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[]&nbsp;</span><span id=_450_462_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_450_462_Open_Text><span style="COLOR: #000000">{&nbsp;recString&nbsp;}</span></span></font><font size=2><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;receiveThread&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Thread(</span><span style="COLOR: #0000ff">new</span></font><span style="COLOR: #000000"><font size=2>&nbsp;ParameterizedThreadStart(ReceiveWorkThread));<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receiveThread.Start(accept);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</font></span></span><span style="COLOR: #000000"><br><font size=2><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</font></span></span></div>
</div>
最后我们来看看如何接收数据：</span></div>
<div align=left><span style="FONT-SIZE: 9pt">
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><font size=2><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;ReceiveWorkThread(</span><span style="COLOR: #0000ff">object</span></font><font size=2><span style="COLOR: #000000">&nbsp;obj)<br><img id=_43_728_Open_Image onclick="this.style.display='none'; document.getElementById('_43_728_Open_Text').style.display='none'; document.getElementById('_43_728_Closed_Image').style.display='inline'; document.getElementById('_43_728_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_43_728_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_43_728_Closed_Text').style.display='none'; document.getElementById('_43_728_Open_Image').style.display='inline'; document.getElementById('_43_728_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=_43_728_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span></font><span id=_43_728_Open_Text><font size=2><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Thread.CurrentThread.IsBackground&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span></font><font size=2><span style="COLOR: #000000">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket&nbsp;</span><span style="COLOR: #000000">=</span></font><font size=2><span style="COLOR: #000000">&nbsp;(Socket)obj;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[]&nbsp;buffer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">1024</span></font><font size=2><span style="COLOR: #000000">];<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">true</span></font><font size=2><span style="COLOR: #000000">)<br><img id=_181_726_Open_Image onclick="this.style.display='none'; document.getElementById('_181_726_Open_Text').style.display='none'; document.getElementById('_181_726_Closed_Image').style.display='inline'; document.getElementById('_181_726_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_181_726_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_181_726_Closed_Text').style.display='none'; document.getElementById('_181_726_Open_Image').style.display='inline'; document.getElementById('_181_726_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_181_726_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span></font><span id=_181_726_Open_Text><font size=2><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;receiveCount&nbsp;</span><span style="COLOR: #000000">=</span></font><font size=2><span style="COLOR: #000000">&nbsp;socket.Receive(buffer);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(receiveCount&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span></font><font size=2><span style="COLOR: #000000">)<br><img id=_272_640_Open_Image onclick="this.style.display='none'; document.getElementById('_272_640_Open_Text').style.display='none'; document.getElementById('_272_640_Closed_Image').style.display='inline'; document.getElementById('_272_640_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_272_640_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_272_640_Closed_Text').style.display='none'; document.getElementById('_272_640_Open_Image').style.display='inline'; document.getElementById('_272_640_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_272_640_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span></font><span id=_272_640_Open_Text><font size=2><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPEndPoint&nbsp;remoEP&nbsp;</span><span style="COLOR: #000000">=</span></font><font size=2><span style="COLOR: #000000">&nbsp;(IPEndPoint)socket.RemoteEndPoint;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;recString&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">来自客户端</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;remoEP.Address.ToString()&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">的消息：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;Encoding.Default.GetString(buffer,&nbsp;</span><span style="COLOR: #000000">0</span></font><font size=2><span style="COLOR: #000000">,&nbsp;receiveCount);<br><img id=_551_563_Open_Image onclick="this.style.display='none'; document.getElementById('_551_563_Open_Text').style.display='none'; document.getElementById('_551_563_Closed_Image').style.display='inline'; document.getElementById('_551_563_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_551_563_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_551_563_Closed_Text').style.display='none'; document.getElementById('_551_563_Open_Image').style.display='inline'; document.getElementById('_551_563_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Invoke(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;AddListItemHandler(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.AddListItem),&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[]&nbsp;</span><span id=_551_563_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_551_563_Open_Text><span style="COLOR: #000000">{&nbsp;recString&nbsp;}</span></span></font><span style="COLOR: #000000"><font size=2>);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.Send(buffer,&nbsp;receiveCount,&nbsp;SocketFlags.None);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</font></span></span><span style="COLOR: #000000"><br><font size=2><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="COLOR: #0000ff"><font size=2>else</font></span><span style="COLOR: #000000"><br><font size=2><img id=_663_720_Open_Image onclick="this.style.display='none'; document.getElementById('_663_720_Open_Text').style.display='none'; document.getElementById('_663_720_Closed_Image').style.display='inline'; document.getElementById('_663_720_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_663_720_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_663_720_Closed_Text').style.display='none'; document.getElementById('_663_720_Open_Image').style.display='inline'; document.getElementById('_663_720_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span id=_663_720_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><font size=2>...</font></span><span id=_663_720_Open_Text><font size=2><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.Close();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span></font><span style="COLOR: #000000"><font size=2>;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</font></span></span><span style="COLOR: #000000"><br><font size=2><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</font></span></span><span style="COLOR: #000000"><br><font size=2><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</font></span></span></div>
</div>
好了，整个实现就完成了。</span></div>
<div style="TEXT-INDENT: 21pt">现在让我们来看看第二个需求：</div>
<div style="TEXT-INDENT: 21pt">这个方案我们将采用另外一个方法来实现，为什么不采用上一个方法来实现呢？让我们来分析一下。我们知道，在上一个实现中，每接入一个客户端就要创建一个线程，如果有大量的客户端接入的话，就会创建过多的线程。但是如果线程过多的话，Windows就需要更多的CPU时间来切换线程的上下文（这也是上一个实现不能接入很多客户端的原因）。</div>
<div style="TEXT-INDENT: 21pt">我们知道，在这个方案中每一个连接都是短连接。而且顺序都是固定的。都是：接入-&gt;接收-&gt;发送这样的顺序，那么我们就可以在一个方法中完成整个处理。这样，我们就可以利用线程池来实现我们所需要的。好了，让我们用代码来说话吧：</div>
<div style="TEXT-INDENT: 21pt">&nbsp;</div>
<div align=left><span style="FONT-SIZE: 9pt">首先我们创建一个Socket用来侦听客户端的连接：</span></div>
<div align=left><span style="FONT-SIZE: 9pt">
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><font size=2><span style="COLOR: #000000">Socket&nbsp;listener&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span></font><font size=2><span style="COLOR: #000000">&nbsp;Socket(AddressFamily.InterNetwork,&nbsp;SocketType.Stream,&nbsp;ProtocolType.Tcp);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>IPEndPoint&nbsp;locEP</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;IPEndPoint(IPAddress.Any,&nbsp;</span><span style="COLOR: #000000">2000</span></font><font size=2><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>listener.Bind(locEP);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>listener.Listen(</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">);</span></font></div>
</div>
接下来我们要创建一个线程池：</span></div>
<div align=left><span style="FONT-SIZE: 9pt">
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><font size=2><span style="COLOR: #000000">Thread[]&nbsp;ClientThreadList&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Thread[</span><span style="COLOR: #000000">30</span></font><font size=2><span style="COLOR: #000000">];<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000">&nbsp;(Thread&nbsp;th&nbsp;</span><span style="COLOR: #0000ff">in</span></font><font size=2><span style="COLOR: #000000">&nbsp;ClientThreadList)<br><img id=_84_158_Open_Image onclick="this.style.display='none'; document.getElementById('_84_158_Open_Text').style.display='none'; document.getElementById('_84_158_Closed_Image').style.display='inline'; document.getElementById('_84_158_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_84_158_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_84_158_Closed_Text').style.display='none'; document.getElementById('_84_158_Open_Image').style.display='inline'; document.getElementById('_84_158_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=_84_158_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span></font><span id=_84_158_Open_Text><font size=2><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;th&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Thread(</span><span style="COLOR: #0000ff">new</span></font><span style="COLOR: #000000"><font size=2>&nbsp;ThreadStart(ClientWorkThread));<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;th.Start();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</font></span></span></div>
</div>
最后让我们看看线程都要做些什么：</span></div>
<div style="TEXT-INDENT: 21pt">
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;ClientWorkThread()<br><img id=_32_757_Open_Image onclick="this.style.display='none'; document.getElementById('_32_757_Open_Text').style.display='none'; document.getElementById('_32_757_Closed_Image').style.display='inline'; document.getElementById('_32_757_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_32_757_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_32_757_Closed_Text').style.display='none'; document.getElementById('_32_757_Open_Image').style.display='inline'; document.getElementById('_32_757_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=_32_757_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_32_757_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[]&nbsp;buffer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">1024</span><span style="COLOR: #000000">];<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">)<br><img id=_91_755_Open_Image onclick="this.style.display='none'; document.getElementById('_91_755_Open_Text').style.display='none'; document.getElementById('_91_755_Closed_Image').style.display='inline'; document.getElementById('_91_755_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_91_755_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_91_755_Closed_Text').style.display='none'; document.getElementById('_91_755_Open_Image').style.display='inline'; document.getElementById('_91_755_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_91_755_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_91_755_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;listener.Accept();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;recString&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">接收到来自</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;remoEP.Address.ToString()&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">的连接。</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img id=_284_296_Open_Image onclick="this.style.display='none'; document.getElementById('_284_296_Open_Text').style.display='none'; document.getElementById('_284_296_Closed_Image').style.display='inline'; document.getElementById('_284_296_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_284_296_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_284_296_Closed_Text').style.display='none'; document.getElementById('_284_296_Open_Image').style.display='inline'; document.getElementById('_284_296_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Invoke(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;AddListItemHandler(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.AddListItem),&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[]&nbsp;</span><span id=_284_296_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_284_296_Open_Text><span style="COLOR: #000000">{&nbsp;recString&nbsp;}</span></span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;receCount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;socket.Receive(buffer);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(receCount</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=_381_679_Open_Image onclick="this.style.display='none'; document.getElementById('_381_679_Open_Text').style.display='none'; document.getElementById('_381_679_Closed_Image').style.display='inline'; document.getElementById('_381_679_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_381_679_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_381_679_Closed_Text').style.display='none'; document.getElementById('_381_679_Open_Image').style.display='inline'; document.getElementById('_381_679_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_381_679_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_381_679_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;recString&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">来自客户端</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;remoEP.Address.ToString()&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">的消息：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;Encoding.Default.GetString(buffer,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;receiveCount);<br><img id=_593_605_Open_Image onclick="this.style.display='none'; document.getElementById('_593_605_Open_Text').style.display='none'; document.getElementById('_593_605_Closed_Image').style.display='inline'; document.getElementById('_593_605_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_593_605_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_593_605_Closed_Text').style.display='none'; document.getElementById('_593_605_Open_Image').style.display='inline'; document.getElementById('_593_605_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Invoke(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;AddListItemHandler(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.AddListItem),&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[]&nbsp;</span><span id=_593_605_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_593_605_Open_Text><span style="COLOR: #000000">{&nbsp;recString&nbsp;}</span></span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.Send(buffer,&nbsp;receCount,&nbsp;SocketFlags.None);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.Shutdown(SocketShutdown.Both);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.Close();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
</div>
为什么我们要这样做呢？ </div>
<div style="TEXT-INDENT: 21pt">首先我们创建了一个Socket用于侦听客户端的连接请求，接下我们创建了一个拥有30个线程的线程池。并在每个线程中实现了Accept、Receive、Send和Close（），以完成连接、接收、发送、关闭的操作。</div>
<div style="TEXT-INDENT: 21pt">现在我们假设有一个客户连接到服务器了，这时会有一个线程Accept到这个请求，并开始接收客户端发送过来的数据，接收到数据之后处理完发送给客户端，然后关闭这个连接，再次进入等待连接状态。而其它29个线程由于没有Accept到这个请求，仍然处理等待接入状态。</div>
<br><a href="http://www.cnblogs.com/wzd24/archive/2007/05/21/753709.html">http://www.cnblogs.com/wzd24/archive/2007/05/21/753709.html</a><img src ="http://www.cnitblog.com/cmoron/aggbug/45655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cmoron/" target="_blank">牛牛猪</a> 2008-06-13 01:00 <a href="http://www.cnitblog.com/cmoron/articles/45655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在C#中利用Keep-Alive处理Socket网络异常断开的方法 </title><link>http://www.cnitblog.com/cmoron/articles/45653.html</link><dc:creator>牛牛猪</dc:creator><author>牛牛猪</author><pubDate>Thu, 12 Jun 2008 16:59:00 GMT</pubDate><guid>http://www.cnitblog.com/cmoron/articles/45653.html</guid><wfw:comment>http://www.cnitblog.com/cmoron/comments/45653.html</wfw:comment><comments>http://www.cnitblog.com/cmoron/articles/45653.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cmoron/comments/commentRss/45653.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cmoron/services/trackbacks/45653.html</trackback:ping><description><![CDATA[<p>　　最近我负责一个IM项目的开发，服务端和客户端采用TCP协议连接。服务端采用C#开发，客户端采用Delphi开发。在服务端开发中我碰到了各种各样的网络异常断开现象。在处理这些异常的时候有了一些心得，现在写出来和大家分享一下。</p>
<p>那网络异常断开原因主要有那些呢？归纳起来主要有以下两种：</p>
<p>1、客户端程序异常。</p>
<p>　　对于这种情况，我们很好处理，因为客户端程序异常退出会在服务端引发ConnectionReset的Socket异常（就是WinSock2中的10054异常）。只要在服务端处理这个异常就可以了。</p>
<p>2、网络链路异常。</p>
<p>　　如：网线拔出、交换机掉电、客户端机器掉电。当出现这些情况的时候服务端不会出现任何异常。这样的话上面的代码就不能处理这种情况了。对于这种情况在MSDN里面是这样处理的，我在这里贴出MSDN的原文：</p>
<p><font color=#ff0000>如果您需要确定连接的当前状态，请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035)，则该套接字仍然处于连接状态；否则，该套接字不再处于连接状态。</font></p>
<p dir=ltr style="MARGIN-RIGHT: 0px"><font color=#ff0000>　　</font>但是我在实际应用中发现，MSDN说的这种处理方法在很多时候根本无效，无法检测出网络已经异常断开了。那我们该怎么办呢？</p>
<p>　　我们知道，TCP有一个连接检测机制，就是如果在指定的时间内（一般为2个小时）没有数据传送，会给对端发送一个Keep-Alive数据报，使用的序列号是曾经发出的最后一个报文的最后一个字节的序列号，对端如果收到这个数据，回送一个TCP的ACK，确认这个字节已经收到，这样就知道此连接没有被断开。如果一段时间没有收到对方的响应，会进行重试，重试几次后，向对端发一个reset，然后将连接断掉。</p>
<p>　　在Windows中，第一次探测是在最后一次数据发送的两个小时，然后每隔1秒探测一次，一共探测5次，如果5次都没有收到回应的话，就会断开这个连接。但两个小时对于我们的项目来说显然太长了。我们必须缩短这个时间。那么我们该如何做呢？我要利用Socket类的IOControl()函数。我们来看看这个函数能干些什么：</p>
<p>使用 IOControlCode 枚举指定控制代码，为 Socket 设置低级操作模式。 <br><br>命名空间:System.Net.Sockets <br>程序集:System（在 system.dll 中） <br><br>语法 <br><br>C# <br>public int IOControl ( <br>IOControlCode ioControlCode, <br>byte[] optionInValue, <br>byte[] optionOutValue <br>) <br><br><br>参数 <br>ioControlCode <br>一个 IOControlCode 值，它指定要执行的操作的控制代码。 <br><br>optionInValue <br>Byte 类型的数组，包含操作要求的输入数据。 <br><br>optionOutValue <br>Byte 类型的数组，包含由操作返回的输出数据。 <br><br>返回值 <br>optionOutValue 参数中的字节数。 </p>
<p>如：</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">socket.IOControl(IOControlCode.KeepAliveValues,&nbsp;inOptionValues,&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);</span></div>
</div>
<p>我们要搞清楚的就是inOptionValues的定义，在C++里它是一个结构体。我们来看看这个结构体：</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;tcp_keepalive&nbsp;<br><img id=_22_105_Open_Image onclick="this.style.display='none'; document.getElementById('_22_105_Open_Text').style.display='none'; document.getElementById('_22_105_Closed_Image').style.display='inline'; document.getElementById('_22_105_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_22_105_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_22_105_Closed_Text').style.display='none'; document.getElementById('_22_105_Open_Image').style.display='inline'; document.getElementById('_22_105_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=_22_105_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_22_105_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;u_long&nbsp;&nbsp;onoff;&nbsp;//是否启用Keep-Alive<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;u_long&nbsp;&nbsp;keepalivetime;&nbsp;//多长时间后开始第一次探测（单位：毫秒）<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;u_long&nbsp;&nbsp;keepaliveinterval;&nbsp;//探测时间间隔（单位：毫秒）<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div>
</div>
<p>在C#中，我们直接用一个Byte数组传递给函数：</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">&nbsp;dummy&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[]&nbsp;inOptionValues&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[Marshal.SizeOf(dummy)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">];<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>BitConverter.GetBytes((</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">).CopyTo(inOptionValues,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);//是否启用Keep-Alive<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>BitConverter.GetBytes((</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">5000</span><span style="COLOR: #000000">).CopyTo(inOptionValues,&nbsp;Marshal.SizeOf(dummy));//多长时间开始第一次探测<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>BitConverter.GetBytes((</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">5000</span><span style="COLOR: #000000">).CopyTo(inOptionValues,&nbsp;Marshal.SizeOf(dummy)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);//探测时间间隔<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div>
</div>
<p>具体实现代码：</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;AcceptThread()<br><img id=_50_674_Open_Image onclick="this.style.display='none'; document.getElementById('_50_674_Open_Text').style.display='none'; document.getElementById('_50_674_Closed_Image').style.display='inline'; document.getElementById('_50_674_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_50_674_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_50_674_Closed_Text').style.display='none'; document.getElementById('_50_674_Open_Image').style.display='inline'; document.getElementById('_50_674_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_50_674_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_50_674_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.CurrentThread.IsBackground&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">)<br><img id=_143_664_Open_Image onclick="this.style.display='none'; document.getElementById('_143_664_Open_Text').style.display='none'; document.getElementById('_143_664_Closed_Image').style.display='inline'; document.getElementById('_143_664_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_143_664_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_143_664_Closed_Text').style.display='none'; document.getElementById('_143_664_Open_Image').style.display='inline'; document.getElementById('_143_664_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_143_664_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_143_664_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">&nbsp;dummy&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[]&nbsp;inOptionValues&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[Marshal.SizeOf(dummy)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">];<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitConverter.GetBytes((</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">).CopyTo(inOptionValues,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitConverter.GetBytes((</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">5000</span><span style="COLOR: #000000">).CopyTo(inOptionValues,&nbsp;Marshal.SizeOf(dummy));<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitConverter.GetBytes((</span><span style="COLOR: #0000ff">uint</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">5000</span><span style="COLOR: #000000">).CopyTo(inOptionValues,&nbsp;Marshal.SizeOf(dummy)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=_562_624_Open_Image onclick="this.style.display='none'; document.getElementById('_562_624_Open_Text').style.display='none'; document.getElementById('_562_624_Closed_Image').style.display='inline'; document.getElementById('_562_624_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_562_624_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_562_624_Closed_Text').style.display='none'; document.getElementById('_562_624_Open_Image').style.display='inline'; document.getElementById('_562_624_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_562_624_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_562_624_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Accept(inOptionValues);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=_648_650_Open_Image onclick="this.style.display='none'; document.getElementById('_648_650_Open_Text').style.display='none'; document.getElementById('_648_650_Closed_Image').style.display='inline'; document.getElementById('_648_650_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_648_650_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_648_650_Closed_Text').style.display='none'; document.getElementById('_648_650_Open_Image').style.display='inline'; document.getElementById('_648_650_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;</span><span id=_648_650_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_648_650_Open_Text><span style="COLOR: #000000">{&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Accept(</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[]&nbsp;inOptionValues)<br><img id=_743_1212_Open_Image onclick="this.style.display='none'; document.getElementById('_743_1212_Open_Text').style.display='none'; document.getElementById('_743_1212_Closed_Image').style.display='inline'; document.getElementById('_743_1212_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_743_1212_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_743_1212_Closed_Text').style.display='none'; document.getElementById('_743_1212_Open_Image').style.display='inline'; document.getElementById('_743_1212_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=_743_1212_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_743_1212_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Public.s_socketHandler.Accept();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.IOControl(IOControlCode.KeepAliveValues,&nbsp;inOptionValues,&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserInfo&nbsp;info&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;UserInfo();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.socket&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;socket;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GetUserId();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.Index&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;id;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Public.s_userList.Add(id,&nbsp;info);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.BeginReceive(info.Buffer,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;info.Buffer.Length,&nbsp;SocketFlags.None,&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;AsyncCallback(ReceiveCallBack),&nbsp;info);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span></div>
</div>
<br><a href="http://www.cnblogs.com/wzd24/archive/2007/05/22/755050.html">http://www.cnblogs.com/wzd24/archive/2007/05/22/755050.html</a><img src ="http://www.cnitblog.com/cmoron/aggbug/45653.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cmoron/" target="_blank">牛牛猪</a> 2008-06-13 00:59 <a href="http://www.cnitblog.com/cmoron/articles/45653.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在C#中实现Socket端口复用 </title><link>http://www.cnitblog.com/cmoron/articles/45654.html</link><dc:creator>牛牛猪</dc:creator><author>牛牛猪</author><pubDate>Thu, 12 Jun 2008 16:59:00 GMT</pubDate><guid>http://www.cnitblog.com/cmoron/articles/45654.html</guid><wfw:comment>http://www.cnitblog.com/cmoron/comments/45654.html</wfw:comment><comments>http://www.cnitblog.com/cmoron/articles/45654.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/cmoron/comments/commentRss/45654.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cmoron/services/trackbacks/45654.html</trackback:ping><description><![CDATA[<div class=postText>一、什么是端口复用：
<p>　　因为在winsock的实现中，对于服务器的绑定是可以多重绑定的，在确定多重绑定使用谁的时候，根据一条原则是谁的指定最明确则将包递交给谁，而且没有权限之分。这种多重绑定便称之为端口复用。</p>
<p>二、我们如何实现Socket端口复用：</p>
<p>　　其实我们要实现端口复用很简单，我们只要使用SetSocketOption函数设置Socket选项就可以了。MSDN是这样解释的：<br>Socket 选项确定当前 Socket 的行为。对于具有 <mshelp:link keywords="T:System.Boolean">Boolean</mshelp:link> 数据类型的选项，指定非零值可启用该选项，指定零值可禁用该选项。对于具有整数数据类型的选项，指定适当的值。Socket 选项按照协议支持程度来分组。</p>
<p>我们来看看这个函数是怎么用的：</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;SetSocketOption&nbsp;(<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;SocketOptionLevel&nbsp;optionLevel,<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;SocketOptionName&nbsp;optionName,<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;optionValue<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>)</span></div>
</div>
<p>&nbsp;</p>
<p>参数 <br>optionLevel <br>SocketOptionLevel 值之一。 <br><br>optionName <br>SocketOptionName 值之一。 <br><br>optionValue <br>该选项的值。 </p>
<p>以上参数大家可以去看看MSDN。我这里就不多讲了。</p>
<p>在这里我们optionLevel 参数传SocketOptionLevel.Socket；optionName参数传SocketOptionName.ReuseAddress；optionValue参传一个非零值，我传的是True，如果要禁用的话，就传False。</p>
<p>如：</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">socket2.SetSocketOption(SocketOptionLevel.Socket,&nbsp;SocketOptionName.ReuseAddress,&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);</span></div>
</div>
<p>具体我们看看下面的代码：</p>
<p>我们首先建立第一个Socket：</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket1;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPEndPoint&nbsp;localEP&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;IPEndPoint(IPAddress.Any,&nbsp;</span><span style="COLOR: #000000">20000</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Socket(AddressFamily.InterNetwork,&nbsp;SocketType.Stream,&nbsp;ProtocolType.Tcp);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket1.Bind(localEP);</span></div>
</div>
<p>再建立第二个Socket：</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket2<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPEndPoint&nbsp;localEP&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;IPEndPoint(IPAddress.Any,&nbsp;</span><span style="COLOR: #000000">20000</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket2</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Socket(AddressFamily.InterNetwork,&nbsp;SocketType.Stream,&nbsp;ProtocolType.Tcp);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket2.SetSocketOption(SocketOptionLevel.Socket,&nbsp;SocketOptionName.ReuseAddress,&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">请注意这一句。ReuseAddress选项设置为True将允许将套接字绑定到已在使用中的地址。&nbsp;</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket2.Bind(localEP);</span></div>
</div>
<p>这样Socket1和Socket2便绑定在同一个端口上了。</p>
<p>例程源代码我上传到我的资源里面大家可以到<a href="http://www.cnblogs.com/Files/wzd24/28135640620.rar"><font color=#000080>http://www.cnblogs.com/Files/wzd24/28135640620.rar</font></a>去下载。<br><br><br><a href="http://www.cnblogs.com/wzd24/archive/2007/05/22/755016.html">http://www.cnblogs.com/wzd24/archive/2007/05/22/755016.html</a><br></p>
</div><img src ="http://www.cnitblog.com/cmoron/aggbug/45654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cmoron/" target="_blank">牛牛猪</a> 2008-06-13 00:59 <a href="http://www.cnitblog.com/cmoron/articles/45654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.NET Socket开发之异步Socket </title><link>http://www.cnitblog.com/cmoron/articles/45652.html</link><dc:creator>牛牛猪</dc:creator><author>牛牛猪</author><pubDate>Thu, 12 Jun 2008 16:57:00 GMT</pubDate><guid>http://www.cnitblog.com/cmoron/articles/45652.html</guid><wfw:comment>http://www.cnitblog.com/cmoron/comments/45652.html</wfw:comment><comments>http://www.cnitblog.com/cmoron/articles/45652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/cmoron/comments/commentRss/45652.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/cmoron/services/trackbacks/45652.html</trackback:ping><description><![CDATA[<p><span>在基于</span><span>.NET</span><span>的网络服务端的开发中，我们用到和听到的最多的恐怕就是异步</span><span>Socket</span><span>了。异步</span><span>Socket</span><span>的性能比同步高出很多，但是编写代码比较复杂。因此异步</span><span>Socket</span><span>也是网络上讨论比较多的话题。</span></p>
<p><span>今天，我们就来讨论一下如何用异步</span><span>Socket</span><span>开发网络应用。在此之前我们先讨论两个问题。</span></p>
<p><span><span>一、</span></span><span>异步</span><span>Socket</span><span>是如何工作的：</span></p>
<p><span>那异步</span><span>Socket</span><span>是如何工作的呢？我以接收一条消息来说明这个问题。首先，程序向系统投递一个接收数据的请求，并为其指定一个数据缓冲区和回调函数，回调函数用来指示当数据到达后将如何处理，然后我们的程序继续执行下去，当有数据到达的时候，系统将数据读入缓冲区，并执行回调函数，处理这条消息。我们并不需要关心这条消息何时到达。</span></p>
<p><span><span>二、</span></span><span>什么情况下我们用异步</span><span>Socket</span><span>：</span></p>
<p><span>有些人认为，异步</span><span>Socket</span><span>的性能比同步</span><span>Socket</span><span>的性能高很多，应该在各种环境下都用异步</span><span>Socket</span><span>，其实不然。在某些环境下面。异步反到比同步的性能低，那么在哪些情况下会这样呢？</span></p>
<p><span><span>１、<span> </span></span></span><span>客户端</span><span>Socket</span><span>。</span></p>
<p><span><span>２、<span> </span></span></span><span>服务端连接数比较少。</span></p>
<p><span><span>３、<span> </span></span></span><span>连接数很多，但都是短连接。</span></p>
<p><span>在这些环境下，我们用同步</span><span>Socket</span><span>不但可以简化代码，而且性能并不会比异步</span><span>Socket</span><span>低。但在服务端连接比较多而且是长连接的情况下，我们就要使用异步</span><span>Socket</span><span>。</span></p>
<p><span>现在我们来看看如何用异步</span><span>Socket</span><span>编程。</span></p>
<p><span>首先，我们要建立一个</span><span>Socket</span><span>用来监听：</span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Code_Closed_Image_235450 style="DISPLAY: none" onclick="this.style.display='none'; Code_Closed_Text_235450.style.display='none'; Code_Open_Image_235450.style.display='inline'; Code_Open_Text_235450.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_235450 style="DISPLAY: inline" onclick="this.style.display='none'; Code_Open_Text_235450.style.display='none'; Code_Closed_Image_235450.style.display='inline'; Code_Closed_Text_235450.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_235450 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Code_Open_Text_235450 style="DISPLAY: inline"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;_listener&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Socket(AddressFamily.InterNetwork,&nbsp;SocketType.Stream,&nbsp;ProtocolType.Tcp);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPEndPoint&nbsp;localEP&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;IPEndPoint(_address,&nbsp;_port);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_listener.Bind(localEP);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_listener.Listen(</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">然后创建一个线程来处理客户端连接请求：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Code_Closed_Image_235528 style="DISPLAY: none" onclick="this.style.display='none'; Code_Closed_Text_235528.style.display='none'; Code_Open_Image_235528.style.display='inline'; Code_Open_Text_235528.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_235528 style="DISPLAY: inline" onclick="this.style.display='none'; Code_Open_Text_235528.style.display='none'; Code_Closed_Image_235528.style.display='inline'; Code_Closed_Text_235528.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_235528 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Code_Open_Text_235528 style="DISPLAY: inline"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;_acceptWorkThread&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Thread(AcceptWorkThread);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_acceptWorkThread.Start();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;AcceptWorkThread()<br><img id=Codehighlighter1_157_575_Open_Image onclick="this.style.display='none'; Codehighlighter1_157_575_Open_Text.style.display='none'; Codehighlighter1_157_575_Closed_Image.style.display='inline'; Codehighlighter1_157_575_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_157_575_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_157_575_Closed_Text.style.display='none'; Codehighlighter1_157_575_Open_Image.style.display='inline'; Codehighlighter1_157_575_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_157_575_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_157_575_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(_isListener)<br><img id=Codehighlighter1_203_565_Open_Image onclick="this.style.display='none'; Codehighlighter1_203_565_Open_Text.style.display='none'; Codehighlighter1_203_565_Closed_Image.style.display='inline'; Codehighlighter1_203_565_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_203_565_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_203_565_Closed_Text.style.display='none'; Codehighlighter1_203_565_Open_Image.style.display='inline'; Codehighlighter1_203_565_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_203_565_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_203_565_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserInfo&nbsp;info&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;UserInfo();</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这个UserInfo是用来保存客户信息的。</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.socket&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;socket;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_listener.Accept();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这里进行其它处理。</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.BeginReceive(info.Buffer,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;info.Buffer.Length,&nbsp;SocketFlags.None,&nbsp;ReceiveCallBack,&nbsp;info);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这里向系统投递一个接收信息的请求，并为其指定ReceiveCallBack做为回调函数</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></div>
</span><font face=Verdana>&nbsp;</font><span><font face=Verdana>我们再来看看回调函数的定义： </font>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font face=Verdana><img id=Code_Closed_Image_235620 style="DISPLAY: none" onclick="this.style.display='none'; Code_Closed_Text_235620.style.display='none'; Code_Open_Image_235620.style.display='inline'; Code_Open_Text_235620.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_235620 style="DISPLAY: inline" onclick="this.style.display='none'; Code_Open_Text_235620.style.display='none'; Code_Closed_Image_235620.style.display='inline'; Code_Closed_Text_235620.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_235620 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span></font><span id=Code_Open_Text_235620 style="DISPLAY: inline"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><font face=Verdana><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></font><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;ReceiveCallBack(IAsyncResult&nbsp;ar)<br><img id=Codehighlighter1_62_1284_Open_Image onclick="this.style.display='none'; Codehighlighter1_62_1284_Open_Text.style.display='none'; Codehighlighter1_62_1284_Closed_Image.style.display='inline'; Codehighlighter1_62_1284_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_62_1284_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_62_1284_Closed_Text.style.display='none'; Codehighlighter1_62_1284_Open_Image.style.display='inline'; Codehighlighter1_62_1284_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_62_1284_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_62_1284_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserInfo&nbsp;info&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(UserInfo)ar.AsyncState;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;handler&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;info.socket;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;readCount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_218_311_Open_Image onclick="this.style.display='none'; Codehighlighter1_218_311_Open_Text.style.display='none'; Codehighlighter1_218_311_Closed_Image.style.display='inline'; Codehighlighter1_218_311_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_218_311_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_218_311_Closed_Text.style.display='none'; Codehighlighter1_218_311_Open_Image.style.display='inline'; Codehighlighter1_218_311_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_218_311_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_218_311_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readCount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;handler.EndReceive(ar);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用这个函数来结束本次接收并返回接收到的数据长度。</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(SocketException)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">出现Socket异常就关闭连接</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_378_466_Open_Image onclick="this.style.display='none'; Codehighlighter1_378_466_Open_Text.style.display='none'; Codehighlighter1_378_466_Closed_Image.style.display='inline'; Codehighlighter1_378_466_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_378_466_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_378_466_Closed_Text.style.display='none'; Codehighlighter1_378_466_Open_Image.style.display='inline'; Codehighlighter1_378_466_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_378_466_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_378_466_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseSocket(info);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这个函数用来关闭客户端连接</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_498_512_Open_Image onclick="this.style.display='none'; Codehighlighter1_498_512_Open_Text.style.display='none'; Codehighlighter1_498_512_Closed_Image.style.display='inline'; Codehighlighter1_498_512_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_498_512_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_498_512_Closed_Text.style.display='none'; Codehighlighter1_498_512_Open_Image.style.display='inline'; Codehighlighter1_498_512_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_498_512_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_498_512_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(readCount&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_557_1152_Open_Image onclick="this.style.display='none'; Codehighlighter1_557_1152_Open_Text.style.display='none'; Codehighlighter1_557_1152_Closed_Image.style.display='inline'; Codehighlighter1_557_1152_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_557_1152_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_557_1152_Closed_Text.style.display='none'; Codehighlighter1_557_1152_Open_Image.style.display='inline'; Codehighlighter1_557_1152_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_557_1152_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_557_1152_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[]&nbsp;buffer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">[readCount];<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buffer.BlockCopy(info.Buffer,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;buffer,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;readCount);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Analyzer(info,&nbsp;buffer);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这个函数用来处理接收到的信息。</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_777_947_Open_Image onclick="this.style.display='none'; Codehighlighter1_777_947_Open_Text.style.display='none'; Codehighlighter1_777_947_Closed_Image.style.display='inline'; Codehighlighter1_777_947_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_777_947_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_777_947_Closed_Text.style.display='none'; Codehighlighter1_777_947_Open_Image.style.display='inline'; Codehighlighter1_777_947_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_777_947_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_777_947_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler.BeginReceive(info.Buffer,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;info.Buffer.Length,&nbsp;SocketFlags.None,&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;AsyncCallback(ReceiveCallBack),&nbsp;info);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">向系统投递下一个接收请求</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(SocketException)&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">出现Socket异常就关闭连接</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_1023_1080_Open_Image onclick="this.style.display='none'; Codehighlighter1_1023_1080_Open_Text.style.display='none'; Codehighlighter1_1023_1080_Closed_Image.style.display='inline'; Codehighlighter1_1023_1080_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1023_1080_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1023_1080_Closed_Text.style.display='none'; Codehighlighter1_1023_1080_Open_Image.style.display='inline'; Codehighlighter1_1023_1080_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1023_1080_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1023_1080_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseSocket(info);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_1120_1138_Open_Image onclick="this.style.display='none'; Codehighlighter1_1120_1138_Open_Text.style.display='none'; Codehighlighter1_1120_1138_Closed_Image.style.display='inline'; Codehighlighter1_1120_1138_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1120_1138_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1120_1138_Closed_Text.style.display='none'; Codehighlighter1_1120_1138_Open_Image.style.display='inline'; Codehighlighter1_1120_1138_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1120_1138_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1120_1138_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果接收到0字节的数据说明客户端关闭了Socket，那我们也要关闭Socket</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_1225_1274_Open_Image onclick="this.style.display='none'; Codehighlighter1_1225_1274_Open_Text.style.display='none'; Codehighlighter1_1225_1274_Closed_Image.style.display='inline'; Codehighlighter1_1225_1274_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1225_1274_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1225_1274_Closed_Text.style.display='none'; Codehighlighter1_1225_1274_Open_Image.style.display='inline'; Codehighlighter1_1225_1274_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1225_1274_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1225_1274_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseSocket(info);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">接下来我们看看如何发送数据给客户端：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Code_Closed_Image_235648 onclick="this.style.display='none'; Code_Closed_Text_235648.style.display='none'; Code_Open_Image_235648.style.display='inline'; Code_Open_Text_235648.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_235648 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_235648.style.display='none'; Code_Closed_Image_235648.style.display='inline'; Code_Closed_Text_235648.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_235648 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Code_Open_Text_235648 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Send(Socket&nbsp;socket,&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">&nbsp;message)<br><img id=Codehighlighter1_62_415_Open_Image onclick="this.style.display='none'; Codehighlighter1_62_415_Open_Text.style.display='none'; Codehighlighter1_62_415_Closed_Image.style.display='inline'; Codehighlighter1_62_415_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_62_415_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_62_415_Closed_Text.style.display='none'; Codehighlighter1_62_415_Open_Image.style.display='inline'; Codehighlighter1_62_415_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_62_415_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_62_415_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_92_257_Open_Image onclick="this.style.display='none'; Codehighlighter1_92_257_Open_Text.style.display='none'; Codehighlighter1_92_257_Closed_Image.style.display='inline'; Codehighlighter1_92_257_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_92_257_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_257_Closed_Text.style.display='none'; Codehighlighter1_92_257_Open_Image.style.display='inline'; Codehighlighter1_92_257_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_92_257_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_92_257_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.socket.BeginSend(message,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;_byte.Length,&nbsp;SocketFlags.None,&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;AsyncCallback(SendCallBack),&nbsp;info);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这里向系统投递一个发送数据的请求，并指定一个回调函数。</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(SocketException&nbsp;ex)<br><img id=Codehighlighter1_310_359_Open_Image onclick="this.style.display='none'; Codehighlighter1_310_359_Open_Text.style.display='none'; Codehighlighter1_310_359_Closed_Image.style.display='inline'; Codehighlighter1_310_359_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_310_359_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_310_359_Closed_Text.style.display='none'; Codehighlighter1_310_359_Open_Image.style.display='inline'; Codehighlighter1_310_359_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_310_359_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_310_359_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseSocket(info);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_391_405_Open_Image onclick="this.style.display='none'; Codehighlighter1_391_405_Open_Text.style.display='none'; Codehighlighter1_391_405_Closed_Image.style.display='inline'; Codehighlighter1_391_405_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_391_405_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_391_405_Closed_Text.style.display='none'; Codehighlighter1_391_405_Open_Image.style.display='inline'; Codehighlighter1_391_405_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_391_405_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_391_405_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></div>
<p><span>定义发送回调函数：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Code_Closed_Image_235801 onclick="this.style.display='none'; Code_Closed_Text_235801.style.display='none'; Code_Open_Image_235801.style.display='inline'; Code_Open_Text_235801.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_235801 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_235801.style.display='none'; Code_Closed_Image_235801.style.display='inline'; Code_Closed_Text_235801.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_235801 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Code_Open_Text_235801 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;SendCallBack(IAsyncResult&nbsp;ar)<br><img id=Codehighlighter1_59_269_Open_Image onclick="this.style.display='none'; Codehighlighter1_59_269_Open_Text.style.display='none'; Codehighlighter1_59_269_Closed_Image.style.display='inline'; Codehighlighter1_59_269_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_59_269_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_59_269_Closed_Text.style.display='none'; Codehighlighter1_59_269_Open_Image.style.display='inline'; Codehighlighter1_59_269_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_59_269_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_59_269_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserInfo&nbsp;info&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(UserInfo)ar.AsyncState;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_142_213_Open_Image onclick="this.style.display='none'; Codehighlighter1_142_213_Open_Text.style.display='none'; Codehighlighter1_142_213_Closed_Image.style.display='inline'; Codehighlighter1_142_213_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_142_213_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_142_213_Closed_Text.style.display='none'; Codehighlighter1_142_213_Open_Image.style.display='inline'; Codehighlighter1_142_213_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_142_213_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_142_213_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info.socket.EndSend(ar);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用这个函数来结束本次发送。</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_245_259_Open_Image onclick="this.style.display='none'; Codehighlighter1_245_259_Open_Text.style.display='none'; Codehighlighter1_245_259_Closed_Image.style.display='inline'; Codehighlighter1_245_259_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_245_259_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_245_259_Closed_Text.style.display='none'; Codehighlighter1_245_259_Open_Image.style.display='inline'; Codehighlighter1_245_259_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_245_259_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_245_259_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></span></div>
&nbsp;
<p><span>好了，整个监听、接收、发送的过程就完成了，很简单吧。现在需要说明的是，我在这里接收客户端连接的</span><span>Accept</span><span>是用的同步的，我个人认为在这里用同步的会比用异步好一些。因为这样代码简单而且没有性能上的损失。</span></p>
<br><a href="http://www.cnblogs.com/wzd24/archive/2007/06/13/782833.html">http://www.cnblogs.com/wzd24/archive/2007/06/13/782833.html</a></span></span></span><img src ="http://www.cnitblog.com/cmoron/aggbug/45652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/cmoron/" target="_blank">牛牛猪</a> 2008-06-13 00:57 <a href="http://www.cnitblog.com/cmoron/articles/45652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>