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(); };