60 lines
1.3 KiB
C
60 lines
1.3 KiB
C
|
#ifndef __iptel_gkutil_gkwsock_h
|
||
|
#define __iptel_gkutil_gkwsock_h
|
||
|
|
||
|
#define ASYNC_ACCEPT_BUFFER_SIZE 0x100
|
||
|
|
||
|
struct ASYNC_ACCEPT;
|
||
|
|
||
|
typedef void (*ASYNC_ACCEPT_FUNC)
|
||
|
(PVOID Context,
|
||
|
SOCKET ClientSocket,
|
||
|
SOCKADDR_IN * LocalAddress,
|
||
|
SOCKADDR_IN * RemoteAddress);
|
||
|
|
||
|
// if ClientSocket != INVALID_SOCKET, then there is an accept pending
|
||
|
// otherwise, no accept is pending.
|
||
|
struct ASYNC_ACCEPT :
|
||
|
public SIMPLE_CRITICAL_SECTION_BASE
|
||
|
{
|
||
|
private:
|
||
|
LONG ReferenceCount;
|
||
|
SOCKET AcceptSocket;
|
||
|
SOCKET ClientSocket;
|
||
|
BYTE ClientInfoBuffer [ASYNC_ACCEPT_BUFFER_SIZE];
|
||
|
DWORD ClientInfoBufferLength;
|
||
|
OVERLAPPED Overlapped;
|
||
|
ASYNC_ACCEPT_FUNC AcceptFunc;
|
||
|
PVOID AcceptFuncContext;
|
||
|
HANDLE StopNotifyEvent;
|
||
|
|
||
|
private:
|
||
|
|
||
|
HRESULT StartIoLocked (
|
||
|
IN SOCKADDR_IN * SocketAddress);
|
||
|
|
||
|
void IoComplete (DWORD, DWORD);
|
||
|
|
||
|
HRESULT IssueAccept (void);
|
||
|
|
||
|
static void IoCompletionCallback (DWORD, DWORD, LPOVERLAPPED);
|
||
|
|
||
|
public:
|
||
|
ASYNC_ACCEPT (void);
|
||
|
|
||
|
~ASYNC_ACCEPT (void);
|
||
|
|
||
|
HRESULT StartIo (
|
||
|
IN SOCKADDR_IN * SocketAddress,
|
||
|
IN ASYNC_ACCEPT_FUNC AcceptFunc,
|
||
|
IN PVOID Context);
|
||
|
|
||
|
HRESULT GetListenSocketAddress (
|
||
|
OUT SOCKADDR_IN * ReturnSocketAddress);
|
||
|
|
||
|
void StopWait (void);
|
||
|
|
||
|
void AddRef (void);
|
||
|
void Release (void);
|
||
|
};
|
||
|
|
||
|
#endif // __iptel_gkutil_gkwsock_h
|