sockets. memory leak
От: Agygy Украина  
Дата: 24.03.04 18:00
Оценка:
for(int j=0; j<100; j++)
{
CSocket s;
s.Create();
if (s.Connect("localhost", 21))
{
s.Send("12345", 5);
}
}

после такого цикла программа занимает больше места
OS : WinProf, 3 SP

13.02.06 08:48: Перенесено модератором из 'Сети, сокеты, протоколы' — Odi$$ey
Re: sockets. memory leak
От: Michael Chelnokov Украина  
Дата: 25.03.04 15:19
Оценка:
Здравствуйте, Agygy, Вы писали:

A>for(int j=0; j<100; j++)

A>{
A> CSocket s;
A> s.Create();
A> if (s.Connect("localhost", 21))
A> {
A> s.Send("12345", 5);
A> }
s.Close();
A>}
Re[2]: sockets. memory leak
От: remark Россия http://www.1024cores.net/
Дата: 08.07.05 15:15
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

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


A>>for(int j=0; j<100; j++)

A>>{
A>> CSocket s;
A>> s.Create();
A>> if (s.Connect("localhost", 21))
A>> {
A>> s.Send("12345", 5);
A>> }
MC>s.Close();
A>>}

А на WinXP sp2 с mfc71 это не поможет!
День искал, почему у тестировщика на машине память утекает, а у меня всё нормально. В итоге обнаружил интересную вещь.
Если выполнить такой фрагмент

AfxSocketInit();

for (int i = 0; i < 10000; ++i)
{
    CSocket sock;
    sock.Create();
    sock.Close();
}


Программа сьедает 12Мб (!) памяти. На Win2k работает нормально.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: sockets. memory leak
От: Игoрь Украина  
Дата: 08.07.05 18:59
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, Michael Chelnokov, Вы писали:


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


A>>>for(int j=0; j<100; j++)

A>>>{
A>>> CSocket s;
A>>> s.Create();
A>>> if (s.Connect("localhost", 21))
A>>> {
A>>> s.Send("12345", 5);
A>>> }
MC>>s.Close();
A>>>}

R>А на WinXP sp2 с mfc71 это не поможет!

R>День искал, почему у тестировщика на машине память утекает, а у меня всё нормально. В итоге обнаружил интересную вещь.
R>Если выполнить такой фрагмент

R>
R>AfxSocketInit();

R>for (int i = 0; i < 10000; ++i)
R>{
R>    CSocket sock;
R>    sock.Create();
R>    sock.Close();
R>}
R>


R>Программа сьедает 12Мб (!) памяти. На Win2k работает нормально.

R>
R>
R>

Стандартный совет: не используйте MFC-шные сокеты. Я не знаю сколько человек должен был выпить накануне,
чтобы написать такую херню как CSocket и CAsyncSocket.

Теперь по поводу утечки. Это естественно MFC-шная бага, обойти ее можно созданием дополнительного сокета в начале
работы приложения и пусть себе висит все время работы.
Re[4]: sockets. memory leak
От: remark Россия http://www.1024cores.net/
Дата: 11.07.05 07:35
Оценка:
Здравствуйте, Игoрь, Вы писали:

R>>А на WinXP sp2 с mfc71 это не поможет!

R>>День искал, почему у тестировщика на машине память утекает, а у меня всё нормально. В итоге обнаружил интересную вещь.
R>>Если выполнить такой фрагмент

R>>R>>AfxSocketInit();


R>>for (int i = 0; i < 10000; ++i)

R>>{
R>> CSocket sock;
R>> sock.Create();
R>> sock.Close();
R>>}
R>>



R>>Программа сьедает 12Мб (!) памяти. На Win2k работает нормально.

R>>
R>>
R>>

И>Стандартный совет: не используйте MFC-шные сокеты. Я не знаю сколько человек должен был выпить накануне,

И>чтобы написать такую херню как CSocket и CAsyncSocket.

И>Теперь по поводу утечки. Это естественно MFC-шная бага, обойти ее можно созданием дополнительного сокета в начале

И>работы приложения и пусть себе висит все время работы.

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

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

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

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: sockets. memory leak
От: remark Россия http://www.1024cores.net/
Дата: 11.07.05 07:38
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

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


A>>for(int j=0; j<100; j++)

A>>{
A>> CSocket s;
A>> s.Create();
A>> if (s.Connect("localhost", 21))
A>> {
A>> s.Send("12345", 5);
A>> }
MC>s.Close();
A>>}


The socket object's destructor calls Close for you


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
CSocket memory leak
От: Игoрь Украина  
Дата: 11.07.05 08:19
Оценка: -1
#Имя: FAQ.mfc.csocket.memoryleak
Здравствуйте, 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 — за это нужно бить очень сильно и очень больно.
Re: CSocket memory leak
От: LordAhriman  
Дата: 14.02.06 13:33
Оценка:
И>Да вы что, какое серверное приложение!!! Я вообще говорил про клиентские приложения!!!
И>А в серверных использовать CSocket — за это нужно бить очень сильно и очень больно.
Присоединяюсьь полностью. Это же как нужно написать сервер, чтобы С ЭТИМ работало? Ж-)))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.