www.pudn.com > NetPaw.rar > IocpSocket.h


// SocketNT.h: prototypes for the CIocpSocket class. 
// 
// Written by Robert Simpson (robert@blackcastlesoft.com) 
// Created 5/11/2004 
// Version 1.0 -- Last Modified 05/20/2004 
// See SocketNT.cpp for details of this revision 
////////////////////////////////////////////////////////////////////// 
 
#pragma once 
 
#pragma comment(lib,"ws2_32.lib") 
 
#include "async.h" 
#include  
#include  
 
class CIocpSocket : public CEventSource 
{ 
public: // Specialization callbacks 
	class CAcceptCallback  : public CEventCallback {public: CAcceptCallback(CIocpSocket& src, ASYNCCALLBACK pfn = NULL) throw() : CEventCallback(&src, (pfn == NULL) ? _OnAcceptOrConnect:pfn) {}}; 
	class CReceiveCallback : public CEventCallback {public: CReceiveCallback(CIocpSocket& src, ASYNCCALLBACK pfn = NULL) throw() : CEventCallback(&src, (pfn == NULL) ? _OnRecv:pfn) {}}; 
	class CSendCallback    : public CEventCallback {public: CSendCallback(CIocpSocket& src, ASYNCCALLBACK pfn = NULL) throw() : CEventCallback(&src, (pfn == NULL) ? _OnSend:pfn) {}}; 
 
public: // Construction/Destruction 
	CIocpSocket (void) throw(); 
	CIocpSocket (const CIocpSocket& src, SOCKET s = INVALID_SOCKET) throw(); 
	~CIocpSocket(void) throw(); 
 
protected: 
	/* Class members to hold information 
		about the current socket type */ 
	INT   m_af; 
	INT   m_type; 
	INT   m_proto; 
	GROUP m_g; 
	DWORD m_dwFlags; 
	WSAPROTOCOL_INFO   m_wpi; 
	LPWSAPROTOCOL_INFO m_pwpi; 
 
	LPFN_ACCEPTEX  m_fnAcceptEx;  // Pointer to the AcceptEx winsock function 
	LPFN_CONNECTEX m_fnConnectEx; // Pointer to the ConnectEx winsock function 
 
	// Socket we're wrapping 
	volatile SOCKET m_hSocket; 
 
	// Built-in overlapped I/O support variables 
	CAcceptCallback  *m_pcAccept; 
	CReceiveCallback *m_pcRead; 
	CSendCallback    *m_pcWrite; 
 
	// Placeholders when RecvFrom is called and we're using our built-in overlapped struct 
	SOCKADDR m_addrFrom; 
	INT      m_addrFromLen; 
 
	// Internal buffer placeholders for using built-in overlapped classes 
	WSABUF   m_bufRecv; 
	WSABUF   m_bufSend; 
 
public: // Overridables 
	virtual void OnAccept(BOOL bSuccess, SOCKET s, CEventCallback *pc) throw(); 
	virtual void OnConnect(BOOL bSuccess, CEventCallback *pc) throw(); 
	virtual void OnReceive(BOOL bSuccess, LPWSABUF pBuf, DWORD dwBuffers, DWORD dwBytesRecvd, DWORD dwFlags, CEventCallback *pc) throw(); 
	virtual void OnReceiveFrom(BOOL bSuccess, LPWSABUF pBuf, DWORD dwBuffers, DWORD dwBytesRecvd, DWORD dwFlags, LPSOCKADDR pAddrFrom, INT nFromLen, CEventCallback *pc) throw(); 
	virtual void OnSend(BOOL bSuccess, LPWSABUF pBuf, DWORD dwBuffers, DWORD dwBytesSent, CEventCallback *pc) throw(); 
 
public: 
	operator SOCKET(void) const throw(); 
 
	BOOL Create(SOCKET s = INVALID_SOCKET, INT af = AF_INET, INT type = SOCK_STREAM, INT proto = IPPROTO_TCP, LPWSAPROTOCOL_INFO lpProtoInfo = NULL, GROUP g = 0, DWORD dwFlags = WSA_FLAG_OVERLAPPED) throw(); 
	BOOL Bind(WORD wPort = 0, LPCTSTR szAddress = NULL) throw(); 
	INT  Listen(INT nBacklog = 100) throw(); 
	void Close(void) throw(); 
	BOOL IsActive(void); 
 
