[英]How to check boost socket write_some method ends or not
我正在尝试通过使用Boost套接字发送一些数据。 TCPClient类的作用是使连接cna可以将发送数据的方法抛出sendMessage方法。
当我在代码下执行时,它不起作用。 但是,它在我调试时有效。 我认为问题在于时机。
删除[]味精; 在发送信息之前可以正常工作(只是我的想法)
因此,我想检查是否发送了味精。 或其他任何好方法。
客户端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
}
}
您的sendMessage()
函数编写不正确。 您不能指望套接字会一次发送所有数据,您需要一个循环来尝试发送,检查发送了多少字节,偏移缓冲区(当然totalLength
相应地更新totalLength
),并在必要时重复直到发送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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.