mirror of
https://github.com/Relintai/rcpp_framework.git
synced 2025-02-20 15:14:26 +01:00
Updated brynet to 1.0.9.
This commit is contained in:
parent
4b64bf5864
commit
bf688577fb
@ -29,11 +29,11 @@ void HTTPServer::wsEnterCallbackDefault(const HttpSession::Ptr &httpSession, Web
|
|||||||
std::cout << "frame enter of type:" << int(opcode) << std::endl;
|
std::cout << "frame enter of type:" << int(opcode) << std::endl;
|
||||||
std::cout << "payload is:" << payload << std::endl;
|
std::cout << "payload is:" << payload << std::endl;
|
||||||
// echo frame
|
// echo frame
|
||||||
auto frame = std::make_shared<std::string>();
|
//auto frame = std::make_shared<std::string>();
|
||||||
|
|
||||||
WebSocketFormat::wsFrameBuild(payload.c_str(), payload.size(), *frame, WebSocketFormat::WebSocketFrameType::TEXT_FRAME, true, false);
|
//WebSocketFormat::wsFrameBuild(payload.c_str(), payload.size(), *frame, WebSocketFormat::WebSocketFrameType::TEXT_FRAME, true, false);
|
||||||
|
|
||||||
httpSession->send(frame);
|
//httpSession->send(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTTPServer::configure() {
|
void HTTPServer::configure() {
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define BRYNET_VERSION 1008000
|
#define BRYNET_VERSION 1009000
|
||||||
|
@ -11,6 +11,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (__cplusplus >= 201703L || \
|
#if (__cplusplus >= 201703L || \
|
||||||
(defined(_MSC_VER) && _MSC_VER >= 1910))
|
(defined(_MSVC_LANG) && _MSVC_LANG >= 201703L))
|
||||||
#define BRYNET_HAVE_LANG_CXX17 1
|
#define BRYNET_HAVE_LANG_CXX17 1
|
||||||
#endif
|
#endif
|
@ -16,7 +16,7 @@ namespace brynet { namespace base {
|
|||||||
public:
|
public:
|
||||||
BasePacketWriter(char* buffer,
|
BasePacketWriter(char* buffer,
|
||||||
size_t len,
|
size_t len,
|
||||||
bool useBigEndian = true,
|
bool useBigEndian = false,
|
||||||
bool isAutoMalloc = false)
|
bool isAutoMalloc = false)
|
||||||
:
|
:
|
||||||
mIsAutoMalloc(isAutoMalloc),
|
mIsAutoMalloc(isAutoMalloc),
|
||||||
@ -248,49 +248,85 @@ namespace brynet { namespace base {
|
|||||||
public:
|
public:
|
||||||
BasePacketReader(const char* buffer,
|
BasePacketReader(const char* buffer,
|
||||||
size_t len,
|
size_t len,
|
||||||
bool useBigEndian = true) :
|
bool useBigEndian = false) :
|
||||||
mBigEndian(useBigEndian),
|
mBigEndian(useBigEndian),
|
||||||
mMaxLen(len)
|
mSize(len)
|
||||||
{
|
{
|
||||||
mPos = 0;
|
mPos = 0;
|
||||||
|
mSavedPos = 0;
|
||||||
mBuffer = buffer;
|
mBuffer = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~BasePacketReader() = default;
|
virtual ~BasePacketReader() = default;
|
||||||
|
|
||||||
|
void useBigEndian()
|
||||||
|
{
|
||||||
|
mBigEndian = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void useLittleEndian()
|
||||||
|
{
|
||||||
|
mBigEndian = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void savePos()
|
||||||
|
{
|
||||||
|
mSavedPos = mPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t savedPos() const
|
||||||
|
{
|
||||||
|
return mSavedPos;
|
||||||
|
}
|
||||||
|
|
||||||
size_t getLeft() const
|
size_t getLeft() const
|
||||||
{
|
{
|
||||||
if (mPos > mMaxLen)
|
if (mPos > mSize)
|
||||||
{
|
{
|
||||||
throw std::out_of_range("current pos is greater than max len");
|
throw std::out_of_range("current pos is greater than max len");
|
||||||
}
|
}
|
||||||
return mMaxLen - mPos;
|
return mSize - mPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* getBuffer() const
|
bool enough(size_t len) const
|
||||||
|
{
|
||||||
|
if (mPos > mSize)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return (mSize - mPos) >= len;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* begin() const
|
||||||
{
|
{
|
||||||
return mBuffer;
|
return mBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void skipAll()
|
const char* currentBuffer() const
|
||||||
{
|
{
|
||||||
mPos = mMaxLen;
|
return mBuffer+mPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t getPos() const
|
void consumeAll()
|
||||||
|
{
|
||||||
|
mPos = mSize;
|
||||||
|
savePos();
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t currentPos() const
|
||||||
{
|
{
|
||||||
return mPos;
|
return mPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t getMaxPos() const
|
size_t size() const
|
||||||
{
|
{
|
||||||
return mMaxLen;
|
return mSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
void addPos(size_t diff)
|
void addPos(size_t diff)
|
||||||
{
|
{
|
||||||
const auto tmpPos = mPos + diff;
|
const auto tmpPos = mPos + diff;
|
||||||
if (tmpPos > mMaxLen)
|
if (tmpPos > mSize)
|
||||||
{
|
{
|
||||||
throw std::out_of_range("diff is to big");
|
throw std::out_of_range("diff is to big");
|
||||||
}
|
}
|
||||||
@ -360,11 +396,11 @@ namespace brynet { namespace base {
|
|||||||
void read(T& value)
|
void read(T& value)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<T, typename std::remove_pointer<T>::type>::value,
|
static_assert(std::is_same<T, typename std::remove_pointer<T>::type>::value,
|
||||||
"T must a nomal type");
|
"T must a normal type");
|
||||||
static_assert(std::is_pod<T>::value,
|
static_assert(std::is_pod<T>::value,
|
||||||
"T must a pod type");
|
"T must a pod type");
|
||||||
|
|
||||||
if ((mPos + sizeof(value)) > mMaxLen)
|
if ((mPos + sizeof(value)) > mSize)
|
||||||
{
|
{
|
||||||
throw std::out_of_range("T size is to big");
|
throw std::out_of_range("T size is to big");
|
||||||
}
|
}
|
||||||
@ -374,17 +410,18 @@ namespace brynet { namespace base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const bool mBigEndian;
|
bool mBigEndian;
|
||||||
const size_t mMaxLen;
|
const size_t mSize;
|
||||||
const char* mBuffer;
|
const char* mBuffer;
|
||||||
size_t mPos;
|
size_t mPos;
|
||||||
|
size_t mSavedPos;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<size_t SIZE>
|
template<size_t SIZE>
|
||||||
class AutoMallocPacket : public BasePacketWriter
|
class AutoMallocPacket : public BasePacketWriter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit AutoMallocPacket(bool useBigEndian = true,
|
explicit AutoMallocPacket(bool useBigEndian = false,
|
||||||
bool isAutoMalloc = false)
|
bool isAutoMalloc = false)
|
||||||
:
|
:
|
||||||
BasePacketWriter(mData, SIZE, useBigEndian, isAutoMalloc)
|
BasePacketWriter(mData, SIZE, useBigEndian, isAutoMalloc)
|
||||||
|
@ -144,9 +144,10 @@ namespace brynet { namespace net {
|
|||||||
std::shared_ptr<PromiseReceive> setupPromiseReceive(const TcpConnection::Ptr& session)
|
std::shared_ptr<PromiseReceive> setupPromiseReceive(const TcpConnection::Ptr& session)
|
||||||
{
|
{
|
||||||
auto promiseReceive = std::make_shared<PromiseReceive>();
|
auto promiseReceive = std::make_shared<PromiseReceive>();
|
||||||
session->setDataCallback([promiseReceive](const char* buffer,
|
session->setDataCallback([promiseReceive](brynet::base::BasePacketReader& reader) {
|
||||||
size_t len) {
|
auto procLen = promiseReceive->process(reader.begin(), reader.size());
|
||||||
return promiseReceive->process(buffer, len);
|
reader.addPos(procLen);
|
||||||
|
reader.savePos();
|
||||||
});
|
});
|
||||||
|
|
||||||
return promiseReceive;
|
return promiseReceive;
|
||||||
|
@ -7,12 +7,14 @@
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
#include <brynet/base/Buffer.hpp>
|
#include <brynet/base/Buffer.hpp>
|
||||||
#include <brynet/base/Timer.hpp>
|
#include <brynet/base/Timer.hpp>
|
||||||
#include <brynet/base/NonCopyable.hpp>
|
#include <brynet/base/NonCopyable.hpp>
|
||||||
#include <brynet/base/Any.hpp>
|
#include <brynet/base/Any.hpp>
|
||||||
#include <brynet/base/Noexcept.hpp>
|
#include <brynet/base/Noexcept.hpp>
|
||||||
|
#include <brynet/base/Packet.hpp>
|
||||||
#include <brynet/net/SocketLibFunction.hpp>
|
#include <brynet/net/SocketLibFunction.hpp>
|
||||||
#include <brynet/net/Channel.hpp>
|
#include <brynet/net/Channel.hpp>
|
||||||
#include <brynet/net/EventLoop.hpp>
|
#include <brynet/net/EventLoop.hpp>
|
||||||
@ -34,6 +36,53 @@ extern "C" {
|
|||||||
|
|
||||||
namespace brynet { namespace net {
|
namespace brynet { namespace net {
|
||||||
|
|
||||||
|
class SendableMsg
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using Ptr = std::shared_ptr<SendableMsg>;
|
||||||
|
|
||||||
|
virtual ~SendableMsg() = default;
|
||||||
|
|
||||||
|
virtual const void * data() = 0;
|
||||||
|
virtual size_t size() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class StringSendMsg : public SendableMsg
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit StringSendMsg(const char* buffer, size_t len)
|
||||||
|
:
|
||||||
|
mMsg(buffer, len)
|
||||||
|
{}
|
||||||
|
|
||||||
|
explicit StringSendMsg(std::string buffer)
|
||||||
|
:
|
||||||
|
mMsg(std::move(buffer))
|
||||||
|
{}
|
||||||
|
|
||||||
|
const void* data() override
|
||||||
|
{
|
||||||
|
return static_cast<const void*>(mMsg.data());
|
||||||
|
}
|
||||||
|
size_t size() override
|
||||||
|
{
|
||||||
|
return mMsg.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string mMsg;
|
||||||
|
};
|
||||||
|
|
||||||
|
static SendableMsg::Ptr MakeStringMsg(const char* buffer, size_t len)
|
||||||
|
{
|
||||||
|
return std::make_shared<StringSendMsg>(buffer, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
static SendableMsg::Ptr MakeStringMsg(std::string buffer)
|
||||||
|
{
|
||||||
|
return std::make_shared<StringSendMsg>(std::move(buffer));
|
||||||
|
}
|
||||||
|
|
||||||
class TcpConnection : public Channel,
|
class TcpConnection : public Channel,
|
||||||
public brynet::base::NonCopyable,
|
public brynet::base::NonCopyable,
|
||||||
public std::enable_shared_from_this<TcpConnection>
|
public std::enable_shared_from_this<TcpConnection>
|
||||||
@ -42,11 +91,10 @@ namespace brynet { namespace net {
|
|||||||
using Ptr = std::shared_ptr<TcpConnection>;
|
using Ptr = std::shared_ptr<TcpConnection>;
|
||||||
|
|
||||||
using EnterCallback = std::function<void(Ptr)>;
|
using EnterCallback = std::function<void(Ptr)>;
|
||||||
using DataCallback = std::function<size_t(const char* buffer, size_t len)>;
|
using DataCallback = std::function<void(brynet::base::BasePacketReader&)>;
|
||||||
using DisconnectedCallback = std::function<void(Ptr)>;
|
using DisconnectedCallback = std::function<void(Ptr)>;
|
||||||
using PacketSendedCallback = std::function<void(void)>;
|
using PacketSendedCallback = std::function<void(void)>;
|
||||||
|
using HighWaterCallback = std::function<void(void)>;
|
||||||
using PacketPtr = std::shared_ptr<std::string>;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Ptr static Create(TcpSocket::Ptr socket,
|
Ptr static Create(TcpSocket::Ptr socket,
|
||||||
@ -104,9 +152,9 @@ namespace brynet { namespace net {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
eventLoop->runAsyncFunctor([session]()
|
eventLoop->runAsyncFunctor([session]()
|
||||||
{
|
{
|
||||||
session->onEnterEventLoop();
|
session->onEnterEventLoop();
|
||||||
});
|
});
|
||||||
return session;
|
return session;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,56 +164,79 @@ namespace brynet { namespace net {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//TODO::如果所属EventLoop已经没有工作,则可能导致内存无限大,因为所投递的请求都没有得到处理
|
//TODO::如果所属EventLoop已经没有工作,则可能导致内存无限大,因为所投递的请求都没有得到处理
|
||||||
|
void send(
|
||||||
|
const SendableMsg::Ptr& msg,
|
||||||
|
PacketSendedCallback&& callback = nullptr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
auto sharedThis = shared_from_this();
|
||||||
|
mEventLoop->runAsyncFunctor([sharedThis, msg, callback]() mutable
|
||||||
|
{
|
||||||
|
if(sharedThis->mAlreadyClose)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto len = msg->size();
|
||||||
|
sharedThis->mSendingMsgSize += len;
|
||||||
|
sharedThis->mSendList.emplace_back(PendingPacket{
|
||||||
|
std::move(msg),
|
||||||
|
len,
|
||||||
|
std::move(callback) });
|
||||||
|
sharedThis->runAfterFlush();
|
||||||
|
|
||||||
|
if(sharedThis->mSendingMsgSize > sharedThis->mHighWaterSize &&
|
||||||
|
sharedThis->mHighWaterCallback != nullptr)
|
||||||
|
{
|
||||||
|
sharedThis->mHighWaterCallback();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void send(
|
void send(
|
||||||
const char* buffer,
|
const char* buffer,
|
||||||
size_t len,
|
size_t len,
|
||||||
PacketSendedCallback&& callback = nullptr)
|
PacketSendedCallback&& callback = nullptr)
|
||||||
{
|
{
|
||||||
send(makePacket(buffer, len), std::move(callback));
|
send(MakeStringMsg(buffer, len), std::move(callback));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename PacketType>
|
|
||||||
void send(
|
void send(
|
||||||
PacketType&& packet,
|
std::string buffer,
|
||||||
PacketSendedCallback&&
|
PacketSendedCallback&& callback = nullptr)
|
||||||
callback = nullptr)
|
|
||||||
{
|
{
|
||||||
auto packetCapture = std::forward<PacketType>(packet);
|
send(MakeStringMsg(std::move(buffer)), std::move(callback));
|
||||||
auto callbackCapture = std::move(callback);
|
|
||||||
auto sharedThis = shared_from_this();
|
|
||||||
mEventLoop->runAsyncFunctor(
|
|
||||||
[sharedThis, packetCapture, callbackCapture]() mutable {
|
|
||||||
const auto len = packetCapture->size();
|
|
||||||
sharedThis->mSendList.emplace_back(PendingPacket{
|
|
||||||
std::move(packetCapture),
|
|
||||||
len,
|
|
||||||
std::move(callbackCapture) });
|
|
||||||
sharedThis->runAfterFlush();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setDataCallback(DataCallback&& cb)
|
// setDataCallback(std::function<void(brynet::base::BasePacketReader&)>)
|
||||||
|
template<typename Callback>
|
||||||
|
void setDataCallback(Callback&& cb)
|
||||||
{
|
{
|
||||||
|
verifyArgType(cb, &Callback::operator());
|
||||||
|
|
||||||
auto sharedThis = shared_from_this();
|
auto sharedThis = shared_from_this();
|
||||||
mEventLoop->runAsyncFunctor([sharedThis, cb]() mutable {
|
mEventLoop->runAsyncFunctor([sharedThis, cb]() mutable
|
||||||
sharedThis->mDataCallback = std::move(cb);
|
{
|
||||||
|
sharedThis->mDataCallback = cb;
|
||||||
sharedThis->processRecvMessage();
|
sharedThis->processRecvMessage();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void setDisConnectCallback(DisconnectedCallback&& cb)
|
void setDisConnectCallback(DisconnectedCallback&& cb)
|
||||||
{
|
{
|
||||||
auto sharedThis = shared_from_this();
|
auto sharedThis = shared_from_this();
|
||||||
mEventLoop->runAsyncFunctor([sharedThis, cb]() mutable {
|
mEventLoop->runAsyncFunctor([sharedThis, cb]() mutable
|
||||||
|
{
|
||||||
sharedThis->mDisConnectCallback = std::move(cb);
|
sharedThis->mDisConnectCallback = std::move(cb);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if checkTime is zero, will cancel check heartbeat */
|
/* if checkTime is zero, will cancel check heartbeat */
|
||||||
void setHeartBeat(std::chrono::nanoseconds checkTime)
|
void setHeartBeat(std::chrono::nanoseconds checkTime)
|
||||||
{
|
{
|
||||||
auto sharedThis = shared_from_this();
|
auto sharedThis = shared_from_this();
|
||||||
mEventLoop->runAsyncFunctor([sharedThis, checkTime]() {
|
mEventLoop->runAsyncFunctor([sharedThis, checkTime]()
|
||||||
|
{
|
||||||
if (sharedThis->mTimer.lock() != nullptr)
|
if (sharedThis->mTimer.lock() != nullptr)
|
||||||
{
|
{
|
||||||
sharedThis->mTimer.lock()->cancel();
|
sharedThis->mTimer.lock()->cancel();
|
||||||
@ -174,25 +245,50 @@ namespace brynet { namespace net {
|
|||||||
|
|
||||||
sharedThis->mCheckTime = checkTime;
|
sharedThis->mCheckTime = checkTime;
|
||||||
sharedThis->startPingCheckTimer();
|
sharedThis->startPingCheckTimer();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void setHighWaterCallback(HighWaterCallback cb, size_t size)
|
||||||
|
{
|
||||||
|
auto sharedThis = shared_from_this();
|
||||||
|
mEventLoop->runAsyncFunctor([=]() mutable
|
||||||
|
{
|
||||||
|
sharedThis->mHighWaterCallback = std::move(cb);
|
||||||
|
sharedThis->mHighWaterSize = size;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void postShrinkReceiveBuffer()
|
||||||
|
{
|
||||||
|
auto sharedThis = shared_from_this();
|
||||||
|
mEventLoop->runAsyncFunctor([=]()
|
||||||
|
{
|
||||||
|
mEventLoop->runFunctorAfterLoop([=]()
|
||||||
|
{
|
||||||
|
sharedThis->shrinkReceiveBuffer();
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void postDisConnect()
|
void postDisConnect()
|
||||||
{
|
{
|
||||||
auto sharedThis = shared_from_this();
|
auto sharedThis = shared_from_this();
|
||||||
mEventLoop->runAsyncFunctor([sharedThis]() {
|
mEventLoop->runAsyncFunctor([sharedThis]()
|
||||||
|
{
|
||||||
sharedThis->procCloseInLoop();
|
sharedThis->procCloseInLoop();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void postShutdown()
|
void postShutdown()
|
||||||
{
|
{
|
||||||
auto sharedThis = shared_from_this();
|
auto sharedThis = shared_from_this();
|
||||||
mEventLoop->runAsyncFunctor([sharedThis]() {
|
mEventLoop->runAsyncFunctor([sharedThis]()
|
||||||
sharedThis->mEventLoop->runFunctorAfterLoop([sharedThis]() {
|
{
|
||||||
|
sharedThis->mEventLoop->runFunctorAfterLoop([sharedThis]()
|
||||||
|
{
|
||||||
sharedThis->procShutdownInLoop();
|
sharedThis->procShutdownInLoop();
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& getIP() const
|
const std::string& getIP() const
|
||||||
@ -200,11 +296,6 @@ namespace brynet { namespace net {
|
|||||||
return mIP;
|
return mIP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static TcpConnection::PacketPtr makePacket(const char* buffer, size_t len)
|
|
||||||
{
|
|
||||||
return std::make_shared<std::string>(buffer, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TcpConnection(TcpSocket::Ptr socket,
|
TcpConnection(TcpSocket::Ptr socket,
|
||||||
size_t maxRecvBufferSize,
|
size_t maxRecvBufferSize,
|
||||||
@ -221,7 +312,9 @@ namespace brynet { namespace net {
|
|||||||
mEventLoop(std::move(eventLoop)),
|
mEventLoop(std::move(eventLoop)),
|
||||||
mAlreadyClose(false),
|
mAlreadyClose(false),
|
||||||
mMaxRecvBufferSize(maxRecvBufferSize),
|
mMaxRecvBufferSize(maxRecvBufferSize),
|
||||||
mEnterCallback(std::move(enterCallback))
|
mSendingMsgSize(0),
|
||||||
|
mEnterCallback(std::move(enterCallback)),
|
||||||
|
mHighWaterSize(0)
|
||||||
{
|
{
|
||||||
mRecvData = false;
|
mRecvData = false;
|
||||||
mCheckTime = std::chrono::steady_clock::duration::zero();
|
mCheckTime = std::chrono::steady_clock::duration::zero();
|
||||||
@ -292,6 +385,29 @@ namespace brynet { namespace net {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void shrinkReceiveBuffer()
|
||||||
|
{
|
||||||
|
auto newSize = buffer_getreadvalidcount(mRecvBuffer.get());
|
||||||
|
if (newSize == 0)
|
||||||
|
{
|
||||||
|
newSize = std::min<size_t>(16 * 1024, mMaxRecvBufferSize);
|
||||||
|
}
|
||||||
|
if(newSize == buffer_getsize(mRecvBuffer.get()))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<struct brynet::base::buffer_s, BufferDeleter>
|
||||||
|
newBuffer(brynet::base::buffer_new(newSize));
|
||||||
|
buffer_write(newBuffer.get(),
|
||||||
|
buffer_getreadptr(mRecvBuffer.get()),
|
||||||
|
buffer_getreadvalidcount(mRecvBuffer.get()));
|
||||||
|
|
||||||
|
mRecvBuffer = std::move(newBuffer);
|
||||||
|
mCurrentTanhXDiff = 0;
|
||||||
|
mRecvBuffOriginSize = newSize;
|
||||||
|
}
|
||||||
|
|
||||||
/* must called in network thread */
|
/* must called in network thread */
|
||||||
bool onEnterEventLoop()
|
bool onEnterEventLoop()
|
||||||
{
|
{
|
||||||
@ -548,6 +664,12 @@ namespace brynet { namespace net {
|
|||||||
buffer_adjustto_head(mRecvBuffer.get());
|
buffer_adjustto_head(mRecvBuffer.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (buffer_getreadvalidcount(mRecvBuffer.get())
|
||||||
|
== buffer_getsize(mRecvBuffer.get()))
|
||||||
|
{
|
||||||
|
growRecvBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
const auto tryRecvLen = buffer_getwritevalidcount(mRecvBuffer.get());
|
const auto tryRecvLen = buffer_getwritevalidcount(mRecvBuffer.get());
|
||||||
if (tryRecvLen == 0)
|
if (tryRecvLen == 0)
|
||||||
{
|
{
|
||||||
@ -612,11 +734,6 @@ namespace brynet { namespace net {
|
|||||||
|
|
||||||
mRecvData = true;
|
mRecvData = true;
|
||||||
buffer_addwritepos(mRecvBuffer.get(), static_cast<size_t>(retlen));
|
buffer_addwritepos(mRecvBuffer.get(), static_cast<size_t>(retlen));
|
||||||
if (buffer_getreadvalidcount(mRecvBuffer.get())
|
|
||||||
== buffer_getsize(mRecvBuffer.get()))
|
|
||||||
{
|
|
||||||
growRecvBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (notInSSL && retlen < static_cast<int>(tryRecvLen))
|
if (notInSSL && retlen < static_cast<int>(tryRecvLen))
|
||||||
{
|
{
|
||||||
@ -662,7 +779,7 @@ namespace brynet { namespace net {
|
|||||||
static const int SENDBUF_SIZE = 1024 * 32;
|
static const int SENDBUF_SIZE = 1024 * 32;
|
||||||
if (threadLocalSendBuf == nullptr)
|
if (threadLocalSendBuf == nullptr)
|
||||||
{
|
{
|
||||||
threadLocalSendBuf = (char*)malloc(SENDBUF_SIZE);
|
threadLocalSendBuf = static_cast<char*>(malloc(SENDBUF_SIZE));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BRYNET_USE_OPENSSL
|
#ifdef BRYNET_USE_OPENSSL
|
||||||
@ -675,13 +792,13 @@ namespace brynet { namespace net {
|
|||||||
|
|
||||||
while (!mSendList.empty() && mCanWrite)
|
while (!mSendList.empty() && mCanWrite)
|
||||||
{
|
{
|
||||||
char* sendptr = threadLocalSendBuf;
|
auto sendptr = threadLocalSendBuf;
|
||||||
size_t wait_send_size = 0;
|
size_t wait_send_size = 0;
|
||||||
|
|
||||||
for (auto it = mSendList.begin(); it != mSendList.end(); ++it)
|
for (auto it = mSendList.begin(); it != mSendList.end(); ++it)
|
||||||
{
|
{
|
||||||
auto& packet = *it;
|
auto& packet = *it;
|
||||||
auto packetLeftBuf = (char*)(packet.data->c_str() + (packet.data->size() - packet.left));
|
auto packetLeftBuf = (char*)(packet.data->data()) + packet.data->size() - packet.left;
|
||||||
const auto packetLeftLen = packet.left;
|
const auto packetLeftLen = packet.left;
|
||||||
|
|
||||||
if ((wait_send_size + packetLeftLen) > SENDBUF_SIZE)
|
if ((wait_send_size + packetLeftLen) > SENDBUF_SIZE)
|
||||||
@ -694,7 +811,7 @@ namespace brynet { namespace net {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(sendptr + wait_send_size, packetLeftBuf, packetLeftLen);
|
memcpy(static_cast<void*>(sendptr + wait_send_size), static_cast<void*>(packetLeftBuf), packetLeftLen);
|
||||||
wait_send_size += packetLeftLen;
|
wait_send_size += packetLeftLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -759,6 +876,7 @@ namespace brynet { namespace net {
|
|||||||
{
|
{
|
||||||
(packet.mCompleteCallback)();
|
(packet.mCompleteCallback)();
|
||||||
}
|
}
|
||||||
|
mSendingMsgSize -= packet.data->size();
|
||||||
it = mSendList.erase(it);
|
it = mSendList.erase(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -791,7 +909,7 @@ namespace brynet { namespace net {
|
|||||||
size_t ready_send_len = 0;
|
size_t ready_send_len = 0;
|
||||||
for (const auto& p : mSendList)
|
for (const auto& p : mSendList)
|
||||||
{
|
{
|
||||||
iov[num].iov_base = (void*)(p.data->c_str() + (p.data->size() - p.left));
|
iov[num].iov_base = (void*)(static_cast<const char*>(p.data->data()) + p.data->size() - p.left);
|
||||||
iov[num].iov_len = p.left;
|
iov[num].iov_len = p.left;
|
||||||
ready_send_len += p.left;
|
ready_send_len += p.left;
|
||||||
|
|
||||||
@ -837,6 +955,7 @@ namespace brynet { namespace net {
|
|||||||
{
|
{
|
||||||
b.mCompleteCallback();
|
b.mCompleteCallback();
|
||||||
}
|
}
|
||||||
|
mSendingMsgSize -= b.data->size();
|
||||||
it = mSendList.erase(it);
|
it = mSendList.erase(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -889,9 +1008,11 @@ namespace brynet { namespace net {
|
|||||||
});
|
});
|
||||||
|
|
||||||
mCanWrite = false;
|
mCanWrite = false;
|
||||||
mDisConnectCallback = nullptr;
|
|
||||||
mDataCallback = nullptr;
|
mDataCallback = nullptr;
|
||||||
|
mDisConnectCallback = nullptr;
|
||||||
|
mHighWaterCallback = nullptr;
|
||||||
mRecvBuffer = nullptr;
|
mRecvBuffer = nullptr;
|
||||||
|
mSendList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void procCloseInLoop()
|
void procCloseInLoop()
|
||||||
@ -1064,16 +1185,25 @@ namespace brynet { namespace net {
|
|||||||
{
|
{
|
||||||
if (mDataCallback != nullptr && buffer_getreadvalidcount(mRecvBuffer.get()) > 0)
|
if (mDataCallback != nullptr && buffer_getreadvalidcount(mRecvBuffer.get()) > 0)
|
||||||
{
|
{
|
||||||
const auto proclen = mDataCallback(buffer_getreadptr(mRecvBuffer.get()),
|
auto reader = brynet::base::BasePacketReader(buffer_getreadptr(mRecvBuffer.get()),
|
||||||
buffer_getreadvalidcount(mRecvBuffer.get()));
|
buffer_getreadvalidcount(mRecvBuffer.get()), false);
|
||||||
assert(proclen <= buffer_getreadvalidcount(mRecvBuffer.get()));
|
mDataCallback(reader);
|
||||||
if (proclen <= buffer_getreadvalidcount(mRecvBuffer.get()))
|
const auto consumedLen = reader.savedPos();
|
||||||
|
assert(consumedLen <= reader.size());
|
||||||
|
if (consumedLen <= reader.size())
|
||||||
{
|
{
|
||||||
buffer_addreadpos(mRecvBuffer.get(), proclen);
|
buffer_addreadpos(mRecvBuffer.get(), consumedLen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename CallbackType, typename Arg>
|
||||||
|
static void verifyArgType(const CallbackType&, void(CallbackType::*)(Arg&) const)
|
||||||
|
{
|
||||||
|
static_assert(std::is_reference<Arg&>::value, "arg must be reference type");
|
||||||
|
static_assert(!std::is_const<typename std::remove_const<Arg>::type>::value, "arg can't be const type");
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
#ifdef BRYNET_PLATFORM_WINDOWS
|
#ifdef BRYNET_PLATFORM_WINDOWS
|
||||||
@ -1105,17 +1235,20 @@ namespace brynet { namespace net {
|
|||||||
|
|
||||||
struct PendingPacket
|
struct PendingPacket
|
||||||
{
|
{
|
||||||
PacketPtr data;
|
SendableMsg::Ptr data;
|
||||||
size_t left;
|
size_t left;
|
||||||
PacketSendedCallback mCompleteCallback;
|
PacketSendedCallback mCompleteCallback;
|
||||||
};
|
};
|
||||||
|
|
||||||
using PacketListType = std::deque<PendingPacket>;
|
using PacketListType = std::deque<PendingPacket>;
|
||||||
PacketListType mSendList;
|
PacketListType mSendList;
|
||||||
|
size_t mSendingMsgSize;
|
||||||
|
|
||||||
EnterCallback mEnterCallback;
|
EnterCallback mEnterCallback;
|
||||||
DataCallback mDataCallback;
|
DataCallback mDataCallback;
|
||||||
DisconnectedCallback mDisConnectCallback;
|
DisconnectedCallback mDisConnectCallback;
|
||||||
|
HighWaterCallback mHighWaterCallback;
|
||||||
|
size_t mHighWaterSize;
|
||||||
|
|
||||||
bool mIsPostFlush;
|
bool mIsPostFlush;
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ namespace brynet { namespace net { namespace http {
|
|||||||
void send(PacketType&& packet,
|
void send(PacketType&& packet,
|
||||||
TcpConnection::PacketSendedCallback&& callback = nullptr)
|
TcpConnection::PacketSendedCallback&& callback = nullptr)
|
||||||
{
|
{
|
||||||
mSession->send(std::forward<TcpConnection::PacketPtr>(packet),
|
mSession->send(std::forward<PacketType&&>(packet),
|
||||||
std::move(callback));
|
std::move(callback));
|
||||||
}
|
}
|
||||||
void send(const char* packet,
|
void send(const char* packet,
|
||||||
@ -196,25 +196,26 @@ namespace brynet { namespace net { namespace http {
|
|||||||
|
|
||||||
auto httpParser = std::make_shared<HTTPParser>(HTTP_BOTH);
|
auto httpParser = std::make_shared<HTTPParser>(HTTP_BOTH);
|
||||||
session->setDataCallback([httpSession, httpParser](
|
session->setDataCallback([httpSession, httpParser](
|
||||||
const char* buffer, size_t len) {
|
brynet::base::BasePacketReader& reader) {
|
||||||
size_t retlen = 0;
|
size_t retLen = 0;
|
||||||
|
|
||||||
if (httpParser->isWebSocket())
|
if (httpParser->isWebSocket())
|
||||||
{
|
{
|
||||||
retlen = HttpService::ProcessWebSocket(buffer,
|
retLen = HttpService::ProcessWebSocket( reader.begin(),
|
||||||
len,
|
reader.size(),
|
||||||
httpParser,
|
httpParser,
|
||||||
httpSession);
|
httpSession);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
retlen = HttpService::ProcessHttp(buffer,
|
retLen = HttpService::ProcessHttp( reader.begin(),
|
||||||
len,
|
reader.size(),
|
||||||
httpParser,
|
httpParser,
|
||||||
httpSession);
|
httpSession);
|
||||||
}
|
}
|
||||||
|
|
||||||
return retlen;
|
reader.addPos(retLen);
|
||||||
|
reader.savePos();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user