?? blocksock2.h
字號:
// blocksock.h
typedef const struct sockaddr* LPCSOCKADDR;
//CSockAddress和CMyBlockSocketException輔助類
//CMyBlockSocketException異常類
//所有CMyBlockSocket函數(shù)在WinSock返回錯誤時都會陷入異常,產(chǎn)生一個CMyBlockException對象
//CMyBlockException類從MFC的CException類派生,并重載了GetErrorMessage()函數(shù),它給出了
//WinSock錯誤號和陷入異常時CMyBlockSocket提供的字符串
/*class CMyBlockSocketException : public CException
{
DECLARE_DYNAMIC(CMyBlockSocketException)
public:
// 構(gòu)造函數(shù)
CMyBlockSocketException(char* pchMessage);
public:
~CMyBlockSocketException() {}
virtual BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,
PUINT pnHelpContext = NULL);
private:
int m_nError;
CString m_strMessage;
};*/
//CSockAddress從sockaddr_in結(jié)構(gòu)體派生,用來處理和套接字相關的操作
class CSocketAddress : public sockaddr_in
{
public:
// 構(gòu)造函數(shù)
CSocketAddress()
{ sin_family = AF_INET;
sin_port = 0;
sin_addr.s_addr = 0; } // 缺省值
CSocketAddress(const SOCKADDR& sa)
{ memcpy(this, &sa, sizeof(SOCKADDR)); }
CSocketAddress(const SOCKADDR_IN& sin)
{ memcpy(this, &sin, sizeof(SOCKADDR_IN)); }
CSocketAddress(const ULONG ulAddr, const USHORT ushPort = 0)
//參數(shù)是主機的字節(jié)順序
{ sin_family = AF_INET;
sin_port = htons(ushPort);
sin_addr.s_addr = htonl(ulAddr); }
CSocketAddress(const char* pchIP, const USHORT ushPort = 0)
//帶點的十進制格式的IP地址
{ sin_family = AF_INET;
sin_port = htons(ushPort);
sin_addr.s_addr = inet_addr(pchIP); } //網(wǎng)絡字節(jié)順序
//以帶點的十進制格式返回地址
CString DottedDecimal()
{ return inet_ntoa(sin_addr); }
//獲得端口和地址
USHORT Port() const
{ return ntohs(sin_port); }
ULONG IPAddr() const
{ return ntohl(sin_addr.s_addr); }
//對操作符重載,以提高效率
const CSocketAddress& operator=(const SOCKADDR& sa)
{ memcpy(this, &sa, sizeof(SOCKADDR));
return *this; }
const CSocketAddress& operator=(const SOCKADDR_IN& sin)
{ memcpy(this, &sin, sizeof(SOCKADDR_IN));
return *this; }
operator SOCKADDR()
{ return *((LPSOCKADDR) this); }
operator LPSOCKADDR()
{ return (LPSOCKADDR) this; }
operator LPSOCKADDR_IN()
{ return (LPSOCKADDR_IN) this; }
};
//自定義套接字類,支持阻塞模式處理
class CMyBlockSocket : public CObject
{
DECLARE_DYNAMIC(CMyBlockSocket)
public:
SOCKET m_hSocket;
CMyBlockSocket() { m_hSocket = NULL; }
void Cleanup();
void Create(int nType = SOCK_STREAM);
void Close();
void Bind(LPCSOCKADDR psa);
void Listen();
void Connect(LPCSOCKADDR psa);
BOOL Accept(CMyBlockSocket& s, LPSOCKADDR psa);
int Send(const char* pch, const int nSize, const int nSecs);
int Write(const char* pch, const int nSize, const int nSecs);
int Receive(char* pch, const int nSize, const int nSecs);
int SendDatagram(const char* pch, const int nSize, LPCSOCKADDR psa,
const int nSecs);
int ReceiveDatagram(char* pch, const int nSize, LPSOCKADDR psa,
const int nSecs);
void GetPeerAddr(LPSOCKADDR psa);
void GetSockAddr(LPSOCKADDR psa);
static CSocketAddress GetHostByName(const char* pchName,
const USHORT ushPort = 0);
static const char* GetHostByAddr(LPCSOCKADDR psa);
operator SOCKET()
{ return m_hSocket; }
};
//CMyHttpBlockSocket繼承CMyBlockSocket,加入緩沖區(qū)機制,對數(shù)據(jù)進行處理
class CMyHttpBlockSocket : public CMyBlockSocket
{
public:
DECLARE_DYNAMIC(CMyHttpBlockSocket)
enum {nSizeRecv = 1000}; //最大接收緩沖區(qū)的大小(>HTTP頭信息的長度)
CMyHttpBlockSocket();
~CMyHttpBlockSocket();
int ReadHttpHeaderLine(char* pch, const int nSize, const int nSecs);
int ReadHttpResponse(char* pch, const int nSize, const int nSecs);
private:
char* m_pReadBuf; // 讀取緩沖區(qū)
int m_nReadBuf; // 讀取緩沖區(qū)中的字節(jié)數(shù)
};
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -