【发布时间】: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