gpt4 book ai didi

c++ - 使用 boost::asio 处理 "reset by peer"场景

转载 作者:行者123 更新时间:2023-11-28 05:37:09 34 4
gpt4 key购买 nike

我有一个等待新传入 TCP 连接的服务器方法,我为每个连接创建两个线程(分离的)来处理各种任务。

    void MyClass::startServer(boost::asio::io_service& io_service, unsigned short port) {

tcp::acceptor TCPAcceptor(io_service, tcp::endpoint(tcp::v4(), port));

bool UARTToWiFiGatewayStarted = false;

for (;;) {

auto socket(std::shared_ptr<tcp::socket>(new tcp::socket(io_service)));

/*!
* Accept a new connected WiFi client.
*/
TCPAcceptor.accept(*socket);

socket->set_option( tcp::no_delay( true ) );

MyClass::enableCommunicationSession();

// start one worker thread.
std::thread(WiFiToUARTWorkerSession, socket, this->LINport, this->LINbaud).detach();

// only if this is the first connected client:
if(false == UARTToWiFiGatewayStarted) {

std::thread(UARTToWifiWorkerSession, socket, this->UARTport, this->UARTbaud).detach();

UARTToWiFiGatewayStarted = true;
}
}
}

这对于开始通信来说工作正常,但是当客户端断开连接并再次连接(或至少尝试再次连接)时会出现问题。

当当前客户端断开连接时,我停止通信(通过停止两个函数的内部无限循环,然后它们将返回)。

    void Gateway::WiFiToUARTWorkerSession(std::shared_ptr<tcp::socket> socket, ...) {

/*!
* various code here...
*/

try {
while(true == MyClass::communicationSessionStatus) {

/*!
* Buffer used for storing the UART-incoming data.
*/
unsigned char WiFiDataBuffer[max_incoming_wifi_data_length];

boost::system::error_code error;

/*!
* Read the WiFi-available data.
*/
size_t length = socket->read_some(boost::asio::buffer(WiFiDataBuffer), error);

/*!
* Handle possible read errors.
*/
if (error == boost::asio::error::eof) {
break; // Connection closed cleanly by peer.
}
else if (error) {
// this will cause the infinite loops from the both worker functions to stop, and when they stop the functions will return.
MyClass::disableCommunicationSession();
sleep(1);
throw boost::system::system_error(error); // Some other error.
}

uart->write(WiFiDataBuffer, length);
}
}
catch (std::exception &exception) {
std::cerr << "[APP::exception] Exception in thread: " << exception.what() << std::endl;
}
}

我希望当我重新连接时通信应该再次工作(MyClass::startServer(...) 将再次创建和分离 两个工作线程同样的事情。

问题是,当我第二次连接时,我得到:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
what(): write: Broken pipe

根据我发现的有关此错误的信息,服务器(此应用程序)似乎通过 TCP 向断开连接的客户端发送了一些内容。

我做错了什么?

我该如何解决这个问题?

最佳答案

  1. 长度为 0 的读取没有错误也是 eof 的指示。 boost::asio::error::eof 错误代码通常在您检查组合操作的结果时更有用。

  2. 当错过此错误条件时,所提供的代码将在现已关闭的套接字上调用 write。您使用了不引用 error_code 的 write 形式。如果有错误,此表单将抛出。会有错误。读取失败。

关于c++ - 使用 boost::asio 处理 "reset by peer"场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37986439/

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