Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> recvfrom странная ошибка, странная ошибка для неБлок режима 
:(
    Опции темы
yogin
Дата 24.7.2012, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 23.12.2007

Репутация: нет
Всего: нет



Приветствую!
Дело происходит в 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 приложениях такого небыло... Игнорировать её?

Это сообщение отредактировал(а) yogin - 24.7.2012, 10:04
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0504 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.