Я использую boost для создания сервера websocket. Потому что нам нужны две версии ws и wss, поэтому я пишу код, как показано ниже.
Но когда я его собрал, сказал "ошибка C2338: неизвестный тип сокета в async_teardown."
Полагаю, это из-за T1.
файл 1 iSession.h
'' '
//
// Created by p00451414 on 2019/5/14.
//
#ifndef ESDK_MSP_ISESSION_H
#define ESDK_MSP_ISESSION_H
#pragma once
#include "stdfax.h"
template<typename T>
class iSession :public std::enable_shared_from_this <iSession<T>> {
public:
/*explicit
iSession(boost::asio::ip::tcp::socket);
explicit
iSession(boost::asio::ip::tcp::socket, boost::asio::ssl::context&);*/
iSession() {
ws_ = NULL;
strand_ = NULL;
buffer_ = new boost::beast::multi_buffer();
}
~iSession() {
delete buffer_;
buffer_ = NULL;
delete strand_;
strand_ = NULL;
delete ws_;
ws_ = NULL;
}
public:
boost::beast::websocket::stream<T> *ws_=NULL;
boost::asio::strand<boost::asio::io_context::executor_type> *strand_=NULL;
boost::beast::multi_buffer *buffer_=NULL;
public:
void virtual run() = 0;
void process() {
auto sp = shared_from_this();
ws_->async_read(*buffer_, boost::asio::bind_executor(*strand_, [&, sp](boost::system::error_code ec2,
std::size_t bytes_transferred2) {
boost::ignore_unused(bytes_transferred2);
if (ec2) {
// fail(ec, "read");
}
if (ec2 == boost::beast::websocket::error::closed) {
return;
}
ws_->text(ws_->got_text());
ws_->async_write(buffer_->data(), boost::asio::bind_executor(*strand_, [&, sp](boost::system::error_code ec3,
std::size_t bytes_transferred3) {
boost::ignore_unused(bytes_transferred3);
if (ec3) {
// return fail(ec, "write");
}
// Clear the buffer
buffer_->consume(buffer_->size());
process();
}));
}));
}
};
#endif //ESDK_MSP_ISESSION_H
'' '
file2 NormalSession.h
'' '
//
// Created by p00451414 on 2019/5/14.
//
#ifndef ESDK_MSP_NORMALSESSION_H
#define ESDK_MSP_NORMALSESSION_H
#include "iSession.h"
class NormalSession : public iSession<boost::asio::ip::tcp::socket> {
public:
NormalSession(boost::asio::ip::tcp::socket);
~NormalSession();
public:
void run();
};
#endif //ESDK_MSP_NORMALSESSION_H
'' '
файл 3 SslSession.h
'' '
//
// Created by p00451414 on 2019/5/14.
//
#ifndef ESDK_MSP_SSLSESSION_H
#define ESDK_MSP_SSLSESSION_H
#include <memory>
#include <boost/asio/ip/tcp.hpp>
#include "iSession.h"
class SslSession : public iSession<boost::asio::ssl::stream<boost::asio::ip::tcp::socket&>> {
public:
SslSession(boost::asio::ip::tcp::socket, boost::asio::ssl::context &);
~SslSession(void);
public:
void on_handshake(boost::system::error_code);
//void on_accept(boost::system::error_code);
//void do_read();
//void on_read(boost::system::error_code, std::size_t);
//void on_write(boost::system::error_code, std::size_t);
void run();
private:
boost::asio::ip::tcp::socket* socket_;
};
#endif //ESDK_MSP_SSLSESSION_H
'' '
Полагаю, это из-за моей SslSession с шаблоном T1.
Потому что мой класс NormalSession мог работать, когда SslSession комментировал.
Так как исправить эту ошибку и как использовать шаблон в шаблоне?
больше сообщений
больше сообщений
'' '
F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / teardown.hpp (103): ошибка C2338: неизвестный тип сокета в async_teardown.
F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (680): примечание: oid 对 正在 编译 的 函数 模板 实例 化 «void boost :: beast :: websocket :: async_teardown :: read_some_op>: : mutable_buffers_type, boost :: beast :: websocket :: stream :: read_op> :: process ::, boost :: asio :: strand >>>> (boost :: beast :: websocket :: role_type, Socket &, TeardownHandler &&)»的 引用
с
[
NextLayer = повышение :: ASIO :: :: поток SSL,
DynamicBuffer = повышение :: зверь :: multi_buffer,
Оправа = повышение :: ASIO :: :: поток SSL,
TeardownHandler = повышение :: зверем :: WebSocket :: поток, правда> :: read_some_op> :: mutable_buffers_type, повышение :: зверю :: WebSocket :: поток, правда> :: read_op> :: процесс ::, повышение :: ASIO :: нитка >>>
]
F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (173): примечание: oid 类 模板 成员 函数 "void boost :: beast :: websocket :: stream :: read_some_op> :: mutable_buffers_type, boost :: beast :: websocket :: stream :: read_op :: process ::, boost :: asio :: strand >>> :: operator () (boost :: beast :: error_code, size_t, bool) "时
с
[
T = повышение :: ASIO :: :: поток SSL,
DynamicBuffer = повышение :: зверя :: multi_buffer
]
F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (821): примечание: «void boost :: beast :: websocket :: stream :: read_some_op>: : mutable_buffers_type, boost :: beast :: websocket :: stream :: read_op :: process ::, boost :: asio :: strand >>> :: operator () (boost :: beast :: error_code, size_t, bool) «的 引用
с
[
T = повышение :: ASIO :: :: поток SSL,
DynamicBuffer = повышение :: зверя :: multi_buffer
]
F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (821): примечание: «boost :: beast :: websocket :: stream :: read_some_op> :: mutable_buffers_type, boost :: beast :: websocket :: stream :: read_op :: process ::, boost :: asio :: strand >>> "的 引用
с
[
T = повышение :: ASIO :: :: поток SSL,
DynamicBuffer = повышение :: зверя :: multi_buffer
]
F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (802): примечание: oid 类 模板 成员 函数 "void boost :: beast :: websocket :: stream :: read_op :: process ::, boost :: asio :: strand >> :: operator () (boost :: beast :: error_code, size_t) "时
с
[
T = повышение :: ASIO :: :: поток SSL,
DynamicBuffer = повышение :: зверя :: multi_buffer
]
F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (899): примечание: «void boost :: beast :: websocket :: stream :: read_op ::» process ::, boost :: asio :: strand >> :: operator () (boost :: beast :: error_code, size_t) ”的 引用
с
[
T = повышение :: ASIO :: :: поток SSL,
DynamicBuffer = повышение :: зверя :: multi_buffer
]
F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (899): примечание: "boost :: beast :: websocket :: stream :: read_op :: process" ::, boost :: asio :: strand >> "的 引用
с
[
T = повышение :: ASIO :: :: поток SSL,
DynamicBuffer = повышение :: зверя :: multi_buffer
]
f: \ msp \ esdk_icp \ source \ esdk_msp \ msp_s \ src \ websocket \ iSession.h (69): примечание: :: process ::, boost :: asio :: strand >> (DynamicBuffer &, ReadHandler &&) ”的 引用с
[
T = повышение :: ASIO :: :: поток SSL,
DynamicBuffer = повышение :: зверь :: multi_buffer,
ReadHandler = повышение :: ASIO :: executor_binder> :: Процесс ::, повышение :: ASIO :: нитка>
]
f: \ msp \ esdk_icp \ source \ esdk_msp \ msp_s \ src \ websocket \ iSession.h (44): примечание: нет void boost :: beast :: websocket :: stream :: async_read :: process ::, boost :: asio :: strand >> (DynamicBuffer &, ReadHandler &&) ”的 引用
с
[
T = повышение :: ASIO :: :: поток SSL,
DynamicBuffer = повышение :: зверь :: multi_buffer,
ReadHandler = повышение :: ASIO :: executor_binder> :: Процесс ::, повышение :: ASIO :: нитка>
]
f: \ msp \ esdk_icp \ source \ esdk_msp \ msp_s \ src \ websocket \ iSession.h (41): примечание: oid 类 模板 成员 函数 "void iSession> :: process (void)" 时
F: \ MSP \ eSDK_ICP \ Source \ eSDK_MSP \ MSP_S \ src \ websocket \ SslSession.cpp (44): примечание: "void iSession> :: process (void)" 的 化
f: \ msp \ esdk_icp \ source \ esdk_msp \ msp_s \ src \ websocket \ SslSession.h (16): примечание: i 对 正在 编译 的 的 类 模板 i i iSession>
F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / core / string.hpp (103): примечание: "boost :: basic_string_view>" 的 引用
NMAKE: фатальная ошибка U1077: «D: \ VS2017 \ VC \ Tools \ MSVC \ 14.16.27023 \ bin \ Hostx64 \ x64 \ cl.exe»: 返回 代码 «0x2»
Стоп.
NMAKE: фатальная ошибка U1077: «D: \ VS2017 \ VC \ Tools \ MSVC \ 14.16.27023 \ bin \ Hostx64 \ x64 \ nmake.exe»: 返回 代码 «0x2»
Стоп.
NMAKE: фатальная ошибка U1077: «D: \ VS2017 \ VC \ Tools \ MSVC \ 14.16.27023 \ bin \ Hostx64 \ x64 \ nmake.exe»: 返回 代码 «0x2»
Стоп.
NMAKE: фатальная ошибка U1077: «D: \ VS2017 \ VC \ Tools \ MSVC \ 14.16.27023 \ bin \ Hostx64 \ x64 \ nmake.exe»: 返回 代码 «0x2»
Стоп.
'' '