?? iocpmodesvr.h
字號:
// IocpModeSvr.h: interface for the CIocpModeSvr class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_IOCPMODESVR_H__46FFF420_23C3_4356_A88D_AEBDA61EA186__INCLUDED_)
#define AFX_IOCPMODESVR_H__46FFF420_23C3_4356_A88D_AEBDA61EA186__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <list>
#include <afxtempl.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
/***************************************************************************************
文件名:IocpModeSvr.h
類名:CIocpModeSvr
類說明:本類是一個完成端口模型的網絡服務器引擎
運行平臺:WinNT3.5以上版本、Windows2000
輸入接口說明:本類接收一個回調函數地址,該函數具有如下原型
void _stdcall ProcessRecvData(unsigned long sIP,
SOCKET sClient,
char * pData,
unsigned long DataLength);
此回調函數用來接收從客戶端發來的數據或者某客戶端斷開連接的通知(有始有終)
unsigned long sIP : 表示數據通知的客戶端IP地址
SOCKET sClient :服務器用于和客戶端通迅的套接字,
如果不是斷開連接消息,
則您可使用此參數調用SendMsg向客戶端發送數據
char * pData : 本次操作的數據
unsigned long DataLength :本次操作數據的數據長度
提示:如果pData==NULL 并且DataLength 則表示那是客戶端斷開連接的消息,
請針對業務做處理吧。
輸出接口說明:
引擎初始化函數,第一參為回調地址(必須正確填寫),第二參為服務端口號
初始化成功返回真,否則返回假
bool Init(ProcessRecvData* pProcessRecvData,unsigned long iSvrPort=SVRPORT);
引擎反初始化函數,請在程序退出時調用,或者在程序需要重新啟動服務時調用
void UnInit();
以下在關于發送消息函數組的接口說明
1、向目標IP客戶端發送數據,
第一參為目標客戶端IP,
第二參為數據區地址,
第三參為數據區長度
成功"提交"返回真,否則返回假,
那可能是因為客戶端已經斷開或者根本就沒有連接。
bool SendMsg(LPCTSTR TargetIp,char * pData,unsigned long Length);
2、向目標套接字發送數據
第一參為客戶端套接字
第二參為數據區地址
第三參為數據區長度
成功"提交"返回真,否則返回假
那可能是因為客戶端已經斷開連接
提示:此函數為不需要檢索的發送數據函數,具有高效率的特性。
你可以在你的數據通知回調中以第二參的sClient直接填寫于
第一參中發送數據,如果你在接收到數據時需要回傳消息,請
使用此函數
成功"提交"返回真,否則返回假
bool SendMsg(SOCKET sClient,char * pData,unsigned long Length);
3、向所有連線客戶端發送數據
發送數據到所有已經正確連線的客戶端
第一參為數據區地址
第二參為數據區長度
成功"提交"返回真,否則返回假
大部分情況下都會返回真 ^_^
bool SendMsgToAll(char * pData,unsigned long Length);
4、向除了某個IP外的其它所有在線客戶端發送數據
第一參為除外的IP
第二參為數據區地址,
第三參為數據區長度,
成功"提交"返回真,否則返回假
大部分情況下都會返回真
bool SendMsgToOther(LPCTSTR SourceIp,char* pData,unsigned long Length);
5、向除了某個Socket久的其它所有在線客戶端發送數據
第一參為除外的Socket
第二參為數據區地址
第三參為數據區長度
成功"提交"返回真,否則返回假
大部分情況下都會返回真
bool SendMsgToOther(SOCKET ExceptSocket,char * pData,unsigned long Length);
附助函數組1
1、const char * GetLocalIpAdd()
返回本地Ip地址,返回值為點分十進制的字符串
2、unsigned short GetSvrPort()
返回服務使用的偵聽端口號
附助函數助2
1、bool DisConnectClient(LPCTSTR ClientIp);
切斷參數中指定的IP的客戶端的連接,成功返回真,否則返回假。
2、bool DisConnectClient(SOCKET sClient);
切斷參數中指定的客戶機的連接,參數中指定了要切斷了套接口。
3、void DisConnectAll();
切斷所有客戶機的連接。
編寫者:楊飛 qq:5535833
編寫時間:2004年12月20日
修改記錄:--------------------------------------------------------------------------
1、
--------------------------------------------------------------------------
2、
--------------------------------------------------------------------------
***************************************************************************************/
//服務端口
#define SVRPORT 10012
//緩沖區大小
#define BUFFER_SIZE 4096
//接收數據
#define RECV_POSTED 0
//發送數據
#define SEND_POSTED 1
//單句柄數據
typedef struct _PER_HANDLE_DATA
{
unsigned long IpAddr;
SOCKET sClient;
}PER_HANDLE_DATA,*LPPER_HANDLE_DATA;
//IO操作數據
typedef struct _PER_IO_OPERATION_DATA
{
//重疊結構
OVERLAPPED OverLapped;
//數據緩沖區
WSABUF RecvDataBuf;
WSABUF SendDataBuf;
char RecvBuf[BUFFER_SIZE];
char SendBuf[BUFFER_SIZE];
//操作類型表示
bool OperType;
}PER_IO_OPERATION_DATA,*PPER_IO_OPERATION_DATA;
//回調處理數據函數原型
typedef void __stdcall ProcessRecvData(unsigned long sIP,
SOCKET sClient,
char * pData,
unsigned long DataLength);
DWORD WINAPI ServerWorkerProc(LPVOID lParam);
DWORD WINAPI ListenProc(LPVOID lParam);
class CIocpModeSvr
{
public:
CIocpModeSvr();
virtual ~CIocpModeSvr();
public:
//初始化
bool Init(ProcessRecvData* pProcessRecvData,unsigned long iSvrPort=SVRPORT);
//反初始化
void UnInit();
/* 用于發送消息的函數組*/
public:
bool SendMsg(LPCTSTR TargetIp,char * pData,unsigned long Length);
bool SendMsg(SOCKET sClient,char * pData,unsigned long Length);
bool SendMsgToAll(char * pData,unsigned long Length);
bool SendMsgToOther(LPCTSTR ExceptIp,char* pData,unsigned long Length);
bool SendMsgToOther(SOCKET ExceptSocket,char * pData,unsigned long Length);
public:
//獲得本地Ip地址
const char * GetLocalIpAdd(){
if(IsStart)return HostIpAddr.c_str();
else return NULL;
}
//獲得服務器使用的端口號
unsigned short GetSvrPort(){
if(IsStart)return m_SvrPort;
else return 0;
}
public:
bool DisConnectClient(LPCTSTR ClientIp);
bool DisConnectClient(SOCKET sClient);
void DisConnectAll();
protected:
int InitNetWork(unsigned int SvrPort=SVRPORT,
std::string *pHostIpAddress=NULL);
void WriteLogString(LPCTSTR strLog);
ProcessRecvData* m_pProcessRecvData;
private:
//完成句柄
HANDLE CompletionPort;
//主機IP
std::string HostIpAddr;
//客戶信息列表
CArray <PER_HANDLE_DATA,PER_HANDLE_DATA> ClientInfo;
//客戶信息臨界保護量
CRITICAL_SECTION cInfoSection;
//服務是否已經啟動
bool IsStart;
//偵聽端口
SOCKET ListenSocket;
//偵聽線程句柄,用于反初始化時銷毀偵聽線程
HANDLE ListenThreadHandle;
//服務端口記錄
unsigned short m_SvrPort;
friend DWORD WINAPI ServerWorkerProc(LPVOID lParam);
friend DWORD WINAPI ListenProc(LPVOID lParam);
};
#endif // !defined(AFX_IOCPMODESVR_H__46FFF420_23C3_4356_A88D_AEBDA61EA186__INCLUDED_)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -