gpt4 book ai didi

c++ - 在套接字编程中从服务器捕获客户端导出

转载 作者:行者123 更新时间:2023-12-02 10:32:42 25 4
gpt4 key购买 nike

我需要一些有关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()获得了“破损管道” 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的更多详细信息,请参阅:
  • How to prevent SIGPIPEs (or handle them properly)
  • Program received signal SIGPIPE, Broken pipe
  • 关于c++ - 在套接字编程中从服务器捕获客户端导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61688091/

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