Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Ошибка WSARECV


Автор: Lexicss 14.9.2010, 14:51
Доброго времени суток.
С клиента подключаюсь к серверу. Соединение проходит, начинаю обмен и спустя 5-10 секунд на клиенте функция WSARecv выдаёт ошибку WSAENOBUFS(10055).  Вся работа с сокетами асинхронная.
описание ошибки: No buffer space available (Закончились буферы). Невозможно осуществить операцию с сокетом, поскольку системе не хватает буферного пространства или переполнена очередь. Это означает, что WinSock временно не хватает буфров. Это не должно вызывать проблем, если не продолжается долгое время.

Пробывал по возникновению этой ошибки повторно вызывать WSARecv - ошибка повторяется. Увеличивал буффер приёма сокета с 8-ми до 64 кБ - тоже не помогает. 
На клиенте стоит Win 2000 Server.
Почему такое возникает и как решить эту проблему?

Автор: Alca 14.9.2010, 15:30
Раздевайтесь, больной! Код показать не судьба?

Автор: Lexicss 14.9.2010, 15:36
Код

  function cRecv(boNew : boolean) : integer;
  var
    cnt, Flags : cardinal;
  begin
    if boNew //íîâûé ïðèåì
    then begin
      RecvCount := 0;
      RecvLen := 0;
    end;

    Flags := 0;
    Result := WSARecv(Sock, @RecvBuf, 1, cnt, Flags, @Recv_Ovp, nil);

    if Result <> 0
    then begin
      LanLastError := WSAGetLastError;
      if (LanLastError <> WSA_IO_PENDING)
      then begin  
        PostMessage(RAForm.Handle,wm_TraceProc,LanLastError,225);
        PutErr('Îøèáêà ïðè¸ìà(cRecv): ' + IntToStr(LanLastError));
        Result := CONNECT_ERROR;
        cSetLanState(stLan_ERecv);
        //cLanReset;
        Exit;
      end
      else begin  
        Result := 0;
      end;
    end;

  end; //cRecv

Result = -1, LanLastError = 10055;

Добавлено @ 15:43
переменная RecvBuf предварительно установлена:
Код

var   Buf                : array[0..65535-1] of byte;

   .....
  RecvBuf.len := 65535;
  RecvBuf.buf := @Buf;


Добавлено @ 15:47
Два года прога работает адекватно, именно на одном компьютере повела неожиданно, функция WSARecv выдаёт WSAENOBUFS.  
Т.е. пытаюсь выяснить что ещё предусмотреть чтобы обойти ситуацию с этой ошибкой и соединение не обрывалось.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)