如何检查Boost套接字的write_some方法是否结束

时间:2018-07-19 11:40:47

标签: c++ multithreading sockets boost-asio

我正在尝试使用Boost套接字发送一些数据。 TCPClient类的作用是使连接cna可以发送数据并抛出sendMessage方法。

当我在代码下执行时,它不起作用。但是,它在我调试时有效。 我认为问题出在时间上。

delete [] msg;在发送msg之前可以正常工作(只是我的想法)

所以,我想检查是否发送了味精。 或其他任何好方法。

客户端main()代码

TCPClient *client = new TCPClient(ip, port);
client->sendMessage((char *)msg, 64 + headerLength + bodyLength);
delete[] msg;

在代码下是snedMessage方法。

void TCPClient::sendMessage(const char *message, int totalLength) throw(boost::system::system_error) {

if(false == isConnected())
    setConnection();

boost::system::error_code error;
this->socket.get()->write_some(boost::asio::buffer(message, totalLength), error);

if(error){
        //do something
}

}

1 个答案:

答案 0 :(得分:0)

您的sendMessage()函数编写不正确。您不能指望套接字会一次发送所有数据,您需要一个循环来尝试发送,检查发送了多少字节,偏移缓冲区(当然还要相应地更新totalLength),并在必要时重复直到所有数据都已发送。如果有错误情况,请中断。您尝试仅发送一次,忽略结果,并假设如果没有错误,则发送所有数据。不是这种情况。流套接字可能一次发送一个或两个或任意数量的字节,而您的代码需要处理该字节。

您的代码应如下所示:

while( totalLength ) {
    boost::system::error_code error;
    auto sz = this->socket.get()->write_some(boost::asio::buffer(message, totalLength), error);

    if(error){
        //do something and interrupt the loop
    }
    totalLength -= sz;
    message += sz;
}