【问题标题】:Exit my while loop after 10 seconds while I'm waiting a response from a TcpClient在等待 TcpClient 响应的 10 秒后退出我的 while 循环
【发布时间】:2013-01-11 19:02:40
【问题描述】:

我正在尝试在我的基本客户端-服务器聊天中实现 ping。我的问题在服务器端。我发送 ping,然后我想等待最多 10 秒,让客户端 ping 我回来。如果客户端在 10 秒后没有 ping 回,我希望我的 while 循环中断。这是我所做的:

public void ping()
{
    send("#PIN#");
    bool ponged = false;
    while (true) 
    {
        string rec = receive(); // it blocks here !!!!!!!!!!
        if (rec == "#PON#")
            ponged = true;
    }
}

我的send()receive() 方法没有问题。他们在其他地方工作得很好。 我尝试同时使用秒表和计时器来使循环在 10 秒后中断。问题在于接收功能阻塞直到收到消息。这是接收函数中阻塞的部分:

bytesRead = clientStream.Read(byteMsg, 0, 4096);

据我所知,这是从我的客户接收消息的正确方法。但是当然,如​​果客户端断开连接,我将永远不会被 ping 回来,这意味着我的 receive() 方法将永远不会结束。如果我的接收方法永远不会结束,那么我的 while 循环永远不会有机会检查stopWatch.Elapsed() 或从Timer 调用ElepsedEventHandler

所以问题是,我如何在知道该 while 循环中的一种方法可能不会结束的情况下强制该 while 循环在 10 秒后中断?

感谢您的宝贵时间。

【问题讨论】:

  • 当然在那里被屏蔽了。您正在使用同步套接字,因此每次要接收数据时,线程都会停止,直到数据到达。您可以检查套接字是否有数据,然后在不需要时接收它,或者使用异步套接字。更多信息谷歌:“同步和异步通信”
  • 您需要在 read 方法中或通过流属性进行设置,例如 Stream.ReadTimeout。这应在框架/操作系统级别实现,而不是直接在您的代码中实现。

标签: c# while-loop tcpclient ping break


【解决方案1】:

如果您使用 NetworkStream 读取数据,则可以使用 ReadTimeout 属性。

如果读取操作没有在指定的时间内完成 这个属性,读操作会抛出 IOException。

【讨论】:

    猜你喜欢
    • 2019-08-28
    • 2015-07-18
    • 2021-08-14
    • 2013-03-01
    • 2017-07-21
    • 2020-06-29
    • 2010-12-17
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多