有没有办法在C#中调用套接字只有在可以读取的东西时?

时间:2009-08-08 19:04:00

标签: c# .net sockets polling

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

6 个答案:

答案 0 :(得分:6)

根据MSDN文档,有三个原因导致

返回true

Poll(microSeconds, SelectMode.SelectRead);

  1. 如果已调用Listen()并且连接正在等待
  2. 如果有数据可供阅读
  3. 如果连接已关闭,重置或已终止
  4. 让我们看看我们是否可以区分它们:

    1. 您始终知道之前是否曾调用Listen(),因此如果您没有,则不需要考虑该原因。
    2. 好的,你去那。
    3. 意味着你不能留在Poll()电话中,需要找出真正发生的事情。一种选择是在Poll()返回后立即检查套接字的状态。
    4. 结论:

      1. 不需要考虑

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

      3. 所以我会去(未经测试):

        if (s.Poll(microSeconds, SelectMode.SelectRead)))
        {
          if (!s.Connected)
            // Something bad has happened, shut down
          else
            // There is data waiting to be read"
        }
        

答案 1 :(得分:4)

您可以使用Socket属性Available。它返回可读取的数据量。

答案 2 :(得分:1)

在NetworkStream类中找到了一些东西。如果数据可供读取,则属性NetworkStream.DataAvailable返回true。返回网络流的对象处理TcpListener和TcpClient。这是一个高于socket的抽象级别。

我发现无法从Socket转到NetworkStream。 NetworkStream正在使用套接字,它是套接字的流表示形式。但是我不知道网络流在插座上做了什么。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

我知道您要检查第二个选项是否返回true?在检查Poll是否返回true之后,您可以检查连接是否打开,这意味着;没有连接,关闭,重置或终止。

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