4

我想知道当只有一个条件(数据可供读取)满足时,是否有办法在 c# 中轮询套接字,我知道socket.Poll方法,但如果有任何数量的,这可以返回 true指定的 3 个条件返回此处指定的 true:MSDN: Socket.Poll

4

6 回答 6

7

根据 MSDN 文档,有三个原因返回 true

Poll(microSeconds, SelectMode.SelectRead);

  1. 如果Listen()已被调用并且连接处于挂起状态
  2. 如果有数据可供读取
  3. 如果连接已关闭、重置或终止

让我们看看我们是否可以区分它们:

  1. 你总是知道之前是否Listen()被调用过,所以如果你没有调用过,你就不需要考虑那个原因。
  2. 好吧,你去吧。
  3. 意味着您不能停留在 Poll() 调用中,需要找出真正发生的事情。Poll()一种选择是在返回后立即检查套接字的状态。

结论:

  1. 不需要考虑

  2. 3.可以通过每次返回true时检查套接字状态来处理。

所以我会选择(未经测试):

if (s.Poll(microSeconds, SelectMode.SelectRead)))
{
  if (!s.Connected)
    // Something bad has happened, shut down
  else
    // There is data waiting to be read"
}
于 2009-08-09T08:25:47.853 回答
5

您可以使用可用的 Socket 属性。它返回有多少数据可供读取。

于 2009-08-09T07:57:22.187 回答
1

在 NetworkStream 类中找到了一些东西。如果数据可供读取,属性NetworkStream.DataAvailable将返回 true。处理 TcpListener 和 TcpClient 的 networkstream 对象返回。这是比套接字高一级的抽象层。

我发现没有办法从 Socket 到 NetworkStream。NetworkStream 正在使用套接字,并且是套接字的流表示。但我不知道网络流在那里用套接字做什么。

于 2009-08-08T20:39:05.710 回答
1

您可以在底层句柄上使用 select() 系统调用。

于 2009-08-08T20:40:29.980 回答
1

您可以使用 Select() 方法代替 Poll()。实际上,当使用 ILSpy(反射器工具)查看 Socket.Poll 时,内部代码正在调用套接字上的 select。

此外,在紧密循环中调用 Poll() 会增加内存分配,因为它在每次调用时都会执行新的 IntPtr[]。调用 Select() 可让您重用数组,而不是在后台分配新数组。

于 2014-05-19T12:30:46.427 回答
0

如果 Listen 已被调用且连接处于挂起状态,则为 true;- 或 - 如果数据可供读取,则为 true;- 或 - 如果连接已关闭、重置或终止,则为 true;否则,返回 false。

我了解您想检查第二个选项是否返回 true?检查 Poll 是否返回 true 后,可以检查连接是否打开,即;未连接、关闭、重置或终止。

如果它是打开的,那么它是第二个选项返回 true。

于 2009-08-08T20:49:28.230 回答