?? socketcomm.h
字號(hào):
///////////////////////////////////////////////////////////////////////////////
// FILE : SocketComm.h
// Header file for CSocketComm class
// CSocketComm
// Generic class for Socket Communication
///////////////////////////////////////////////////////////////////////////////
#ifndef _SOCKETCOMM_H_
#define _SOCKETCOMM_H_
#include <list>
#include <stdlib.h>
#if(_WIN32_WINNT >= 0x0400)
#include <winsock2.h>
#include <mswsock.h>
#else
#include <winsock.h>
#endif /* _WIN32_WINNT >= 0x0400 */
#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 4000//lqy modfy 40-4000
struct SockAddrIn {
public:
SockAddrIn() { Clear(); }
SockAddrIn(const SockAddrIn& sin) { Copy( sin ); }
~SockAddrIn() { }
SockAddrIn& Copy(const SockAddrIn& sin);
void Clear() { memset(&sockAddrIn, 0, sizeof(sockAddrIn)); }
bool IsEqual(const SockAddrIn& sin);
bool IsGreater(const SockAddrIn& sin);
bool IsLower(const SockAddrIn& pm);
bool IsNull() const { return ((sockAddrIn.sin_addr.s_addr==0L)&&(sockAddrIn.sin_port==0)); }
ULONG GetIPAddr() const { return sockAddrIn.sin_addr.s_addr; }
short GetPort() const { return sockAddrIn.sin_port; }
bool CreateFrom(LPCTSTR sAddr, LPCTSTR sService);
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)(&sockAddrIn); }
size_t Size() const { return sizeof(sockAddrIn); }
void SetAddr(SOCKADDR_IN* psin) { memcpy(&sockAddrIn, psin, Size()); }
SOCKADDR_IN sockAddrIn;
};
typedef std::list<SockAddrIn> CSockAddrList;
class CSocketComm
{
public:
CSocketComm();
virtual ~CSocketComm();
bool IsOpen() const; // 判斷socket是否正確
bool IsStart() const; // 線程是否啟動(dòng)
bool IsServer() const; // 是否以服務(wù)器形式啟動(dòng)
bool IsBroadcast() const; // 是否允許UDP廣播
bool IsSmartAddressing() const; // Is Smart Addressing mode support
SOCKET GetSocket() const; // 返回socket句柄
void SetServerState(bool bServer); // 設(shè)定運(yùn)行模式是否為服務(wù)器模式
void SetSmartAddressing(bool bSmartAddressing); // Set Smart addressing mode
bool GetSockName(SockAddrIn& saddr_in); // 獲得socket名即地址
bool GetPeerName(SockAddrIn& saddr_in); // 獲得Peer Socket 名 - 地址
void AddToList(const SockAddrIn& saddr_in); //將地址增加到列表
void RemoveFromList(const SockAddrIn& saddr_in); // 從列表中刪除列表
void CloseComm(); // 關(guān)閉 Socket
bool WatchComm(); // 啟動(dòng) Socket 線程
void StopComm(); // 停止 Socket 線程
// 創(chuàng)建服務(wù)器端socket
bool CreateSocket(LPCTSTR strServiceName, int nProtocol, int nType, UINT uOptions = 0);
// 創(chuàng)建一個(gè)客戶端的socket
bool ConnectTo(LPCTSTR strDestination, LPCTSTR strServiceName, int nProtocol, int nType);
// 事件處理函數(shù) - 接收數(shù)據(jù)
virtual void OnDataReceived(const LPBYTE lpBuffer, DWORD dwCount);
virtual void OnEvent(UINT uEvent);
// 主線程函數(shù)
virtual void Run();
// 數(shù)據(jù)函數(shù)
DWORD ReadComm(LPBYTE lpBuffer, DWORD dwSize, DWORD dwTimeout);
DWORD WriteComm(const LPBYTE lpBuffer, DWORD dwCount, DWORD dwTimeout);
// Utility functions
static SOCKET WaitForConnection(SOCKET sock); // 等待新的連接
static bool ShutdownConnection(SOCKET sock); // 關(guān)閉連接
static USHORT GetPortNumber( LPCTSTR strServiceName ); // 獲得服務(wù)端口號(hào)
static ULONG GetIPAddress( LPCTSTR strHostName ); // 獲得主機(jī)IP地址
static bool GetLocalName(LPTSTR strName, UINT nSize); // 獲得機(jī)器名
static bool GetLocalAddress(LPTSTR strAddress, UINT nSize); // 獲得本地地址
// SocketComm - data
protected:
HANDLE m_hComm; // socket句柄
HANDLE m_hThread; // 線程句柄
bool m_bServer; // 為真表示服務(wù)器模式
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:
// 同步函數(shù)
void LockList(); // 鎖住對(duì)象
void UnlockList(); // 解開對(duì)象
static UINT WINAPI SocketThreadProc(LPVOID pParam);
private:
};
#endif // _SOCKETCOMM_H_
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -