对Socket.Poll方法还是不太理解

三鲜卷 2018-05-13 11:32:41
Socket.Poll方法第一个参数是超时时间,第二个参数是模式
我一直不太明白这个超时时间是什么意思,网上写的是【Poll 将阻止执行,直到指定的时间段结束】
请问这个阻止执行是和Socket.Accept这种方法的阻止执行是一个意思吗?
然后Poll方法又在阻止执行的时间内做了什么操作?它检测Socket状态,是按照在这个超时时间内一直检测,还是怎么检测的超时时间结束后检测?
对这个方法我一直都不是很理解这个超时时间这个参数
下面是我在服务端检测客户端是否断开的代码,如果我设置1000或者1还算正常,客户端每次发消息都挺正常;但是如果设置-1或者1000000微秒这样的值,在服务器第一次接收到消息后,循环到这个Poll方法就直接返回true了,就显示客户端断开了。所以有没有大神可以指导下这个超时时间是什么意思?
while (true)
{
if (clientSocket.Poll(1000, SelectMode.SelectRead))
{
Console.WriteLine("客户端断开连接");
break;
}
int length = clientSocket.Receive(data);
string message = Encoding.UTF8.GetString(data, 0, length);
Console.WriteLine("收到了数据:"+message);
}
...全文
2083 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
三鲜卷 2018-05-14
  • 打赏
  • 举报
回复


我是根据官方文档里写的,我看图里SelectMode.SelectRead在连接断开也可以返回true,才这么写的
虽然你说的也没错,图里也写了在连接可读是也返回true,那么这个方法到底怎么判断连接是否断开呢?
xuzuning 2018-05-14
  • 打赏
  • 举报
回复
虽然 Socket.Poll 和 Socket.Select 同为 I/O 多路复用方法,但显然 Socket.Poll 所处的位置较低,没有后者来的灵活 Socket.Poll 只是检查当前套接字在指定的时间段中是否处于期望的状态,你需要根据 Socket.Poll 的返回来决定下一步的动作 而 Socket.Select 是在指定的时间段内,标记出所有可用的套接字 你的
                if (clientSocket.Poll(1000, SelectMode.SelectRead))
                {
                    Console.WriteLine("客户端断开连接");
                    break;
                }
 
能正常工作吗?参数 SelectMode.SelectRead 表示检查套接字是否可读(有数据到来)成功返回 true 而你却 break 了
xuzuning 2018-05-14
  • 打赏
  • 举报
回复
其实按说明,就根本不知道什么时候返回 false 对于搞不清楚的东西,也没必要去用它,连测试都不知都如何下手,就不要中使用了 其实 Socket 的 Select 方式是一直以来被认为最可靠的,在 C++ (和很多语言)中被广泛。只是很少见到 C# 的应用范例,开始我还以为 C# 丢弃他了呢,后来才发现他被搁置在了角落里

111,120

社区成员

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

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

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