C#TCP套接字“阻止”属性不一致

时间:2010-08-11 15:45:06

标签: c# .net sockets networking tcp

我以下列方式使用tcp套接字:

m_socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); m_socket.ReceiveTimeout = 15;

一般流程是我在无限循环中运行m_socket.Receive,并且在某些时候套接字变长为空了很长一段时间但我不想关闭它。 相反,我希望每隔15秒继续尝试读取和超时。

在第一次套接字变空时,我会在15秒后按预期获得超时套接字异常。 然后,因为我仍然在循环中,再次调用m_socket.Receive - 但是这次无法完成非阻塞套接字操作抛出异常(这不是我所期望的,它假设再阻塞15秒)即使我在上面查询m_socket.Blocking一行时,它也显示为TRUE。

有趣的是,如果我执行m_socket.Blocking = true;就在m_socket.Receive之前,一切都按预期运行(每15秒抛出一次超时异常)。

唯一可能的解释是,超时异常以某种方式改变了接收操作或Socket操作,一般是以非阻塞方式工作,而不是相应地更改“阻塞”属性。

3 个答案:

答案 0 :(得分:1)

我找到了this

显然,有一个关于此问题的错误已在.NET 4.0中修复

答案 1 :(得分:0)

你是否在同一个线程上阻止了另一个winsock函数调用?

来自msdn

  

注意发出阻止时   Winsock调用,例如send,recv,   选择,接受或连接功能   电话,Winsock可能需要等待   呼叫前的网络事件可以   完成。 Winsock执行   在这种情况下警惕等待,   这可以被一个人打断   异步过程调用(APC)   安排在同一个线程上,和   从而产生未指定的结果。做   没有问题阻止Winsock功能   打电话而不确定   当前线程没有在里面等待   另一个阻止Winsock功能   呼叫;这样做会导致   不可预测的行为。

答案 2 :(得分:0)

ReceiveTimeout以毫秒为单位指定。您应该设置15000以使其工作。看http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.receivetimeout%28v=vs.110%29.aspx