gpt4 book ai didi

c++ - boost asio async_write 不会在断开连接的客户端上生成损坏的管道或其他错误

转载 作者:行者123 更新时间:2023-11-30 05:35:53 25 4
gpt4 key购买 nike

情况如下 - 服务器正在向客户端发送数据,但是一些客户端已断开连接(不正常)。

然而,写入处理程序总是在没有任何关于管道损坏的错误的情况下完成。这是 TCP/IP 连接,所以我假设如果发送方(服务器)不再从客户端接收到 ACK 数据包,一段时间后应该会出现一些错误。

我该如何处理这个错误?

    auto writeHandler = boost::bind(&ChatConnection::OnWrite, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred);
boost::asio::async_write(socket_, write_queue_.front()->Buffer(), writeHandler);

writeHandler 总是被成功调用。

最佳答案

我已经创建了我能想到的最简单的服务器(它只接受端口 6767 上的单个 TCP 连接并将 4k block /dev/urandom 转储到其中直到失败):

#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
#include <iostream>
#include <fstream>

int main() {
using namespace boost::asio; // being really lazy here
using ip::tcp;
boost::system::error_code ec;

io_service svc;
tcp::acceptor acc {svc, tcp::v4()};
acc.bind({tcp::v4(), 6767});
acc.listen(1);

tcp::socket s{svc};
if (!acc.accept(s, ec)) {
spawn(svc, [&](yield_context yc) {

std::ifstream ifs("/dev/urandom", std::ios::binary);
char buf[4<<10];

while (ifs.read(buf, sizeof(buf))) {
boost::asio::async_write(s, buffer(buf), yc[ec]);
std::cout << ec.message() << "\n";
if (ec) break;
}
});
}

svc.run(); // :) sometimes helps...
std::cout << "Bye\n";
}

使用例如构建和运行

g++ -std=c++11 -O2 -Wall -pedantic -pthread main.cpp -lboost_{system,thread,context,coroutine} -o test
./test |& uniq -c&
nc 127.0.0.1 6767 > /dev/null <<< "test client"

这表明:

$ ./test |& uniq -c&
[1] 15362
$ nc localhost 6767 > /dev/null <<<"test"
^C
$ 7101 Success
1 Broken pipe
1 Bye

[1]+ Done ./test 2>&1 | uniq -c

也许您应该向我们展示您的简化样本 (http://sscce.org),或者您可以看到您与我的示例有何不同。

关于c++ - boost asio async_write 不会在断开连接的客户端上生成损坏的管道或其他错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33719879/

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