Здравствуйте, remark, Вы писали:

R>Я бы и сам не стал вообще MFC использовать

R>Но проблема в том, что уже есть библиотечка, использующая CSocket. И надо юзать именно её. И всё вобщем то было хорошо, пока не провелили на XP

R>Вот ещё интересный момент: проверил на той же машине, но под другим пользователем (который не админ), запустил тот же самый exe-шник — память не утекает! Бред какой-то


Память "течет" в любом случае. Вот кусок кода из MFC:

void PASCAL CAsyncSocket::AttachHandle(
    SOCKET hSocket, CAsyncSocket* pSocket, BOOL bDead)
{
    .....
    .....
    
    ASSERT(CAsyncSocket::LookupHandle(hSocket, bDead) == NULL);
    if (pState->m_pmapSocketHandle->IsEmpty())
    {
        ASSERT(pState->m_pmapDeadSockets->IsEmpty());
        ASSERT(pState->m_hSocketWindow == NULL);

        CSocketWnd* pWnd = new CSocketWnd; //ТУТ!!!
        pWnd->m_hWnd = NULL;
        if (!pWnd->CreateEx(0, AfxRegisterWndClass(0),
        _T("Socket Notification Sink"),
            WS_OVERLAPPED, 0, 0, 0, 0, NULL, NULL))
        {
            TRACE(traceSocket, 0, "Warning: unable to create socket notify window!\n");
            AfxThrowResourceException();
        }
        ASSERT(pWnd->m_hWnd != NULL);
        ASSERT(CWnd::FromHandlePermanent(pWnd->m_hWnd) == pWnd);
        pState->m_hSocketWindow = pWnd->m_hWnd;
    }
    pState->m_pmapSocketHandle->SetAt((void*)hSocket, pSocket);
}


То есть, если мап пустой, то каждый раз создается новое окно... Соответственно мап никогда не должен быть пуст
Кстати, мап свой на каждый моток... поэтому на каждый поток нужно создавать свой фейковый сокет, вообщем бред полнейший...


R>А по поводу создания одного сокета в начале приложения: ИМХО для серверного приложения — это не очень хорошо. Для устойчивости лучше каждый раз новый соксет создавать и заново открывать соединение.


Да вы что, какое серверное приложение!!! Я вообще говорил про клиентские приложения!!!
А в серверных использовать CSocket — за это нужно бить очень сильно и очень больно.
Автор: Игoрь    Оценить