我正在编写一个 TCP 服务器。它所要做的就是向/从 TCP 套接字读取/写入文本,并将此文本读取/写入到/从服务器运行的文件系统上的文本文件中。
如果连接出现问题(例如客户端关闭套接字),则在读/写时阻塞的服务器会收到 SIGPIPE 信号。我想忽略它:服务器只是关闭其套接字的末端,因为现在无法进行通信。这是一个好方法吗?
我还需要考虑其他信号吗?
许多服务器程序选择忽略SIGPIPE
,并使用read
/的返回码write
来更好地理解断开连接。例如,read
/在与另一端正确断开连接时recv
返回,并且在设置为多个备选方案之一时出错。0
-1
errno
您还可以实现一个中断处理程序,以防服务器崩溃,您可能希望在关闭之前执行一些操作。
例如信号
void interrupt_handler(int sig){
endloop = 1;
close(sd);
printf("Interrupt recieved: shutting down server!\n");
return;
}
int main(int argc, char** argv){
//all typical TCP socket functions
signal(SIGINT, interrupt_handler);
while(!endloop){
//service loop
}
}
如果服务器是一个守护进程,通常的做法是使用SIGHUP
重新启动或重新初始化服务器。但是,@Joachim 的回答是最重要的:客户端行为不应导致服务器终止。
注意:由于是异步的,信号处理程序可以安全地做什么是有限制的。