我正在尝试使用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
}
}
答案 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;
}