gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:51 26 4
gpt4 key购买 nike

我有一个 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 信号编号来测试服务器进程的存在(因为两者都是同一台机器的本地进程)。但我不建议您这样做。

也许阅读Advanced Linux Programming .

关于c - 客户端如何知道服务器是否已退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25765113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com