自定义套接字继承自boost::asio::ip::tcp::Socket
Custom Socket Inheriting from boost::asio::ip::tcp::socket
我对C++继承还很陌生,而且我正在使用boost套接字。我想为同步boost套接字创建一些类似于Java的DataOutputStream的东西。也就是说,我想要SendInt、ReadLong等方法。我试着创建一个从套接字继承的类,但总是出错。现在,我有这样的东西:
DataSocketStream.h
#include "boost/asio.hpp"
#include <vector>
namespace Server {
using namespace std;
namespace as = boost::asio;
namespace ip = boost::asio::ip;
class DataSocketStream : public ip::tcp::socket{
public:
DataSocketStream(as::io_service);
virtual ~DataSocketStream();
void WriteInt(int);
void WriteLong(long);
int ReadInt(boost::system::error_code);
long ReadLong(boost::system::error_code);
void Flush (boost::system::error_code);
string ReadString(boost::system::error_code);
double ReadDouble(boost::system::error_code);
void WriteDouble(double);
private:
ip::tcp::socket* socketFormPtr
std::vector<char> Message;
};
DataSocketStream.cpp
#include "DataSocketStream.h"
namespace Server {
namespace as = boost::asio;
namespace ip = boost::asio::ip;
using namespace std;
DataSocketStream::DataSocketStream(as::io_service ios)
: ip::tcp::socket(ios)
{
socketFormPtr = this;
}
DataSocketStream::~DataSocketStream()
{
}
void DataSocketStream::WriteInt(int toWrite){
//Implementation that pushes the bytes onto the vector Message
}
void DataSocketStream::WriteLong(long toWrite){
//...
}
void DataSocketStream::Flush(boost::system::error_code e)
{
as::write(*socketFormPtr, as::buffer(Message), as::transfer_all(),e);
delete (&Message);
std::vector<char> Message;
}
int DataSocketStream::ReadInt(boost::system::error_code e)
{
char Af[4];
as::read(*socketFormPtr, as::buffer(Af), e);
return ((Af[0]<<24)| (Af[1]<<16) | (Af[2]<<8) | (Af[3]));
}
long DataSocketStream::ReadLong(boost::system::error_code e)
{
//...
}
string DataSocketStream::ReadString(boost::system::error_code e)
{
//...
}
double DataSocketStream::ReadDouble(boost::system::error_code e)
{
//...
}
void DataSocketStream::WriteDouble(double val)
{
//...
}
}
然而,当我尝试as::io_service io_service;DataSocketStream CLsocket(io_service);
编译器给了我一个错误,错误:"boost::noncopyable_::noncopiable::noncompyable(const boost::noncopyaable_::uncopyable&)"是私有的我认为这与我的班级没有成为boost库的一部分有关。
我尝试从其他boost::asio::basic_stream_socket继承,但在继承时也出现了错误。(这是一个非常奇怪的"无效使用"::"错误)我还尝试创建一个普通的boost::asio::ip::tcp::socket,然后将指针强制转换为DataSocketStream的指针,但这也不起作用。
我知道我可以用辅助方法的形式来完成这一切,比如:
int ReadInt(boost::asio::ip::tcp::socket* S, boost::system::error_code e)
{
char Af[4];
as::read(*S, as::buffer(Af), e);
return ((Af[0]<<24)| (Af[1]<<16) | (Af[2]<<8) | (Af[3]));
}
但继承方式似乎是更好的设计。是我遗漏了什么,还是boost库真的没有按照我尝试的方式进行扩展?谢谢
DataSocketStream(as::io_service);
如错误所示,io_service是不可复制的,通过引用传递它
DataSocketStream(as::io_service&);
^
相关文章:
- 为什么 boost::asio::ip::tcp::basic_stream_socket::available 的运行
- "acceptor"在从TCP迁移到UDP时不是"boost::asio::ip::udp
- 如何将boost::asio::ip::address_v6 ip转换为2个uint64_t数字,并从2个uint 64
- 使用 boost::asio::ip::tcp::iostream 的低带宽性能
- boost::asio::ip::tcp::iostream,先启动客户端,然后等待服务器
- Boost asio ip tcp iostream 是否支持异步?
- 在无效地址上,boost::asio::ip:::address::from_string 没有引发异常
- 如何避免与"asio::ip::tcp::iostream"的数据竞争?
- boost::asio::ip::tcp::resolver::iterator 检查值是否为空
- 从 asio::ip::tcp::socket 直接写入 std::string
- 线程安全关闭同步使用的 boost::asio::ip::tcp::socket
- 移动构造函数不使用 boost::asio::ip::tcp::socket 调用
- 在 ipv6 链接范围单播 udp 客户端-服务器中应用 boost::asio::ip::udp,有时有效,但有时无效
- 正在创建boost::asio::ip::address_v4
- 自定义套接字继承自boost::asio::ip::tcp::Socket
- 从 streambuf 使用 boost::asio::ip::tcp 将数据部分写入 TCP 套接字
- 初始化 asio::ip::address_v6() 的最快方法
- 将 boost::asio::ip::地址运算符 == 导出到 python
- 将:asio::ip::address_v4转换为字符串
- boost::asio::ip::multicast::join_group does not work