	BOOL Connect(LPCTSTR pszHostAddress, UINT nPort, BOOL bOverlapped = TRUE, CEventCallback *pcb = NULL) throw(); 
	BOOL Connect(LPSOCKADDR pAddrTo, INT nToLen, BOOL bOverlapped = TRUE, CEventCallback *pcb = NULL) throw(); 
	BOOL Accept(SOCKET *psockConn = NULL, BOOL bOverlapped = TRUE, CEventCallback *pcb = NULL) throw(); 
 
	BOOL Send(LPWSABUF pBuffers, DWORD dwBuffCount, LPDWORD pdwBytesSent, DWORD dwFlags, CEventCallback *pcb) throw(); 
	BOOL Receive(LPWSABUF pBuffers, DWORD dwBuffCount, LPDWORD pdwBytesRecvd, LPDWORD pdwFlags, CEventCallback *pcb) throw(); 
 
	BOOL Send(LPBYTE pvBuffer, DWORD dwBuffSize, LPDWORD pdwBytesSent, DWORD dwFlags = 0, BOOL bOverlapped = TRUE) throw(); 
	BOOL Receive(LPBYTE pvBuffer, DWORD dwBuffSize, LPDWORD pdwBytesRecvd, LPDWORD pdwFlags, BOOL bOverlapped = TRUE) throw(); 
 
	BOOL SendTo(LPBYTE pvBuffer, DWORD dwBuffSize, LPSOCKADDR pAddrTo, INT nAddrToLen, LPDWORD pdwBytesSent, DWORD dwFlags, BOOL bOverlapped = TRUE) throw(); 
	BOOL ReceiveFrom(LPBYTE pvBuffer, DWORD dwBuffSize, LPDWORD pdwBytesRecvd, LPDWORD pdwFlags, LPSOCKADDR pAddrFrom = NULL, LPINT piFromLen = NULL, BOOL bOverlapped = TRUE) throw(); 
 
	BOOL SendTo(LPWSABUF pBuffers, DWORD dwBuffCount, LPSOCKADDR pAddrTo, INT nAddrToLen, LPDWORD pdwBytesSent, DWORD dwFlags, CEventCallback *pcb) throw(); 
	BOOL ReceiveFrom(LPWSABUF pBuffers, DWORD dwBuffCount, LPDWORD pdwBytesRecvd, LPDWORD pdwFlags, LPSOCKADDR pAddrFrom, LPINT piFromLen, CEventCallback * pcb) throw(); 
 
private: // Static callbacks 
	static void CALLBACK _OnAcceptOrConnect(CEventSource *pvThis, LPVOID pvSocket, LPVOID /* pvUnused */, LPVOID /* pvUnused */, LPVOID /* pvUnused */, CEventCallback *pc) throw(); 
	static void CALLBACK _OnRecv(CEventSource *pvThis, LPVOID pvBuffer, LPVOID pvdwBuffers, LPVOID pvAddrFrom, LPVOID piFromLen, CEventCallback *pc) throw(); 
	static void CALLBACK _OnSend(CEventSource *pvThis, LPVOID pvBuffer, LPVOID pvdwBuffers, LPVOID /* pvUnused */, LPVOID /* pvUnused */, CEventCallback *pc) throw(); 
	static void CALLBACK _OnFakeConnectEx(CEventSource *pvThis, LPVOID pvcbUser, LPVOID pvSocket, LPVOID pvAddrTo, LPVOID piToLen, CEventCallback *pc) throw(); 
 
	// Fake ConnectEx for pre-XP OS's 
	static BOOL WINAPI _FakeConnectEx(SOCKET s, const struct sockaddr * pAddrTo, INT nAddrToLen, LPVOID pvSendBuffer, DWORD dwSendDataLen, LPDWORD pdwBytesSent, LPOVERLAPPED pOverlapped) throw(); 
 
	// WSAIoctl() functions 
	void GetAcceptEx(void) throw(); 
	void GetConnectEx(void) throw(); 
};