/*++ Copyright (c) 1998, Microsoft Corporation Module Name: socket.h Abstract: This module contains declarations for socket-management. The routines declared here operate asynchronously on sockets associated with an I/O completion port. They are also integrated with the component-reference object, which may optionally be used by callers to control the number of outstanding entries into a component's address-space. (See 'COMPREF.H'.) Author: Abolade Gbadegesin (aboladeg) 2-Mar-1998 Revision History: Abolade Gbadegesin (aboladeg) 23-May-1999 Added support for stream sockets. --*/ #ifndef _NATHLP_SOCKET_H_ #define _NATHLP_SOCKET_H_ #define INET_NTOA(x) inet_ntoa(*(struct in_addr*)&(x)) // // BOOLEAN // NhIsFatalSocketError( // ULONG Error // ); // // Determines whether a request may be reissued on a socket, // given the error-code from the previous issuance of the request. // This macro is arranged to branch on the most common error-codes first. // #define \ NhIsFatalSocketError( \ _Error \ ) \ ((_Error) != ERROR_OPERATION_ABORTED && \ ((_Error) == WSAEDISCON || \ (_Error) == WSAECONNRESET || \ (_Error) == WSAETIMEDOUT || \ (_Error) == WSAENETDOWN || \ (_Error) == WSAENOTSOCK || \ (_Error) == WSAESHUTDOWN || \ (_Error) == WSAECONNABORTED)) typedef class _CNhSock : public virtual GENERIC_NODE { public: _CNhSock(); _CNhSock(SOCKET iSocket); ~_CNhSock(); void ComponentCleanUpRoutine(void); virtual void StopSync(void); virtual PCHAR GetObjectName() { return ObjectNamep;} SOCKET GetSock() { return Socket;}; VOID SetSock(SOCKET inSock) { Socket = inSock;}; ULONG NhAcceptStreamSocket( PCOMPONENT_SYNC Component, class _CNhSock * AcceptedSocketp OPTIONAL, PNH_BUFFER Bufferp OPTIONAL, PNH_COMPLETION_ROUTINE AcceptCompletionRoutine, PVOID Context, PVOID Context2 ); ULONG NhConnectStreamSocket( PCOMPONENT_SYNC Component, ULONG Address, USHORT Port, PNH_BUFFER Bufferp OPTIONAL, PNH_COMPLETION_ROUTINE ConnectCompletionRoutine, PNH_COMPLETION_ROUTINE CloseNotificationRoutine OPTIONAL, PVOID Context, PVOID Context2 ); ULONG NhCreateDatagramSocket( ULONG Address, USHORT Port, OUT SOCKET* Socketp ); ULONG NhCreateStreamSocket( ULONG Address OPTIONAL, // may be INADDR_NONE USHORT Port OPTIONAL, OUT SOCKET* Socketp ); #define NhDeleteDatagramSocket(s) NhDeleteSocket(s) #define NhDeleteStreamSocket(s) NhDeleteSocket(s) VOID NhDeleteSocket( SOCKET Socket ); VOID NhDeleteSocket() \ {if (this->Socket != INVALID_SOCKET) {closesocket(this->Socket);};} ULONG NhNotifyOnCloseStreamSocket( PCOMPONENT_SYNC Component, PNH_BUFFER Bufferp OPTIONAL, PNH_COMPLETION_ROUTINE CloseNotificationRoutine, PVOID Context, PVOID Context2 ); VOID NhQueryAcceptEndpoints( PUCHAR AcceptBuffer, PULONG LocalAddress OPTIONAL, PUSHORT LocalPort OPTIONAL, PULONG RemoteAddress OPTIONAL, PUSHORT RemotePort OPTIONAL ); ULONG NhQueryAddressSocket(); ULONG NhQueryLocalEndpointSocket( PULONG Address OPTIONAL, PUSHORT Port OPTIONAL ); USHORT NhQueryPortSocket(); ULONG NhQueryRemoteEndpointSocket( PULONG Address OPTIONAL, PUSHORT Port OPTIONAL ); ULONG NhReadDatagramSocket( PCOMPONENT_SYNC Component, PNH_BUFFER Bufferp OPTIONAL, PNH_COMPLETION_ROUTINE CompletionRoutine, PVOID Context, PVOID Context2 ); ULONG NhReadStreamSocket( PCOMPONENT_SYNC Component, PNH_BUFFER Bufferp OPTIONAL, ULONG Length, ULONG Offset, PNH_COMPLETION_ROUTINE CompletionRoutine, PVOID Context, PVOID Context2 ); ULONG NhWriteDatagramSocket( PCOMPONENT_SYNC Component, ULONG Address, USHORT Port, PNH_BUFFER Bufferp, ULONG Length, PNH_COMPLETION_ROUTINE CompletionRoutine, PVOID Context, PVOID Context2 ); ULONG NhWriteStreamSocket( PCOMPONENT_SYNC Component, PNH_BUFFER Bufferp, ULONG Length, ULONG Offset, PNH_COMPLETION_ROUTINE CompletionRoutine, PVOID Context, PVOID Context2 ); static VOID NTAPI NhpConnectOrCloseCallbackRoutine( PVOID Context, BOOLEAN WaitCompleted ); static VOID NTAPI NhpCloseNotificationCallbackRoutine( PVOID Context, BOOLEAN WaitCompleted ); static VOID WINAPI NhpIoCompletionRoutine( ULONG ErrorCode, ULONG BytesTransferred, LPOVERLAPPED Overlapped ); static VOID APIENTRY NhpIoWorkerRoutine( PVOID Context ); protected: SOCKET Socket; static const PCHAR ObjectNamep; // For Shared Sockets we should have ShareCounter } CNhSock, *PCNhSock; // // Utility functions // ULONG InterfaceForDestination(ULONG DestIp); #endif // _NATHLP_SOCKET_H_