msdn中例子Socket.Acceptasyncdelegate msdn怎么避免无限递归

你得学会并且学得会的Socket编程基础知识_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
你得学会并且学得会的Socket编程基础知识
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩21页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢Socket.Poll(),Socket.Select()
Socket.Poll()
public bool Poll (
&&&&&&&&&&&&&&&&&&&
int microSeconds,
&&&&&&&&&&&&&&&&&&&
SelectMode mode
Poll 方法将会检查 Socket 的状态。指定 selectMode 参数的
SelectMode.SelectRead,可确定 Socket 是否为可读。指定
SelectMode.SelectWrite,可确定 Socket 是否为可写。使用
SelectMode.SelectError 检测错误条件。Poll 将在指定的时段(以
microseconds 为单位)内阻止执行。如果希望无限期的等待响应,则将 microSeconds 设置为一个负整数。
int& microSeconds,
等待响应的时间(以微秒为单位)。
是Poll程序中断运行时间。
如microseconds=1000;Poll阻塞1000毫秒,microseconds&0将无限等待响应。
SelectMode mode
&public enum SelectMode
SelectRead = 0,&
读状态模式。
SelectWrite = 1,
写状态模式。
SelectError = 2,
错误状态模式。
模式(SelectMode)
返回(return)
SelectRead
&如果已调用Listen并且有挂起的连接,则为true。
2.如果有数据可供读取,则为true。
3.如果连接已关闭、重置或终止,则返回true。
SelectWrite
如果正在处理Connect并且连接已成功,则为true。
2.& 如果可以发送数据,则返回true。
SelectError
如果正在处理不阻止的Connect,并且连接已失败,则为true。
如果OutOfBandInline未设置,并且带外数据可用,则为true。
自己理解:
只对红色部分理解。
//Creates the Socket for sending data over TCP.
Socket s = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp );
// Connects to host using IPEndPoint.
s.Connect(EPhost);
if (!s.Connected)
&& strRetPage =
"Unable to connect to host";
// Use the SelectWrite enumeration to obtain Socket
&if(s.Poll(-1,
SelectMode.SelectWrite)){
Console.WriteLine("This Socket is writable.");
&else if (s.Poll(-1,
SelectMode.SelectRead)){
Console.WriteLine("This Socket is readable." );
&else if (s.Poll(-1,
SelectMode.SelectError)){
Console.WriteLine("This Socket has an error.");
自己例子:
protected override void ProcMessage()
&&&&&&&&&&&
int microSeconds = 50;
&&&&&&&&&&&
EndPoint senderRemote = socket.RemoteEndP
&&&&&&&&&&&
int dataLen, msgLen = 0;
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&&&
if (socket.Poll(microSeconds, SelectMode.SelectRead))
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
dataLen = ReceiveFrom(m_ReceiveBuf, m_ReceiveBuf.Length,
&&&&&&&&&&&&&&&&&&&
if (EClass.Message.Message.Valid(m_ReceiveBuf))
&&&&&&&&&&&&&&&&&&&&&&&
MessageParse(m_ReceiveBuf, dataLen, (IPEndPoint)senderRemote);
&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
catch (SocketException se)
&&&&&&&&&&&
&&&&&&&&&&&&&&&
SocketError err = se.SocketErrorC
&&&&&&&&&&&
Socket.Select()
public static void Select (
&&&&&&&&&&&&&&
IList checkRead,
&&&&&&&&&&&&&&
IList checkWrite,
&&&&&&&&&&&&&&
IList checkError,
&&&&&&&&&&&&&&
int microSeconds
Select 是一种静态方法,它可确定一个或多个 Socket
实例的状态。必须先将一个或多个套接字放入 IList 中,然后才能使用 Select 方法。通过调用
Select(将 IList 作为 checkRead
参数),可检查是否具有可读性。若要检查套接字是否具有可写性,请使用 checkWrite 参数。若要检测错误条件,请使用
checkError。在调用 Select 之后,IList 中将仅填充那些满足条件的套接字。
如果当前处于侦听状态,则可读意味着可成功地对
进行调用而没有阻止。如果当前已接受连接,则可读意味着有可读取的数据。这些情况下,所有的接收操作均可成功进行而没有阻止。可读性也可指示远程
Socket 是否已经关闭连接;如果连接已关闭,则对
的调用将立即返回,并返回零字节。
如果至少一个相关套接字(checkRead、checkWrite 和 checkError
列表中的套接字)符合其指定的条件,或者超过 microSeconds 参数,则无论先出现其中哪种情况,都会返回
Select。将 microSeconds 设置为 -1 会指定无限大的超时值。
进行非阻止调用,则可写意味着已经成功连接。如果已经建立连接,则可写性意味着所有的发送操作均会成功完成而没有阻止。
如果对 Connect 进行非阻止调用,则 checkerror
参数将标识尚未成功连接的套接字。
自己理解:
Select是一个静态方法。主要用于多个Socket套接字。
把从客户端接到Socket存到在ArrayList列表里。
执行Socket.Select(ArrayList,ArrayList,ArrayList,1000);会对ArrayList进行筛选,吧不符合条件的从ArraList里删除,留下符合条件的Socket。
MSDN例子:
IPHostEntry ipHostEntry =
Dns.Resolve(Dns.GetHostName());
&&&&&&&&&&&
IPAddress ipAddress = ipHostEntry.AddressList[0];
&&&&&&&&&&&
Socket socket0 =
&&&&&&&&&&&
Socket socket1 =
&&&&&&&&&&&
Socket socket2 =
&&&&&&&&&&&
Socket socket3 =
&&&&&&&&&&&
Socket socket4 =
&&&&&&&&&&&
Socket socket5 =
&&&&&&&&&&&
ArrayList listenList = new ArrayList();
&&&&&&&&&&&
listenList.Add(socket0);
&&&&&&&&&&&
listenList.Add(socket1);
&&&&&&&&&&&
listenList.Add(socket2);
&&&&&&&&&&&
ArrayList acceptList = new ArrayList();
&&&&&&&&&&&
acceptList.Add(socket3);
&&&&&&&&&&&
acceptList.Add(socket4);
&&&&&&&&&&&
acceptList.Add(socket5);
&&&&&&&&&&&
for (int i = 0; i & 3; i++)
&&&&&&&&&&&
&&&&&&&&&&&&&&&
listenList[i] = new Socket(AddressFamily.InterNetwork,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
SocketType.Stream,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ProtocolType.Tcp);
&&&&&&&&&&&&&&&
((Socket)listenList[i]).Bind(new IPEndPoint(ipAddress, 11000 +
&&&&&&&&&&&&&&&
((Socket)listenList[i]).Listen(10);
&&&&&&&&&&&
&&&&&&&&&&&
// Only the sockets that contain a connection request
&&&&&&&&&&&
// will remain in listenList after Select returns.
&&&&&&&&&&&
Socket.Select(listenList, null, null, 1000);
&&&&&&&&&&&
Console.Write(listenList.Count.ToString());
&&&&&&&&&&&
for (int i = 0; i & listenList.C i++)
&&&&&&&&&&&
&&&&&&&&&&&&&&&
acceptList[i] = ((Socket)listenList[i]).Accept();
&&&&&&&&&&&
&&Console.Read();
运行以后listenList全部剔除,按理应该保留符合SelectRead条件的。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。有关SocketAsyncEventArgs的问题
[问题点数:60分,结帖人SadEmprie]
有关SocketAsyncEventArgs的问题
[问题点数:60分,结帖人SadEmprie]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 accept msdn 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信