www.pudn.com > ServerClient_Socket.rar > SocketComm.h
/////////////////////////////////////////////////////////////////////////////// // FILE : SocketComm.h // Header file for CSocketComm class // CSocketComm // Generic class for Socket Communication /////////////////////////////////////////////////////////////////////////////// #ifndef _SOCKETCOMM_H_ #define _SOCKETCOMM_H_ #include#include
#include #pragma comment(lib, "ws2_32") // Event value #define EVT_CONSUCCESS 0x0000 // Connection established #define EVT_CONFAILURE 0x0001 // General failure - Wait Connection failed #define EVT_CONDROP 0x0002 // Connection dropped #define EVT_ZEROLENGTH 0x0003 // Zero length message #define BUFFER_SIZE MAX_PATH #define HOSTNAME_SIZE MAX_PATH #define STRING_LENGTH 40 struct SockAddrIn : public SOCKADDR_IN { public: SockAddrIn() { Clear(); } SockAddrIn(const SockAddrIn& sin) { Copy( sin ); } ~SockAddrIn() { } SockAddrIn& Copy(const SockAddrIn& sin); void Clear() { memset(this, 0, sizeof(SOCKADDR_IN)); } bool IsEqual(const SockAddrIn& sin); bool IsGreater(const SockAddrIn& sin); bool IsLower(const SockAddrIn& pm); bool IsNull() const { return ((sin_addr.s_addr==0L)&&(sin_port==0)); } ULONG GetIPAddr() const { return sin_addr.s_addr; } short GetPort() const { return sin_port; } bool CreateFrom(LPCTSTR sAddr, LPCTSTR sService, int nFamily = AF_INET); SockAddrIn& operator=(const SockAddrIn& sin) { return Copy( sin ); } bool operator==(const SockAddrIn& sin) { return IsEqual( sin ); } bool operator!=(const SockAddrIn& sin) { return !IsEqual( sin ); } bool operator<(const SockAddrIn& sin) { return IsLower( sin ); } bool operator>(const SockAddrIn& sin) { return IsGreater( sin ); } bool operator<=(const SockAddrIn& sin) { return !IsGreater( sin ); } bool operator>=(const SockAddrIn& sin) { return !IsLower( sin ); } operator LPSOCKADDR() { return (LPSOCKADDR)(this); } size_t Size() const { return sizeof(SOCKADDR_IN); } void SetAddr(SOCKADDR_IN* psin) { memcpy(this, psin, Size()); } }; typedef std::list CSockAddrList; class CSocketComm { public: CSocketComm(); virtual ~CSocketComm(); bool IsOpen() const; // Is Socket valid? bool IsStart() const; // Is Thread started? bool IsServer() const; // Is running in server mode bool IsBroadcast() const; // Is UDP Broadcast active bool IsSmartAddressing() const; // Is Smart Addressing mode support SOCKET GetSocket() const; // return socket handle void SetServerState(bool bServer); // Run as server mode if true void SetSmartAddressing(bool bSmartAddressing); // Set Smart addressing mode bool GetSockName(SockAddrIn& saddr_in); // Get Socket name - address bool GetPeerName(SockAddrIn& saddr_in); // Get Peer Socket name - address void AddToList(const SockAddrIn& saddr_in); // Add an address to the list void RemoveFromList(const SockAddrIn& saddr_in); // Remove an address from the list void CloseComm(); // Close Socket bool WatchComm(); // Start Socket thread void StopComm(); // Stop Socket thread // Create a Socket - Server side bool CreateSocket(LPCTSTR strServiceName, int nProtocol, int nType, UINT uOptions = 0); // Create a socket, connect to (Client side) bool ConnectTo(LPCTSTR strDestination, LPCTSTR strServiceName, int nProtocol, int nType); // Event function - override to get data virtual void OnDataReceived(const LPBYTE lpBuffer, DWORD dwCount); virtual void OnEvent(UINT uEvent); // Run function - override to implement a new behaviour virtual void Run(); // Data function DWORD ReadComm(LPBYTE lpBuffer, DWORD dwSize, DWORD dwTimeout); DWORD WriteComm(const LPBYTE lpBuffer, DWORD dwCount, DWORD dwTimeout); // Utility functions static SOCKET WaitForConnection(SOCKET sock); // Wait For a new connection (Server side) static bool ShutdownConnection(SOCKET sock); // Shutdown a connection static USHORT GetPortNumber( LPCTSTR strServiceName ); // Get service port number static ULONG GetIPAddress( LPCTSTR strHostName ); // Get IP address of a host static bool GetLocalName(LPTSTR strName, UINT nSize); // GetLocalName static bool GetLocalAddress(LPTSTR strAddress, UINT nSize); // GetLocalAddress // SocketComm - data protected: HANDLE m_hComm; // Serial Comm handle HANDLE m_hThread; // Thread Comm handle bool m_bServer; // Server mode (true) bool m_bSmartAddressing; // Smart Addressing mode (true) - many listeners bool m_bBroadcast; // Broadcast mode CSockAddrList m_AddrList; // Connection address list for broadcast HANDLE m_hMutex; // Mutex object // SocketComm - function protected: // Synchronization function void LockList(); // Lock the object void UnlockList(); // Unlock the object static UINT WINAPI SocketThreadProc(LPVOID pParam); private: }; #endif // _SOCKETCOMM_H_