我想知道当只有一个条件(数据可供读取)时,是否有办法在c#中轮询套接字,我知道 socket.Poll 方法但如果指定的3个条件中的任何数量返回true,则返回true,如下所示:MSDN: Socket.Poll
答案 0 :(得分:6)
根据MSDN文档,有三个原因导致
返回true
Poll(microSeconds, SelectMode.SelectRead);
Listen()
并且连接正在等待让我们看看我们是否可以区分它们:
Listen()
,因此如果您没有,则不需要考虑该原因。Poll()
返回后立即检查套接字的状态。结论:
不需要考虑
和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"
}
答案 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。