我有一个 UNIX 域套接字,我能够在服务器和客户端之间创建和通信。问题是服务器可能意外崩溃的场景:如何处理这种情况?
我代码中的客户端是另一个程序的一部分,该程序还管理各种其他任务并通过套接字将数据发送到服务器。
返回的错误值是我维护的一个Enum。此代码是库的一部分。
我连接到服务器如下
int sock;
struct sockaddr_un server;
//Create socket
sock = socket(AF_UNIX , SOCK_STREAM , 0);
if (sock == -1)
{
return ERR_SOCK;
}
server.sun_family = AF_UNIX;
strcpy(server.sun_path,SOCKET_PATH);
//Connect to remote server
if (connect(sock , (struct sockaddr *)&server , sizeof(struct sockaddr_un)) < 0)
{
return ERR_CONFAIL;
}
之后我发送如下数据
ret=send(sock , message , sizeof(struct message_t) , 0 );
if(ret < 0){
printf("Error while sending\n");
return ERR_NOCON;
}
通常一切正常,但如果我终止我的服务器并发送数据,则发送不会返回并且客户端终止。
最佳答案
你可以使用 poll(2)在写入或发送之前在文件描述符上。这将检查是否可以发送数据。更一般地说,您可以拥有(并且可能已经拥有)一些 event loop .
作为Dark Falcon注释(参见 this answer),您将收到 SIGPIPE
信号。所以读signal(7) .您可以忽略该信号(但它们在忽略 SIGPIPE
方面有利有弊)。
也可以使用 strace(1)了解更多正在发生的事情(涉及哪些系统调用和信号)。
您还可以让服务器发送其 pid,并让客户端使用 kill(2)使用 0 信号编号来测试服务器进程的存在(因为两者都是同一台机器的本地进程)。但我不建议您这样做。
关于c - 客户端如何知道服务器是否已退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25765113/