如何中断 Socket.Select
Posted
技术标签:
【中文标题】如何中断 Socket.Select【英文标题】:How do I interrupt Socket.Select 【发布时间】:2014-10-10 00:33:07 【问题描述】:如何在 c# 中中断 Socket.Select?
在 C 中,我使用了“自我管道”技巧或“信号”。
在 C# 中,我知道我可以创建一个套接字对并中断选择,但它看起来不是很干净。
我可以做些什么来中断 c# 中的选择调用。
【问题讨论】:
Is there anything better I could do
,比什么更好?显示您的代码,以便人们可以想到答案。在这种形式中,不清楚您的要求是什么......
查看您迄今为止获得的答案数量(即使有赏金)。你怎么看?是因为 SO 用户的无能还是您的问题的质量?
答案很简单:没有其他(便携式)方式。您必须再添加一个可以控制的套接字来中断选择(这就像自管道技巧)。仅限 Windows 的解决方案是 P/Invoke some WSA...
【参考方案1】:
为了自己解决这个问题,我只是在我的Socket.Select()
调用中列出的套接字上调用Socket.Close()
。这会中断选择并出现异常。
我会使用套接字对技巧,但我在 .net 中找不到与 pipe()
等效的方法。我有一种感觉,我在某处读到,在 Windows 上执行此操作的方法是通过 TCP 连接到环回(特别是因为 WSA 的 select()
无论如何都不支持“正常”文件描述符)。但这似乎比仅仅从另一个线程关闭侦听套接字并让Socket.Select()
被异常中断更脏,更容易发生坏事。
【讨论】:
【参考方案2】:你试过使用 Socket Shutdown 吗?
http://msdn.microsoft.com/en-us/library/system.net.sockets.socketshutdown(v=vs.110).aspx
socket.Shutdown(SocketShutdown.Both);
希望对你有帮助。
【讨论】:
【参考方案3】:我遇到了同样的问题。最好的选择是在不同的线程上运行选择。
这帮助我摆脱了异常错误。
【讨论】:
【参考方案4】:您是否尝试过使用 Select
函数的最后一个参数 (int microSeconds
)。它作为超时服务(-1 = 无超时)。
【讨论】:
我使用 -1 表示没有超时,这不是问题,我试图中断选择以中断超时。回到 C 语言中,除了自管道或信号等 hacky 方式之外,没有真正的解决方案可以中断它。我想知道 c# 是否有任何新功能可以在不使用任何“hacky”的情况下做到这一点。 ***.com/questions/3333361/… 读到这里,除了c#,同样的问题,C 解决方案很简单。 如果您的问题与另一个问题中的问题相似,那么我建议您使用另一个线程发送数据或仅使用 Select 中的 timout,捕获SocketException
并循环 if你在这个线程中没有其他事情要做(如果你在这个线程中有其他事情要做(例如发送数据),你将执行该任务然后重新启动循环以再次开始监听)。
我的问题只是在解锁select语句时类似。我不想为选择添加超时,我想要一种完全取消等待选择的方法,我有 C 中的解决方案和 C# 中的脏解决方案,但如果有可用的解决方案,我想要一个更干净的解决方案。跨度>
是的,我认为 C# 会发出信号来取消选择,就像在 c 中一样,但我找不到合适的东西。以上是关于如何中断 Socket.Select的主要内容,如果未能解决你的问题,请参考以下文章