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


Автор: yogin 24.7.2012, 09:22
Приветствую!
Дело происходит в Delphi 2007.

создаю udp сокет:
Код

var
  i   : integer;
  ad  : TSockAddr;
  adLen : integer;
  NonBlockArg : integer;
...
  // создаём сокет
  fSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if fSocket = INVALID_SOCKET then
  begin
    DoEventError('ошибка при создании сокета: ' + suGetLastErrorString);
    Exit;
  end;
  // перевод сокета в неблокирующий режим
  NonBlockArg := 1;
  if ioctlsocket(fSocket, FIONBIO, NonBlockArg) = SOCKET_ERROR then
  begin
    closesocket(fSocket);
    DoEventError('ошибка при переводе сокета в неблокирующий режим: ' + suGetLastErrorString);
    Exit;
  end;
  // формируем адрес
  FillChar(ad.sin_zero, SizeOf(ad.sin_zero), 0);
  ad.sin_family := AF_INET;
  ad.sin_addr.S_addr := INADDR_ANY;
  ad.sin_port := 0;
  // привязываем сокет к адресу
  if bind(fSocket, ad, sizeof(ad)) = SOCKET_ERROR then
    Exit;

Затем передаю его в отдельную нить, где происходит чтение в цикле от таким образом:
Код

  // приём
  addrLen := sizeof(fAddrFrom);
  fRecvRes := recvfrom(fSocket, fRecvBuf[0], c_RECV_BUF_SIZE, 0, fAddrFrom, addrLen);
  if fRecvRes > 0 then
  begin // приём успешен
    SetLength(fRecvData, fRecvRes);
    move(fRecvBuf[0], fRecvData[0], fRecvRes);
    Synchronize(DoOnData);
  end // ошибка
  else if WSAGetLastError <> WSAEWOULDBLOCK then
  begin
    fErrStr := 'ошибка при получении данных: ' + suGetLastErrorString;
    fCmdStop := True;
    Synchronize(DoOnError);
  end;

Дак вот появляется в этом процессе ошибка, отличная от WSAEWOULDBLOCK. Текст этой ошибки такой: "Удаленный хост принудительно разорвал существующее подключение".
Что вопиюще для udp!
Заметка: как я заметил, ошибка возникает после того, как я произвожу попытку посылки датаграммы через этот сокет на адрес, который не доступен... Хотя не должно никак влиять на приём.
В чём же может быть дело?

Выяснил что это ошибка WSAECONNRESET. Что с этим делать? В других udp приложениях такого небыло... Игнорировать её?

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