2010-05-11 225 views
2

我正在考虑基于服务器和各种客户端的应用程序,但我遇到了发送命令的问题。 每当我做ctrl + c在客户端的发送操作杀死线程和进程正在运行(为了让多个客户端我设置一个线程到哪一个)。发送套接字c ctrl + c行为

如果客户端(做关闭套接字)正确的服务器不会死,但是当我使用CTRL +ç组合在客户端上都退出。

我该怎么做才能防止发送突击队发生这种行为?

Thx提前

回答

2

结帐beej's guide to signals。您需要捕捉并处理信号:CTRL + C,这是SIGINT(终端中断信号)。

+0

完成thx很多的建议 – 2010-05-11 16:11:51

1

为了关闭套接字连接和正确的CTRL终止您的客户端程序 - Ç,您可能需要为SIGINT提供适当的信号处理程序。这通过使用signal()或优选地,sigaction()功能来完成。

这个问题和它的答案可能会感兴趣:How should I close a socket in a signal handler?

在您的服务器程序,你应该检查每个函数错误通过检查函数的返回值,例如accept()recv()/read()涉及插座。如果函数的返回值指示错误(通常为-1),请查看errnoerrno的值应该提供关于错误性质的一些指示,并允许错误情况得到适当的处理。这应该有助于您更好地处理客户端应用程序意外终止时连接丢失的情况。

2

让我来总结一下,我相信你的问题是:当你打CTRL +Ç关闭客户端,在服务器退出。并且希望以这种方式处理此行为,以便服务器不会像上面那样崩溃。如果这是真的,那么请仔细阅读,我想我可能会对实际问题有所了解,但与使用(或不使用)适当的信号处理并无太大关系。

当您关闭使用CTRL +ç客户端,操作系统将停止客户端程序,并通过关闭它打开的所有插座。作为其中的一部分,FIN将被发送到服务器。

请检查您的代码。我相信你会以这样的方式编写代码,它会在与客户端相关的套接字的read()调用中被阻塞。现在,当上面发送的FIN到达服务器端套接字时,此读取将返回值为0.

如果您的代码不检查此情况并尝试将某些内容写回客户端,最终(我跳过几步发生在中间),它会收到一个SIGPIPE。这会导致你的服务器崩溃。

如果上述情况属实,则有两种方式: 1.检查read()返回0并正常继续。 2.安装SIGPIPE的信号处理程序。

我更喜欢第一种方法,顺便说一句。