#ifndef __IOCP_H_
#define __IOCP_H_

//////////////////////////////////////////////////////////////////////////

#include <winsock2.h>
#include <mswsock.h>

#include <windows.h>

#include "DataStruct.h"
#include "KeyList.h"
//////////////////////////////////////////////////////////////////////////

static 	GUID g_GUIDAcceptEx		 = WSAID_ACCEPTEX;
static  GUID g_GUIDTransmitFile  = WSAID_TRANSMITFILE;
static  GUID g_GUIDAcceptExaddrs = WSAID_GETACCEPTEXSOCKADDRS;
//////////////////////////////////////////////////////////////////////////


class CIOCP
{
public:
	CIOCP();
	virtual ~CIOCP();
public:
	CSmsCenterDlg *     m_pDlg;
	CKeyList            m_KeyList;
	//IO_GROUP			m_io_group;
	//KEY_GROUP			m_key_group;

	HANDLE              m_h_iocp;
	SOCKET              m_listen_socket;
	BOOL                m_bInitSocket;
	SOCKET              m_listen_socket2;
	BOOL                m_bInitSocket2;
	BOOL                m_bInit; //ÊÇ·ñÒѳõʼ»¯³É¹¦

	LPFN_TRANSMITFILE   lpTransmitFile;
	LPFN_ACCEPTEX       lpAcceptEx;
	LPFN_GETACCEPTEXSOCKADDRS  lpGetAcceptExSockAddrs;

	UINT                uPort;
	TCHAR                szAddress[32];
	
	int					m_n_thread_count;
	HANDLE              m_h_thread[MAXTHREAD_COUNT];
	HANDLE              m_h_accept_event;
	HANDLE              m_h_accept_event2;
	HANDLE              m_h_MainLoop;
	HANDLE              m_h_MainLoop2;
	BOOL                m_bQuit;

public:
	static DWORD WINAPI MainLoop2(LPVOID lp_param);
	void CheckForInvalidSQLConnection();
	void CheckForInvalidConnection();
	void InitIoContext_Send(IOCP_IO_SEND_PTR lp_io);
	void				Close();
	void SetDlg( CSmsCenterDlg * pDlg );
	long GetFrame_Cmpp(IOCP_IO_PTR lp_io);
	long GetFrame(IOCP_IO_PTR lp_io);
	BOOL RegAcceptEvent2();
	BOOL RegAcceptEvent();
	BOOL PostAcceptEx2();
	BOOL PostAcceptEx();
	void CloseOneSocket( SOCKET & socket );
	BOOL GetFunPointer();
	BOOL BindAndListenSocket2();
	BOOL BindAndListenSocket();
	void CloseMainSocket();
	BOOL				Init();
	static DWORD WINAPI		MainLoop(LPVOID lp_param);
private:
	void				InitIoContext(IOCP_IO_PTR lp_io);
	BOOL				DataAction(IOCP_IO_PTR lp_io,IOCP_KEY_PTR lp_key);
	BOOL				HandleData(IOCP_IO_PTR lp_io,IOCP_KEY_PTR lp_key,int nFlags);
	
	BOOL				StartThread();
	void				CloseThreadHandle( int count );
	BOOL				InitSocket();
	static DWORD WINAPI	CompletionRoutine(LPVOID lp_param);
	BOOL				GetAddrAndPort(char*buf,char ip[],UINT &port);
};

//////////////////////////////////////////////////////////////////////////

#endif	//__IOCP_H_