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
Здравствуйте, 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 работает нормально.
Здравствуйте, 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-шная бага, обойти ее можно созданием дополнительного сокета в начале
работы приложения и пусть себе висит все время работы.
Здравствуйте, 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
Здравствуйте, 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 — за это нужно бить очень сильно и очень больно.
И>Да вы что, какое серверное приложение!!! Я вообще говорил про клиентские приложения!!!
И>А в серверных использовать CSocket — за это нужно бить очень сильно и очень больно.
Присоединяюсьь полностью. Это же как нужно написать сервер, чтобы С ЭТИМ работало? Ж-)))