客户端如何正常检测服务器何时断开连接?

时间:2009-11-02 13:10:16

标签: c++ exception-handling

我正在研究客户端 - 服务器应用程序。客户端不断从服务器读取数据,因此当服务器关闭或断开连接时,客户端崩溃。我尝试了try / catch块,但它没有用。我的客户端应用程序是用C ++编写的。我希望客户端显示一些正确的消息,例如“Server disconnected”,然后退出。

5 个答案:

答案 0 :(得分:1)

如果没有关于错误的更多细节,我们都只是猜测。

是什么让您认为异常导致错误?

如果使用堆栈安全性检查进行编译,则可能是分段错误或访问冲突或堆栈粉碎。

如果套接字处理中的某些内容覆盖了主处理函数的返回地址,则很容易发生这种情况。当套接字关闭时,处理功能将崩溃。

或者它可能是由双重释放或写入已释放的内存引起的堆内存损坏。

答案 1 :(得分:1)

我不确定你在运行什么平台,但如果它是基于Unix的平台,那么你可能会遇到一个“功能”,其中远程关闭的TCP连接可能导致你的客户端引发一个SIGPIPE当它试图写入套接字时发出信号。如果SIGPIPE信号未处理(除非您明确安装了处理程序,否则它将会出现),然后未处理的信号将导致程序终止。

避免此问题的最简单方法是在程序开头包含此内容:

#include <signal.h>

// [... somewhere near the top of main(), perhaps ...]
signal(SIGPIPE, SIG_IGN);

一旦完成,关闭的连接将以更微妙的方式传达给您,例如: select()返回准备读取然后recv()返回0(表示EOF)。

在Windows下不会发生SIGPIPE,因此如果您的程序只是Windows,则可以忽略此帖子:)

答案 2 :(得分:0)

Code Project上查看Len Holgates的内容 - he hangs out here too。他是套接字上的 大脑,他的IOCP内容是我见过的最好的东西,而且我知道他的东西正是你所寻找的。

答案 3 :(得分:0)

概括异常处理以处理引发的任何类型的异常;

try
{
 // try something
}
catch(...)
{
 // handle exception
}

处理特定类型的异常,例如com异常

try
{
 //try something
}
catch(_com_error &e)
{
 // handle exception
}

您还可以转到MSDNHERE了解更详细的信息。

答案 4 :(得分:0)

你没有告诉我们太多,所以我必须做出一些猜测。

在C ++中,不像Java或C#那样使用异常,其中(几乎)所有错误处理都是使用异常完成的。在C ++中,还需要使用其他一些独立的机制。

如果在Java中出现空指针错误,Java会抛出NullPointerException,您可以使用try-catch块捕获它。在C ++中,您会遇到分段错误(或不是,或其他东西,具体取决于您使用的操作系统),这可能被try-catch块捕获。这是一种完全不同的机制。

如果您尝试将文本字符串转换为数字,但它不起作用,Java会抛出NumberFormatException。在C ++中,您必须在事后检查它是否有效。 try-catch块对你没有帮助。

因此,将库调用封装在try-catch块中可能对您没有帮助。如果您的套接字库在服务器关闭时没有抛出异常(我认为它不太可能),那么几乎可以肯定还有其他方法可以检查它。也许有一个读取调用的返回值,如果套接字的另一端已经关闭,那么它将是否定的?

如果您没有检查已关闭的套接字,并且您的程序一直在尝试读取和处理接收到的数据,就好像套接字仍处于打开状态一样,程序很可能会崩溃。但是这个崩溃也不能通过try-catch来处理。

因此,总而言之,try-catch可能是解决问题的错误方法,您需要检查套接字库的文档以了解如何执行此操作。