KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
Sometimes boost::asio seems to disconnect before I want it to, i.e. before the server properly handles the disconnect. I'm not sure how this is possible because the client seems to think its fully sent the message, yet when the server emits the error its not even read the message header... During testing this only happens maybe 1 in 5 times, the server receives the client shut down message, and disconnects the client cleanly. The error: "An existing connection was forcibly closed by the remote host" The client disconnecting: void disconnect() { boost::system::error_code error; //just creates a simple buffer with a shutdown header boost::uint8_t *packet = createPacket(PC_SHUTDOWN,0); //sends it if(!sendBlocking(socket,packet,&error)) { //didnt get here in my tests, so its not that the write failed... logWrite(LOG_ERROR,"server", std::string("Error sending shutdown message.\n") + boost::system::system_error(error).what()); } //actaully disconnect socket.close(); ioService.stop(); } bool sendBlocking(boost::asio::ip::tcp::socket &socket, boost::uint8_t *data, boost::system::error_code* error) { //get the length section from the message boost::uint16_t len = *(boost::uint16_t*)(data - 3); //send it asio::write(socket, asio::buffer(data-3,len+3), asio::transfer_all(), *error); deletePacket(data); return !(*error); } The server: void Client::clientShutdown() { //not getting here in problem cases disconnect(); } void Client::packetHandler(boost::uint8_t type, boost::uint8_t *data, boost::uint16_t len, const boost::system::error_code& error) { if(error) { //error handled here delete[] data; std::stringstream ss; ss << "Error recieving packet.\n"; ss << logInfo() << "\n"; ss << "Error: " &l
Tags (comma-separated)
Save Edits
Cancel