Mingw使用HPSocket的包装类
首先,HPSocket是一个很好的开源网络项目,支持跨平台,Windows,Linux,Android,MacOS等等。但是就Windows平台而言,它的开发环境是VisualStudio。由于c++编译器的差异,Mingw和Mingw64是无法调用HPSocket的c++动态链接库的,因此我们只能使用HPSocket的c语言动态库。但是对于习惯使用c++的人来说,使用c语言是一件感觉很不好的事,就像现代人,突然回到了原始社会一样,在c语言中,没有c++的各种武器,并且函数、变量分散,阅读代码困难。因此自己抛砖引玉,对HPSocket做了下简单的包装,代码如下。
//
// Created by Yoo on 2020/5/26.
//#ifndef HP_WRAPPER_HPP
#define HP_WRAPPER_HPP#include <cstdio>
#include <HPSocket/HPSocket4C.h>
#include <HPSocket/HPTypeDef.h>
#include <assert.h>
#include <memory.h>
#include <malloc.h>#if !defined(MAX)
#define MAX(a, b) (((a) >= (b)) ? (a) : (b))
#endif#if !defined(MIN)
#define MIN(a, b) (((a) <= (b)) ? (a) : (b))
#endiftemplate<class T, size_t MAX_CACHE_SIZE = 0>
class CBufferPtrT {
public:explicit CBufferPtrT(size_t size = 0, bool zero = false) {Reset();Malloc(size, zero);}explicit CBufferPtrT(const T *pch, size_t size) {Reset();Copy(pch, size);}CBufferPtrT(const CBufferPtrT &other) {Reset();Copy(other);}template<size_t S>CBufferPtrT(const CBufferPtrT<T, S> &other) {Reset();Copy(other);}~CBufferPtrT() { Free(); }T *Malloc(size_t size = 1, bool zero = false) {Free();return Alloc(size, zero, false);}T *Realloc(size_t size, bool zero = false) {return Alloc(size, zero, true);}void Free() {if (m_pch) {free(m_pch);Reset();}}template<size_t S>CBufferPtrT &Copy(const CBufferPtrT<T, S> &other) {if ((void *) &other != (void *) this)Copy(other.Ptr(), other.Size());return *this;}CBufferPtrT &Copy(const T *pch, size_t size) {Malloc(size);if (m_pch)memcpy(m_pch, pch, size * sizeof(T));return *this;}template<size_t S>CBufferPtrT &Cat(const CBufferPtrT<T, S> &other) {if ((void *) &other != (void *) this)Cat(other.Ptr(), other.Size());return *this;}CBufferPtrT &Cat(const T *pch, size_t size = 1) {size_t pre_size = m_size;Realloc(m_size + size);if (m_pch)memcpy(m_pch + pre_size, pch, size * sizeof(T));return *this;}template<size_t S>bool Equal(const CBufferPtrT<T, S> &other) const {if ((void *) &other == (void *) this)return true;else if (m_size != other.Size())return false;else if (m_size == 0)return true;elsereturn (memcmp(m_pch, other.Ptr(), m_size * sizeof(T)) == 0);}bool Equal(T *pch) const {if (m_pch == pch)return true;else if (!m_pch || !pch)return false;elsereturn (memcmp(m_pch, pch, m_size * sizeof(T)) == 0);}T *Ptr() { return m_pch; }const T *Ptr() const { return m_pch; }T &Get(int i) { return *(m_pch + i); }const T &Get(int i) const { return *(m_pch + i); }size_t Size() const { return m_size; }bool IsValid() const { return m_pch != 0; }operator T *() { return Ptr(); }operator const T *() const { return Ptr(); }T &operator[](int i) { return Get(i); }const T &operator[](int i) const { return Get(i); }bool operator==(T *pv) const { return Equal(pv); }template<size_t S>bool operator==(const CBufferPtrT<T, S> &other) { return Equal(other); }CBufferPtrT &operator=(const CBufferPtrT &other) { return Copy(other); }template<size_t S>CBufferPtrT &operator=(const CBufferPtrT<T, S> &other) { return Copy(other); }private:void Reset() {m_pch = 0;m_size = 0;m_capacity = 0;}size_t GetAllocSize(size_t size) { return MAX(size, MIN(size * 2, m_size + MAX_CACHE_SIZE)); }T *Alloc(size_t size, bool zero = false, bool is_realloc = false) {if (size >= 0 && size != m_size) {size_t rsize = GetAllocSize(size);if (size > m_capacity || rsize < m_size) {m_pch = is_realloc ?(T *) realloc(m_pch, rsize * sizeof(T)) :(T *) malloc(rsize * sizeof(T));if (m_pch || rsize == 0) {m_size = size;m_capacity = rsize;} elseReset();} elsem_size = size;}if (zero && m_pch)memset(m_pch, 0, m_size * sizeof(T));return m_pch;}private:T *m_pch;size_t m_size;size_t m_capacity;
};typedef CBufferPtrT<char> CCharBufferPtr;
typedef CBufferPtrT<unsigned char> CByteBufferPtr;
typedef CByteBufferPtr CBufferPtr;/*** 服务端基础类* @tparam SERVER* @tparam T* @tparam PORT*/
template<typename SERVER, typename T, int PORT>
class serverBase {
public:explicit serverBase(SERVER *pServer) : m_pServer(pServer) {}serverBase() = delete;BOOL SetPkgInfo(HP_Server pSender, HP_CONNID dwConnID) {return HP_Server_SetConnectionExtra(pSender, dwConnID, new T);}T *FindPkgInfo(HP_Server pSender, HP_CONNID dwConnID) {PVOID pInfo = nullptr;HP_Server_GetConnectionExtra(pSender, dwConnID, &pInfo);return reinterpret_cast<T *>(pInfo);}void RemovePkgInfo(HP_Server pSender, HP_CONNID dwConnID) {T *pInfo = FindPkgInfo(pSender, dwConnID);assert(pInfo != nullptr);delete pInfo;}BOOL start() {return HP_Server_Start(*m_pServer, "0.0.0.0", PORT);}BOOL stop() {return HP_Server_Stop(*m_pServer);}BOOL sendPack(HP_CONNID dwConnID, const BYTE *pBuffer, int iLength) {return HP_Server_Send(*m_pServer, dwConnID, pBuffer, iLength);}BOOL sendPacks(HP_CONNID dwConnID, const WSABUF pBuffers[], int iCount) {return HP_Server_SendPackets(*m_pServer, dwConnID, pBuffers, iCount);}private:SERVER *m_pServer;
};/*** 客户端基础类* @tparam CLIENT* @tparam T* @tparam IP_0* @tparam IP_1* @tparam IP_2* @tparam IP_3* @tparam PORT*/
template<typename CLIENT, typename T, int IP_0, int IP_1, int IP_2, int IP_3, int PORT>
class clientBase {
public:explicit clientBase(CLIENT *pClient) : m_pClient(pClient) {sprintf(m_IP, "%d.%d.%d.%d", IP_0, IP_1, IP_2, IP_3);}clientBase() = delete;void SetPkgInfo(HP_Client pSender) {HP_Client_SetExtra(pSender, new T);}T *FindPkgInfo(HP_Client pSender) {PVOID pInfo = HP_Client_GetExtra(pSender);return reinterpret_cast<T *>(pInfo);}void RemovePkgInfo(HP_Client pSender) {T *pInfo = FindPkgInfo(pSender);assert(pInfo != nullptr);delete pInfo;}BOOL start() {return HP_Client_Start(*m_pClient, m_IP, PORT, TRUE);}BOOL stop() {return HP_Client_Stop(*m_pClient);}BOOL sendPack(const BYTE *pBuffer, int iLength) {return HP_Client_Send(*m_pClient, pBuffer, iLength);}BOOL sendPacks(const WSABUF pBuffers[], int iCount) {return HP_Client_SendPackets(*m_pClient, pBuffers, iCount);}private:CLIENT *m_pClient;char m_IP[16] = {0};};/*** pull类型服务端监听器*/
class pullServerListener {
public:virtual En_HP_HandleResult onPrepareListen(HP_Server pSender, SOCKET soListen) = 0;virtual En_HP_HandleResult onAccept(HP_Server pSender, HP_CONNID dwConnID, SOCKET soClient) = 0;virtual En_HP_HandleResult onSend(HP_Server pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) = 0;virtual En_HP_HandleResult onReceive(HP_Server pSender, HP_CONNID dwConnID, int iLength) = 0;virtual En_HP_HandleResultonClose(HP_Server pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode) = 0;virtual En_HP_HandleResult onShutdown(HP_Server pSender) = 0;
};/*** pull类型客户端监听器*/
class pullClientListener {
public:virtual En_HP_HandleResult onConnect(HP_Client pSender, HP_CONNID dwConnID) = 0;virtual En_HP_HandleResult onSend(HP_Client pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) = 0;virtual En_HP_HandleResult onReceive(HP_Client pSender, HP_CONNID dwConnID, int iLength) = 0;virtual En_HP_HandleResultonClose(HP_Client pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode) = 0;
};/*** pack类型服务端监听器*/
class packServerListener {
public:virtual En_HP_HandleResult onPrepareListen(HP_Server pSender, SOCKET soListen) = 0;virtual En_HP_HandleResult onAccept(HP_Server pSender, HP_CONNID dwConnID, SOCKET soClient) = 0;virtual En_HP_HandleResult onSend(HP_Server pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) = 0;virtual En_HP_HandleResult onReceive(HP_Server pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) = 0;virtual En_HP_HandleResultonClose(HP_Server pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode) = 0;virtual En_HP_HandleResult onShutdown(HP_Server pSender) = 0;
};/*** pack类型客户端监听器*/
class packClientListener {
public:virtual En_HP_HandleResult onConnect(HP_Client pSender, HP_CONNID dwConnID) = 0;virtual En_HP_HandleResult onSend(HP_Client pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) = 0;virtual En_HP_HandleResult onReceive(HP_Client pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) = 0;virtual En_HP_HandleResultonClose(HP_Client pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode) = 0;
};/*** pull类型服务端基础类* @tparam T* @tparam PORT*/
template<typename T, int PORT>
class pullServer : public serverBase<HP_TcpPullServer, T, PORT>, public pullServerListener {public:pullServer() : serverBase<HP_TcpPullServer, T, PORT>(&m_pServer) {pThis = this;m_pListener = Create_HP_TcpPullServerListener();m_pServer = Create_HP_TcpPullServer(m_pListener);HP_Set_FN_Server_OnPrepareListen(m_pListener, OnPrepareListen);HP_Set_FN_Server_OnAccept(m_pListener, OnAccept);HP_Set_FN_Server_OnSend(m_pListener, OnSend);HP_Set_FN_Server_OnPullReceive(m_pListener, OnReceive);HP_Set_FN_Server_OnClose(m_pListener, OnClose);HP_Set_FN_Server_OnShutdown(m_pListener, OnShutdown);}~pullServer() {Destroy_HP_TcpPullServerListener(m_pListener);Destroy_HP_TcpPullServer(m_pServer);}private:static En_HP_HandleResult __HP_CALL OnPrepareListen(HP_Server pSender, SOCKET soListen) {return pThis->onPrepareListen(pSender, soListen);}static En_HP_HandleResult __HP_CALL OnAccept(HP_Server pSender, HP_CONNID dwConnID, SOCKET soClient) {return pThis->onAccept(pSender, dwConnID, soClient);}static En_HP_HandleResult __HP_CALL OnSend(HP_Server pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) {return pThis->onSend(pSender, dwConnID, pData, iLength);}static En_HP_HandleResult __HP_CALL OnReceive(HP_Server pSender, HP_CONNID dwConnID, int iLength) {return pThis->onReceive(pSender, dwConnID, iLength);}static En_HP_HandleResult __HP_CALLOnClose(HP_Server pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode) {return pThis->onClose(pSender, dwConnID, enOperation, iErrorCode);}static En_HP_HandleResult __HP_CALL OnShutdown(HP_Server pSender) {return pThis->onShutdown(pSender);}private:static pullServer *pThis;HP_TcpPullServer m_pServer;HP_TcpPullServerListener m_pListener;
};template<typename T, int PORT>
pullServer<T, PORT> *pullServer<T, PORT>::pThis = nullptr;/*** pull类型客户端基础类* @tparam T* @tparam IP_0* @tparam IP_1* @tparam IP_2* @tparam IP_3* @tparam PORT*/
template<typename T, int IP_0, int IP_1, int IP_2, int IP_3, int PORT>
class pullClient : public clientBase<HP_TcpPullClient, T, IP_0, IP_1, IP_2, IP_3, PORT>, public pullClientListener {
public:using __super = clientBase<HP_TcpPullClient, T, IP_0, IP_1, IP_2, IP_3, PORT>;explicit pullClient() : __super(&m_pClient) {pThis = this;m_pListener = Create_HP_TcpPullClientListener();m_pClient = Create_HP_TcpPullClient(m_pListener);HP_Set_FN_Client_OnConnect(m_pListener, OnConnect);HP_Set_FN_Client_OnSend(m_pListener, OnSend);HP_Set_FN_Client_OnPullReceive(m_pListener, OnReceive);HP_Set_FN_Client_OnClose(m_pListener, OnClose);}virtual ~pullClient() {Destroy_HP_TcpPullClientListener(m_pListener);Destroy_HP_TcpPullClient(m_pClient);}private:static En_HP_HandleResult __HP_CALL OnConnect(HP_Client pSender, HP_CONNID dwConnID) {return pThis->onConnect(pSender, dwConnID);}static En_HP_HandleResult __HP_CALL OnSend(HP_Client pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) {return pThis->onSend(pSender, dwConnID, pData, iLength);}static En_HP_HandleResult __HP_CALL OnReceive(HP_Client pSender, HP_CONNID dwConnID, int iLength) {return pThis->onReceive(pSender, dwConnID, iLength);}static En_HP_HandleResult __HP_CALLOnClose(HP_Client pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode) {return pThis->onClose(pSender, dwConnID, enOperation, iErrorCode);}protected:static pullClient *pThis;HP_TcpPullClient m_pClient;HP_TcpPullClientListener m_pListener;};template<typename T, int IP_0, int IP_1, int IP_2, int IP_3, int PORT>
pullClient<T, IP_0, IP_1, IP_2, IP_3, PORT> *pullClient<T, IP_0, IP_1, IP_2, IP_3, PORT>::pThis = nullptr;/*** pack类型服务端基础类* @tparam T* @tparam PORT* @tparam MAX_PACKSIZE* @tparam PACKHEADER_FLAG*/
template<typename T, int PORT, int MAX_PACKSIZE, int PACKHEADER_FLAG>
class packServer : public serverBase<HP_TcpPackServer, T, PORT>, public packServerListener {
public:packServer() : serverBase<HP_TcpPackServer, T, PORT>(&m_pServer) {pThis = this;m_pListener = Create_HP_TcpPackServerListener();m_pServer = Create_HP_TcpPackServer(m_pListener);HP_Set_FN_Server_OnPrepareListen(m_pListener, OnPrepareListen);HP_Set_FN_Server_OnAccept(m_pListener, OnAccept);HP_Set_FN_Server_OnSend(m_pListener, OnSend);HP_Set_FN_Server_OnReceive(m_pListener, OnReceive);HP_Set_FN_Server_OnClose(m_pListener, OnClose);HP_Set_FN_Server_OnShutdown(m_pListener, OnShutdown);HP_TcpPackServer_SetMaxPackSize(m_pServer, MAX_PACKSIZE);HP_TcpPackServer_SetPackHeaderFlag(m_pServer, PACKHEADER_FLAG);}~packServer() {Destroy_HP_TcpPackServerListener(m_pListener);Destroy_HP_TcpPackServer(m_pServer);}private:static En_HP_HandleResult __HP_CALL OnPrepareListen(HP_Server pSender, SOCKET soListen) {return pThis->onPrepareListen(pSender, soListen);}static En_HP_HandleResult __HP_CALL OnAccept(HP_Server pSender, HP_CONNID dwConnID, SOCKET soClient) {return pThis->onAccept(pSender, dwConnID, soClient);}static En_HP_HandleResult __HP_CALL OnSend(HP_Server pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) {return pThis->onSend(pSender, dwConnID, pData, iLength);}static En_HP_HandleResult __HP_CALLOnReceive(HP_Server pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) {return pThis->onReceive(pSender, dwConnID, pData, iLength);}static En_HP_HandleResult __HP_CALLOnClose(HP_Server pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode) {return pThis->onClose(pSender, dwConnID, enOperation, iErrorCode);}static En_HP_HandleResult __HP_CALL OnShutdown(HP_Server pSender) {return pThis->onShutdown(pSender);}private:static packServer *pThis;HP_TcpPackServer m_pServer;HP_TcpServerListener m_pListener;
};template<typename T, int PORT, int MAX_PACKSIZE, int PACKHEADER_FLAG>
packServer<T, PORT, MAX_PACKSIZE, PACKHEADER_FLAG> *packServer<T, PORT, MAX_PACKSIZE, PACKHEADER_FLAG>::pThis = nullptr;/*** pack类型客户端基础类* @tparam T* @tparam IP_0* @tparam IP_1* @tparam IP_2* @tparam IP_3* @tparam PORT* @tparam MAX_PACKSIZE* @tparam PACKHEADER_FLAG*/
template<typename T, int IP_0, int IP_1, int IP_2, int IP_3, int PORT, int MAX_PACKSIZE, int PACKHEADER_FLAG>
class packClient : public clientBase<HP_TcpPackClient, T, IP_0, IP_1, IP_2, IP_3, PORT>, public packClientListener {
public:packClient() : clientBase<HP_TcpPackClient, T, IP_0, IP_1, IP_2, IP_3, PORT>(&m_pClient) {pThis = this;m_pListener = Create_HP_TcpPackClientListener();m_pClient = Create_HP_TcpPackClient(m_pListener);HP_Set_FN_Client_OnConnect(m_pListener, OnConnect);HP_Set_FN_Client_OnSend(m_pListener, OnSend);HP_Set_FN_Client_OnReceive(m_pListener, OnReceive);HP_Set_FN_Client_OnClose(m_pListener, OnClose);HP_TcpPackClient_SetMaxPackSize(m_pClient, MAX_PACKSIZE);HP_TcpPackClient_SetPackHeaderFlag(m_pClient, PACKHEADER_FLAG);}~packClient() {Destroy_HP_TcpPackClientListener(m_pListener);Destroy_HP_TcpPackClient(m_pClient);}private:static En_HP_HandleResult __HP_CALL OnConnect(HP_Client pSender, HP_CONNID dwConnID) {return pThis->onConnect(pSender, dwConnID);}static En_HP_HandleResult __HP_CALL OnSend(HP_Client pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) {return pThis->onSend(pSender, dwConnID, pData, iLength);}static En_HP_HandleResult __HP_CALLOnReceive(HP_Client pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) {return pThis->onReceive(pSender, dwConnID, pData, iLength);}static En_HP_HandleResult __HP_CALLOnClose(HP_Client pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode) {return pThis->onClose(pSender, dwConnID, enOperation, iErrorCode);}protected:static packClient *pThis;HP_TcpPackClient m_pClient;HP_TcpPackClientListener m_pListener;};template<typename T, int IP_0, int IP_1, int IP_2, int IP_3, int PORT, int MAX_PACKSIZE, int PACKHEADER_FLAG>
packClient<T, IP_0, IP_1, IP_2, IP_3, PORT, MAX_PACKSIZE, PACKHEADER_FLAG> *packClient<T, IP_0, IP_1, IP_2, IP_3, PORT, MAX_PACKSIZE, PACKHEADER_FLAG>::pThis = nullptr;#endif //HP_WRAPPER_HPP
//
// Created by Yoo on 2020/5/26.
//#ifndef TEST_0_MYPACKCLIENT_HPP
#define TEST_0_MYPACKCLIENT_HPP#include "hp_wrapper.hpp"
#include <thread>class mypackclient : public packClient<int, 127, 0, 0, 1, 5555, 0xFFFF, 0x169> {
public:mypackclient() {beginReconnect();}~mypackclient() {endReconnect();}private:void beginReconnect() {t = std::thread([this] {while (!exit) {if (HP_Client_GetState(m_pClient) == SS_STOPPED) {start();}std::this_thread::sleep_for(std::chrono::milliseconds(100));}});}void endReconnect() {exit = true;if (t.joinable()) {t.join();}}virtual En_HP_HandleResult onConnect(HP_Client pSender, HP_CONNID dwConnID) override {SetPkgInfo(pSender);return HR_OK;}virtual En_HP_HandleResult onSend(HP_Client pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) override {return HR_OK;}virtual En_HP_HandleResultonReceive(HP_Client pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) override {auto pInfo = FindPkgInfo(pSender);if (pInfo != nullptr) {std::cout << (char *) pData << std::endl;}return HR_OK;}virtual En_HP_HandleResultonClose(HP_Client pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode) override {RemovePkgInfo(pSender);return HR_OK;}private:bool exit = false;std::thread t;
};#endif //TEST_0_MYPACKCLIENT_HPP
//
// Created by Yoo on 2020/5/26.
//#ifndef TEST_0_MYPACKSERVER_HPP
#define TEST_0_MYPACKSERVER_HPP
#include "hp_wrapper.hpp"
#include <iostream>
class Info{
public:Info(){memset(buffer,0,64);}void setBuffer(char *buf,int bufsize){if(bufsize <= 64){memcpy(buffer,buf,bufsize);}}char * getBuffer(){return buffer;}
private:char buffer[64];
};class mypackserver : public packServer<Info,5555,0xFFFF,0x169>{public:mypackserver(){start();}
private:virtual En_HP_HandleResult onPrepareListen(HP_Server pSender, SOCKET soListen) override {return HR_OK;}virtual En_HP_HandleResult onAccept(HP_Server pSender, HP_CONNID dwConnID, SOCKET soClient) override{SetPkgInfo(pSender,dwConnID);return HR_OK;}virtual En_HP_HandleResult onSend(HP_Server pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) override{return HR_OK;}virtual En_HP_HandleResult onReceive(HP_Server pSender, HP_CONNID dwConnID, const BYTE *pData, int iLength) override{Info *pInfo = FindPkgInfo(pSender,dwConnID);if(pInfo != nullptr){std::cout << reinterpret_cast<const char*>(pData) << std::endl;std::cout << iLength << std::endl;}return HR_OK;}virtual En_HP_HandleResultonClose(HP_Server pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode) override{RemovePkgInfo(pSender,dwConnID);return HR_OK;}virtual En_HP_HandleResult onShutdown(HP_Server pSender) override{return HR_OK;}
};#endif //TEST_0_MYPACKSERVER_HPP
#include "mypackserver.hpp"
#include "mypackclient.hpp"int main() {mypackserver my;mypackclient mc;while (true){std::string str;std::getline(std::cin,str);if(str == "exit"){break;}else{mc.sendPack((BYTE*)str.c_str(),str.length()+1);}}return 0;
}
Mingw使用HPSocket的包装类相关推荐
- 高性能 TCP UDP 通信框架 HP-Socket v3.2.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 Socket 组件 HP-Socket v3.1.3 正式发布
HP-Socket 是一套通用的高性能 Windows Socket 组件,提供服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP/ ...
- 高性能 TCP amp; UDP 通信框架 HP-Socket v3.2.3 正式宣布
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包括服务端组件.client组件和 Agent 组件.广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#. ...
- 【新年呈献】高性能 Socket 组件 HP-Socket v3.1.2 正式发布
HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...
- 八种基本类型的包装类你真的懂了?
进来先做个题: Integer i1 = 10;Integer i2 = 10;Integer i3 = 128;Integer i4 = 128;Integer i5 = 118;Integer i ...
- java包装_Java基础之神奇的包装类(一)
1. 导读 JAVA中针对八种基本数据类型提供了相对应的包装类, 今天主要基于几个问题来分享下个人对于包装类的理解, 本期先分享下面两个问题: .1 什么是包装类? 有了基本类型, 为什么还需要有包装 ...
- Windows下Eclipse配置基于MinGW的C/C++开发环境
Eclipse安装CDT及其他插件的方法 1.搜索CDT线上安装地址 进入Ecllipse插件下载官网https://www.eclipse.org/cdt/downloads.php,在官网页面列表 ...
- 简单C++线程池包装类源码示例
这里给出一个简单的C++线程池包装类,该类具有的特点是: 1.线程池大小是固定的, 一创建后,就不具有伸缩特性. 一般建议是 CPU核心数的2倍或1倍. 2.简单但是很可靠. 3.资源占用极低. 在开 ...
- SQLite3简单C++包装类源码示例
一个比较好的SQLite3 C++ wrapper包装类的通常思路是这样的: 数据库连接类,包含连接池,和sqlite3*,负责与数据库文件的连接问题: 一些create table,insert,u ...
最新文章
- 使用RazorGenerator对视图View进行单元测试
- typedef函数指针使用方法
- java oracle 乐观锁,oracle为什么默认乐观锁
- boost::function模块右值的测试程序
- oracle bom展开 sql,Oracle EBS-SQL (BOM-15):检查多层BOM(含common BOM).sql
- 音视频技术开发周刊 | 176
- 从边缘到云,万物互联时代Aruba的技术经
- 滚屏加载--无刷新动态加载数据技术的应用
- rsync+inotify实现实时同步案例详解
- DSP技术是利用计算机或,DSP技术是什么?
- sketch 52.2 中文破解版发布 附下载地址
- Struts2通配符映射的各种情况详情
- 北极星指标——定义与制定标准
- 无线路由器如何建立ftp服务器,利用无线路由器建立FTP服务器
- Matlab yalmip 符号变量syms和sdpvar的替换
- 王倩兮金碧山水作品《绿水青山就是金山银山》
- GitHub换帅,Nat Friedman辞任CEO,发告别信感恩「这三年」
- USB 之枚举过程概述
- 通过css注入实现的android webview的夜间模式
- 受迫阻尼 matlab 仿真,有阻尼受迫振动系统的计算机仿真分析