2

我正在编写一个 TCP 服务器。它所要做的就是向/从 TCP 套接字读取/写入文本,并将此文本读取/写入到/从服务器运行的文件系统上的文本文件中。

如果连接出现问题(例如客户端关闭套接字),则在读/写时阻塞的服务器会收到 SIGPIPE 信号。我想忽略它:服务器只是关闭其套接字的末端,因为现在无法进行通信。这是一个好方法吗?

我还需要考虑其他信号吗?

4

3 回答 3

4

许多服务器程序选择忽略SIGPIPE,并使用read/的返回码write来更好地理解断开连接。例如,read/在与另一端正确断开连接时recv返回,并且在设置为多个备选方案之一时出错。0-1errno

于 2012-06-07T10:13:35.580 回答
1

您还可以实现一个中断处理程序,以防服务器崩溃,您可能希望在关闭之前执行一些操作。

例如信号

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

    }

}
于 2012-06-07T10:20:18.760 回答
0

如果服务器是一个守护进程,通常的做法是使用SIGHUP重新启动或重新初始化服务器。但是,@Joachim 的回答是最重要的:客户端行为不应导致服务器终止。

注意:由于是异步的,信号处理程序可以安全地做什么是有限制的。

于 2012-06-07T11:41:37.450 回答