CSocketServer(
IAllocateStreamSockets &socketAllocator)
: m_readSeqencingFilter(socketAllocator)
{
...
CReadSequencingStreamSocketConnectionFilter::CReadSequencingStreamSocketConnectionFilter(
IProvideUserData &dataProvider)
: m_userDataIndex(dataProvider.RequestUserDataSlot(_T("CReadSequencingStreamSocketConnectionFilter"))),
m_pFilterManager(0)
{
}
The framework provides void CSocketServer::OnConnectionEstablished(
IStreamSocket &socket,
const IAddress &address)
{
Output(_T("OnConnectionEstablished"));
CPerConnectionData *pPerConnectionData = new CPerConnectionData(m_allocator);
socket.SetUserPointer(m_userDataIndex, pPerConnectionData);
m_pool.DispatchConnectionEstablished(socket, address);
}
void CSocketServer::OnSocketReleased(
IIndexedOpaqueUserData &userData)
{
Output(_T("OnSocketReleased"));
CPerConnectionData *pPerConnectionData = userData.GetUserPointer(m_userDataIndex);
delete pPerConnectionData;
m_pool.OnSocketReleased(userData);
}
If you're writing a CSmartStreamSocket CStreamSocketConnectionManager::SecureConnect(
const IFullAddress &address,
const void *pUserData)
{
return Connect(address, pUserData, reinterpret_cast<void*>(1));
}
...
void CStreamSocketConnectionManager::FilterConnect(
IFilterableStreamSocket &socket,
const IFullAddress & ,
const void * ,
const void *pFilterData,
FilterProcessing & )
{
const bool connectSecure = (1 == reinterpret_cast<int>(pFilterData));
if (m_pContext && connectSecure)
{
CAsyncSocketConnector *pConnector = new CAsyncSocketConnector(*m_pContext, m_verifyPeer, *this, m_bufferAllocator, socket);
pConnector->Connect();
pConnector->SetAuthContext(0);
socket.SetUserPointer(m_SSLConnectorIndex, pConnector);
}
}
If none of these options work for you, then you could hook into the socket allocator directly using void CStreamSocketConnectionManager::FilterReadCompleted(
IFilterableStreamSocket &socket,
IBuffer &buffer,
FilterProcessing &filterProcessing)
{
CAsyncSocketConnector *pConnector = socket.GetUserPointer(m_SSLConnectorIndex);
if (pConnector)
{
pConnector->ReadCompleted(buffer);
m_pFilterManager->RequestRead(socket, 0, *this);
filterProcessing = IFilterStreamSocketConnections::FilterOperationComplete;
}
}