我正在使用基于服务器和各种客户端的应用程序,但我遇到了send命令的问题。 每当我在客户端执行 ctrl + c 时,发送操作会杀死进入的线程并且进程正在运行(为了让多个客户端设置一个线程,一个)。
如果客户端正确结束(执行关闭套接字)服务器不会死,但是当我在客户端上使用 ctrl + c 组合时都退出。
如何防止send命令出现此行为?
先谢谢
答案 0 :(得分:3)
结帐beej's guide to signals。您需要捕获并处理 CTRL + C 的信号,即SIGINT(终端中断信号)。
答案 1 :(得分:2)
让我总结一下我认为你的问题是什么:每当你按 ctrl + c 关闭客户端时,服务器退出。并且您希望以服务器不会如上所述崩溃的方式处理此行为。如果这是真的,请继续阅读,我想我可能能够对实际问题有所了解,它与使用(或不使用)正确的信号句柄并没有多大关系。
当您使用 ctrl + c 关闭客户端时,操作系统将停止客户端进程并关闭它打开的所有套接字。作为其中的一部分,FIN将被发送到服务器。
请检查您的代码。我相信你会以一种方式编写代码,它在与来自相关客户端的套接字的read()调用中被阻塞。现在,当上面发送的FIN到达服务器端套接字时,此读取将返回值为0.
如果您的代码没有检查这个条件并尝试将某些东西写回客户端,那么最终(我跳过中间发生的几个步骤)它将收到一个SIGPIPE。这将导致您的服务器崩溃。
如果上述情况属实,您有2个出路: 1.检查read()返回0并正常继续。 2.为SIGPIPE安装信号处理程序。
我更喜欢第一种方法,顺便说一句。
答案 2 :(得分:1)
为了关闭套接字连接并在 ctrl - c 上正确终止客户端程序,您可能需要为SIGINT
提供适当的信号处理程序。这是使用signal()
或最好的sigaction()
函数完成的。
这个问题及其答案可能会引起关注:How should I close a socket in a signal handler?
在您的服务器程序中,您应该通过检查函数的返回值来检查涉及套接字的每个函数的错误,例如accept()
或recv()
/ read()
。如果函数的返回值指示错误(通常为-1),请查看errno
。 errno
的值应该提供关于错误性质的一些指示,并允许适当地处理错误情况。这可以帮助您更好地处理客户端应用程序意外终止时连接丢失的情况。