c++ - 继承自 boost::asio::ip::tcp::socket 的自定义套接字

标签 c++ oop sockets boost-asio

我对 C++ 继承相当陌生,而且我正在使用升压套接字。我想为同步升压套接字创建类似于 Java 的 DataOutputStream 的东西。也就是说,我想要 SendInt、ReadLong 等方法。 我尝试制作一个从套接字继承的类,但我不断收到错误。现在,我有这样的事情:

数据套接字流

#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;
};

数据套接字流.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)
{
    //...
}
} 

但是,当我尝试类似 作为::io_service io_service; DataSocketStream CLsocket(io_service);

编译器给我一个错误,error: 'boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable&)' is private 我认为这与我的类(class)不是 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&);
                               ^

关于c++ - 继承自 boost::asio::ip::tcp::socket 的自定义套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11444313/

相关文章:

c++ - 变量的静态初始化失败

c++ - Qt5、透明窗口和滚轮事件

c++ - cmake 如何知道包含文件和库在哪里?

javascript - ExtJS (JavaScript) 模块设计模式最佳实践

c - 多线程服务器客户端代码

sockets - ip分段有多糟糕

c++ - 读/写 vtk 文件显示不正确

php - OO : Inheritance vs Service

PHP - 将变量从一个对象传递到另一个麻烦

php - 通过套接字从 PHP 向 Python 发送消息