我有一个UNIX域套接字,我能够在服务器和客户端之间创建和通信。问题是服务器可能意外崩溃的情况:如何处理这种情况?
我的代码中的客户端是另一个程序的一部分,该程序还管理各种其他任务,并通过套接字将数据发送到服务器。
返回错误值是由我维护的枚举。此代码是库的一部分。
我按如下方式连接到服务器
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;
}
通常一切正常但如果我终止服务器并发送数据,则发送不会返回,客户端终止。
答案 0 :(得分:2)
在写入或发送文件描述符之前,您可以在文件描述符上使用poll(2)。这将检查是否可以发送数据。更一般地说,你可能(也许已经有)event loop。
在Dark Falcon评论时(请参阅this answer),您收到了SIGPIPE
信号。请阅读signal(7)。你可以忽略那个信号(但忽略SIGPIPE
)它们是赞成还是缺点。
还可以使用strace(1)了解更多信息(涉及的系统调用和信号)。
您可能还让服务器发送其pid,并让客户端使用带有0信号编号的kill(2)来测试服务器进程是否存在(因为两者都是同一台机器的本地) 。但是在我的情况下,我不会推荐这个。