如何中断 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的主要内容,如果未能解决你的问题,请参考以下文章

内部中断,外部中断,网口中断优先级 如何配置

中断向量表的作用是啥?如何设置中断向量表

中断优先级如何设置?

stm32如何在中断服务程序里关闭EXTI中断?

如何进入IDLE中断

如何在Zynq SoC上使用中断