#pragma once #ifndef P2PMODULE_EXPORTS #ifdef _WIN64 #ifdef _DEBUG #pragma comment(lib, "P2PModuleX64D.lib") #else #pragma comment(lib, "P2PModuleX64.lib") #endif #else #ifdef _DEBUG #pragma comment(lib, "P2PModuleD.lib") #else #pragma comment(lib, "P2PModule.lib") #endif #endif #endif // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 RESDATAOBJECT_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // RESDATAOBJECT_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifdef P2PMODULE_EXPORTS #define P2PMODULE_API __declspec(dllexport) #define P2PMODULE_C_API extern "C" __declspec(dllexport) #else #define P2PMODULE_API __declspec(dllimport) #define P2PMODULE_C_API extern "C" __declspec(dllimport) #endif #include #include "CcosThread.h" #include "CcosLock.h" class P2PMODULE_API P2P_Module_Base : public Ccos_Thread, public CcosLock { protected: char *m_pszMessageBuff; DWORD m_MessageBuffSize; PVOID m_pMainDevBus; char *m_pszIpAddress; char *m_pszLocalBusId; char *m_pszRemoteBusId; WORD m_Port; bool m_AsServer; SOCKET Socketfd; SOCKET m_SocketTarget; HANDLE m_ConnectionReady; //send block bool SendBlob(SOCKET &sck, const char *pMsg, const char *pBlock, DWORD size,bool Sync = false); bool ReadBlobSync(SOCKET &sck, char *pMsg, DWORD &MsgSize, char *pBlock, DWORD &size); bool ReadBlob(SOCKET &sck, char *pMsg, DWORD &MsgSize, char *pBlock, DWORD &size); public: P2P_Module_Base(); ~P2P_Module_Base(); //init void InitP2P(const char *pszIp, const char *pszLocalBusId, bool AsServer, PVOID pParent); //connect virtual bool ConnectP2P(); //disconnect virtual void Disconnect(); //check line virtual bool IsConnected(); //do last quit virtual void Quit(); bool IsTargetBusId(const char *pszTargetBusId); //callback virtual void OnBlob(char *pMsg, unsigned char *pData, DWORD size); virtual bool Exec(); bool SendRaw(SOCKET &sck, const char *pData, DWORD size,bool Sync = false); bool ReadRawSync(SOCKET &sck, char *pszBuff, DWORD ExpectedSize); bool ReadRaw(SOCKET &sck, char *pszBuff, DWORD ExpectedSize); virtual bool SendBlob(const char *pMsg, const char *pBlock, DWORD size); //virtual bool ReadBlob(char *pMsg, DWORD &MsgSize, char *pBlock, DWORD &size);//对外不公开,没用 }; class P2PMODULE_API P2P_Module_Server : public P2P_Module_Base { DWORD m_HeartBeatTimeout; public: P2P_Module_Server(); ~P2P_Module_Server(); //connect virtual bool ConnectP2P(); //disconnect virtual void Disconnect(); virtual void Quit(); virtual bool IsConnected(); //callback,one way to client no receive from anyone //virtual void OnBlob(char *pMsg, char *pData, DWORD size); virtual bool Exec(); int TryInit(); int TryAccept(); int TryCheckConnection(); virtual bool SendBlob(const char *pMsg, const char *pBlock, DWORD size); }; class P2PMODULE_API P2P_Module_Client : public P2P_Module_Base { char *m_pszMsgBuff; unsigned char *m_pszBlockBuff; public: P2P_Module_Client(); ~P2P_Module_Client(); bool TryConnectServer(); //connect virtual bool ConnectP2P(); //disconnect virtual void Disconnect(); //send block,one way to client no send to anyone //virtual bool SendBlob(char *pMsg, char *pBlock, DWORD size); //callback //virtual void OnBlob(char *pMsg, char *pData, DWORD size); virtual bool Exec(); };