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

标签 c linux sockets

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

相关文章:

sockets - 如何在 Dart 中将字符串转换为 utf8?

Java 如何使用 ObjectInputStream 进行读取

c - 数组和指针字符串声明之间的差异

c - 在C中获取 "char *namelist[]"中项目的总数

c - 传递 'draw_character' 的参数 4 使指针来自整数而不进行强制转换

c - Linux 中 printf ("\n...") 和 printf ("..\n") 之间的输出差异

linux - 为所有用户附加 LD_LIBRARY_PATH

linux - 没有 exec 的 fork,共享对象使用的 pthread_mutex_t

linux - Shell 脚本 CentOS - 通过读取它的配置文件并获取端口来终止进程

Python udp 性能