【发布时间】:2010-08-11 15:45:05
【问题描述】:
我通过以下方式使用 tcp 套接字:
m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); m_socket.ReceiveTimeout = 15;
一般流程是我在一个无限的while循环中运行m_socket.Receive,并且在某个时候套接字会长时间为空,但我不想关闭它。 相反,我想继续尝试每 15 秒读取一次异常并超时。
发生的情况是,在套接字第一次变空时,我在 15 秒后得到了一个超时套接字异常,正如预期的那样。 然后,因为我仍在循环中,所以再次调用 m_socket.Receive - 但是这次无法完成非阻塞套接字操作异常被抛出(这不是我所期望的,它应该再阻塞 15 秒) 即使当我查询 m_socket.Blocking 上面的一行时,它说的是 TRUE。
有趣的是,如果我执行 m_socket.Blocking = true;就在 m_socket.Receive 之前,一切都按预期运行(仅每 15 秒抛出一次超时异常)。
唯一可能的解释是超时异常以某种方式改变了接收操作或一般的套接字操作以非阻塞方式工作,而没有相应地改变“阻塞”属性。
【问题讨论】:
-
请发布接收循环代码
标签: c# .net sockets networking tcp