在套接字编程上捕获客户端从服务器退出

Posted

技术标签:

【中文标题】在套接字编程上捕获客户端从服务器退出【英文标题】:catching client exit from server on socket programing 【发布时间】:2020-05-08 21:06:36 【问题描述】:

我需要对 c++(或 c)中的套接字错误处理有所了解。 我正在测试一个简单的客户端和服务器程序,如下所示:

 .....
 while (1)  // server keeps sending strings to client
     sprintf(jsonStr, " \"%d: Hello\": \"world!\"  \n", index++);
     size = send(newsockfd, jsonStr, strlen(jsonStr), 0);
     if (size == -1) 
       error("ERROR on send");
     
     sleep(1);
 
 .....

当客户端从服务器接收字符串时,如果我杀死客户端,服务器也会退出而没有任何消息。 这是预期的吗?我怎样才能抓住它而不是退出?我尝试了“尝试”和“捕捉”,但无法捕捉。 使用 java,我使用 DataOutputStream.writeUTF() 得到“Broken pipe”SocketException。 我在 Mac 和 Linux 上测试过,结果是一样的。

我使用的示例代码来自:https://www.bogotobogo.com/cplusplus/sockets_server_client.php

提前致谢。

【问题讨论】:

【参考方案1】:

尝试在损坏的套接字上发送将引发 SIGPIPE 信号。接收 SIGPIPE 时的默认行为是终止进程(这是您正在观察的行为)。

您可以通过以下方式解决此问题:

忽略信号(适用于任何平台) 设置 SO_NOSIGPIPE 套接字选项(仅限 Mac/BSD) 传递 MSG_NOSIGNAL 标志以发送(仅限 Linux)

如果在损坏的套接字上执行写入,则 send 应返回 -1,并将 errno 设置为 EPIPE。

有关处理 SIGPIPE 的更多详细信息,请参阅:

How to prevent SIGPIPEs (or handle them properly) Program received signal SIGPIPE, Broken pipe

【讨论】:

以上是关于在套接字编程上捕获客户端从服务器退出的主要内容,如果未能解决你的问题,请参考以下文章

将数据从服务器发送到客户端套接字编程

python 客户端和服务器套接字编程在单个脚本中

网络编程

使用python套接字编程将图像文件从服务器传输到客户端

socket 客户端编程:非阻塞式连接,错误判断及退出重连

Python网络编程利用Python进行TCPUDP套接字编程