Здравствуйте, TarasCo, Вы писали:
TC>Обычно пакет с window = ZeroWindow и флагом ACK действительно посылается при переполнении входного буфера для приостановки передачи. Но. Судя по значениям Seq и Ack = 1, данный пакет был послан сразу после установки соединения. Есть подозрение, что данное соединение установлено, но еще не принято сетевым приложением ( т.е не было вызова accept ), возможно приложение зависло. Также возможно, действуют какие то ограничения на кол-во устанавливаемых соединений в единицу времени. У вас виста не Home Edition? Третье предположение ( маловероятное ) — на висте работают кривые драйвера, которые расходуют NonPaged pool ( можно посмотреть соответствующее значение в диспетчере задач ).
Vista Enterprise.
невыгружаемая память не расходуется.
на счет повисания приложения сказать трудно. код, который принимает входящие соединения, выглядит так:
while(inst.m_Listening)
{
try
{
m_Socket->Listen();
SOCKET incomming = m_Socket->Accept();
if(incomming == INVALID_SOCKET)
continue;
CSocketPtr sp(new CSocket(incomming));
CMessageThread * thr = new CMessageThread(sp);
thr->DeleteWhenFinish(true);
thr->BeginThread();
}
catch(...)
{
}
}
return 0;
thr выполняет getpeername и потом overlapped прием 4 байт (WSARecv) кода операции, хотя шлются они большими пачками.
2 раза мне удалось поймать ее в дебаггере — оба раза приложение висело в аccept.