c++ - 在套接字编程上捕获客户端从服务器退出
问题描述
我需要对 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
提前致谢。
解决方案
尝试在损坏的套接字上发送将引发 SIGPIPE 信号。接收 SIGPIPE 时的默认行为是终止进程(这是您正在观察的行为)。
您可以通过以下方式解决此问题:
- 忽略信号(适用于任何平台)
- 设置
SO_NOSIGPIPE
套接字选项(仅限 Mac/BSD) - 传递
MSG_NOSIGNAL
要发送的标志(仅限 Linux)
如果在损坏的套接字上执行写入,则 send 应返回 -1,并将 errno 设置为 EPIPE。
有关处理 SIGPIPE 的更多详细信息,请参阅:
推荐阅读
- ruby-on-rails - resque-web 作为独立的应用程序来监控具有 rails api only 应用程序的工作人员
- textbox - 如何使用文本框/消息框(VS2017)将总数变为 2 位小数
- ios - '没有帐户'LXxxxxxxx'' Xcode 9.4 上的构建错误
- regex - 嵌套和混合前瞻和后瞻?
- python - 我如何在kivy中停止过渡到下一个屏幕
- python - 如何在 pandas 数据框中使用 ast.literal_eval 并处理异常
- ios - iOS 应用因第三方品牌而被拒绝
- swift - 使 Vapor API 响应 JSON API Spec 兼容
- amazon-ec2 - Wildfly 10 服务启动失败 - Centos7 | AWS EC2
- json - 在具有 ID 的 Python 3 中将 JSON 转换为 Dataframe