首先,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的包装类相关推荐

  1. 高性能 TCP UDP 通信框架 HP-Socket v3.2.3

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  2. 高性能 Socket 组件 HP-Socket v3.1.3 正式发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件,提供服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP/ ...

  3. 高性能 TCP amp; UDP 通信框架 HP-Socket v3.2.3 正式宣布

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包括服务端组件.client组件和 Agent 组件.广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#. ...

  4. 【新年呈献】高性能 Socket 组件 HP-Socket v3.1.2 正式发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...

  5. 八种基本类型的包装类你真的懂了?

    进来先做个题: Integer i1 = 10;Integer i2 = 10;Integer i3 = 128;Integer i4 = 128;Integer i5 = 118;Integer i ...

  6. java包装_Java基础之神奇的包装类(一)

    1. 导读 JAVA中针对八种基本数据类型提供了相对应的包装类, 今天主要基于几个问题来分享下个人对于包装类的理解, 本期先分享下面两个问题: .1 什么是包装类? 有了基本类型, 为什么还需要有包装 ...

  7. Windows下Eclipse配置基于MinGW的C/C++开发环境

    Eclipse安装CDT及其他插件的方法 1.搜索CDT线上安装地址 进入Ecllipse插件下载官网https://www.eclipse.org/cdt/downloads.php,在官网页面列表 ...

  8. 简单C++线程池包装类源码示例

    这里给出一个简单的C++线程池包装类,该类具有的特点是: 1.线程池大小是固定的, 一创建后,就不具有伸缩特性. 一般建议是 CPU核心数的2倍或1倍. 2.简单但是很可靠. 3.资源占用极低. 在开 ...

  9. SQLite3简单C++包装类源码示例

    一个比较好的SQLite3 C++ wrapper包装类的通常思路是这样的: 数据库连接类,包含连接池,和sqlite3*,负责与数据库文件的连接问题: 一些create table,insert,u ...

最新文章

  1. 使用RazorGenerator对视图View进行单元测试
  2. typedef函数指针使用方法
  3. java oracle 乐观锁,oracle为什么默认乐观锁
  4. boost::function模块右值的测试程序
  5. oracle bom展开 sql,Oracle EBS-SQL (BOM-15):检查多层BOM(含common BOM).sql
  6. 音视频技术开发周刊 | 176
  7. 从边缘到云,万物互联时代Aruba的技术经
  8. 滚屏加载--无刷新动态加载数据技术的应用
  9. rsync+inotify实现实时同步案例详解
  10. DSP技术是利用计算机或,DSP技术是什么?
  11. sketch 52.2 中文破解版发布 附下载地址
  12. Struts2通配符映射的各种情况详情
  13. 北极星指标——定义与制定标准
  14. 无线路由器如何建立ftp服务器,利用无线路由器建立FTP服务器
  15. Matlab yalmip 符号变量syms和sdpvar的替换
  16. 王倩兮金碧山水作品《绿水青山就是金山银山》
  17. GitHub换帅,Nat Friedman辞任CEO,发告别信感恩「这三年」
  18. USB 之枚举过程概述
  19. 通过css注入实现的android webview的夜间模式
  20. 受迫阻尼 matlab 仿真,有阻尼受迫振动系统的计算机仿真分析

热门文章

  1. 惠普服务器硬件检测软件吗,惠普服务器没法开机,怎么检测硬盘状况
  2. 小米小爱同学PC版下载地址
  3. vue key值的重复键问题报错
  4. Mybatis 开启驼峰命名映射
  5. 微服务实战|微服务网关Zuul入门与实战
  6. D3.js 以圆做点绘制力图(一)
  7. 插画喵课程 玫瑰花怎么画教程(详细步骤)
  8. JS 实现段落展开和收起的显示
  9. XSS跨站脚本攻击漏洞
  10. python ssh远程连接服务器并执行命令或相关操作