我以下列方式使用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操作,一般是以非阻塞方式工作,而不是相应地更改“阻塞”属性。
答案 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