请教高手:如何在.net里探测socket是否有数据可读

chgsnake 2004-04-12 02:20:09
以前c++我用select函数可以探测,现在.net里提供了socket.BeginReceive(),但是数据会被读出来,我只想探测一下socket是否可读,请问该怎么办
...全文
101 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzx110 2004-04-21
  • 打赏
  • 举报
回复
MSDN上的详细信息,具体也就不用我多说了吧!
语言
C#

全部显示
确定一个或多个套接字的状态。


[C#]
public static void Select(
IList checkRead,
IList checkWrite,
IList checkError,
int microSeconds
);


参数
checkRead
要检查可读性的 Socket 实例的 IList。
checkWrite
要检查可写性的 Socket 实例的 IList。
checkError
要检查错误的 Socket 实例的 IList。
microSeconds
等待响应的时间(以微秒为单位)。
异常
异常类型 条件
ArgumentNullException checkRead 参数为空引用(Visual Basic 中为 Nothing)或空。
-并且-

checkWrite 参数为空引用 (Nothing) 或空。

-并且-

checkError 参数为空引用 (Nothing) 或空。

SocketException 试图访问套接字时发生错误。有关更多信息,请参见备注部分。

备注
Select 是一种静态方法,它可确定一个或多个 Socket 实例的状态。必须先将一个或多个套接字放入 IList 中,然后才能使用 Select 方法。通过调用 Select(将 IList 作为 checkread 参数),可检查是否具有可读性。若要检查套接字是否具有可写性,请使用 checkwrite 参数。若要检测错误条件,请使用 Checkerror。在调用 Select 之后,IList 中将仅填充那些满足条件的套接字。

如果当前处于侦听状态,则可读意味着可成功地对 Accept 进行调用而没有阻塞。如果当前已接受连接,则可读意味着有可读取的数据。这些情况下,所有的接收操作均可成功进行而没有阻塞。可读性也可指示远程 Socket 是否已经关闭连接;如果连接已关闭,则对 Receive 的调用将立即返回,并返回零字节。

如果对 Connect 进行非阻塞调用,则可写意味着已经成功连接。如果已经建立连接,则可写意味着所有的发送操作均会成功完成而没有阻塞。

如果对 Connect 进行非阻塞调用,则错误检查参数将标识尚未成功连接的套接字。

注意 如果只想确定单个 Socket 的状态,请使用 Poll 方法。
注意 如果收到 SocketException,请使用 SocketException.ErrorCode 获取具体的错误代码。获取该代码后,可以参考 MSDN 中的 Windows Socket Version 2 API(Windows 套接字第 2 版 API)错误代码文档以获取有关错误的详细说明。
示例
[Visual C#] 下面的示例使用 Select 来确定哪一个侦听套接字有连接请求。

[C#]
IPHostEntry ipHostEntry = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostEntry.AddressList[0];

Socket socket0 = null;
Socket socket1 = null;
Socket socket2 = null;
Socket socket3 = null;
Socket socket4 = null;
Socket socket5 = null;

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 + i));
((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);

for( int i = 0; i < listenList.Count; i++ )
{
acceptList[i] = ((Socket)listenList[i]).Accept();
}

要求
平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 系列, .NET Framework 精简版 - Windows CE .NET, 公共语言基础结构 (CLI) 标准

请参见
Socket 类 | Socket 成员 | System.Net.Sockets 命名空间 | IList | Accept | Connect | Poll | Socket 成员(Visual J# 语法) | C++ 托管扩展编程


--------------------------------------------------------------------------------

发送有关此主题的意见

© 2001-2002 Microsoft Corporation。保留所有权利。

huangsuipeng 2004-04-21
  • 打赏
  • 举报
回复
ding
songbird 2004-04-21
  • 打赏
  • 举报
回复
Socket.Available
返回可供使用的字节数。
songbird 2004-04-21
  • 打赏
  • 举报
回复
好像见过类似Select的函数。
Samen168 2004-04-21
  • 打赏
  • 举报
回复
好久没用不太记得了,应该是查缓存区吧
PhantomNet 2004-04-21
  • 打赏
  • 举报
回复
帮你顶。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