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

Dar*_*ar1 3 .net c# sockets polling

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

Arm*_*min 6

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

Poll(microSeconds, SelectMode.SelectRead);

  1. if Listen()已被调用且连接未决
  2. 如果数据可供阅读
  3. 如果连接已关闭,重置或终止

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

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

结论:

  1. 不需要考虑

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

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

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


小智 5

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