簡體   English   中英

從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)
{
    //...
}
} 

但是,當我嘗試像這樣的事情時:: io_service io_service; DataSocketStream CLsocket(io_service);

編譯器給我一個錯誤,錯誤:'boost :: noncopyable _ :: noncopyable :: noncopyable(const boost :: noncopyable _ :: noncopyable&)'是私有的,我認為這與我的類無關,不是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&);
                               ^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM