客户如何知道服务器是否已退出?

时间:2014-09-10 12:09:48

标签: c linux sockets

我有一个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;
}

通常一切正常但如果我终止服务器并发送数据,则发送不会返回,客户端终止。

1 个答案:

答案 0 :(得分:2)

在写入或发送文件描述符之前,您可以在文件描述符上使用poll(2)。这将检查是否可以发送数据。更一般地说,你可能(也许已经有)event loop

Dark Falcon评论时(请参阅this answer),您收到了SIGPIPE信号。请阅读signal(7)。你可以忽略那个信号(但忽略SIGPIPE)它们是赞成还是缺点。

还可以使用strace(1)了解更多信息(涉及的系统调用和信号)。

您可能还让服务器发送其pid,并让客户端使用带有0信号编号的kill(2)来测试服务器进程是否存在(因为两者都是同一台机器的本地) 。但是在我的情况下,我不会推荐这个。

或许阅读Advanced Linux Programming