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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RecvFrom возвращает WSAEWOULDBLOCK 
V
    Опции темы
Lexicss
Дата 26.9.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 16.8.2006
Где: Беларусь, Минск

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



Работаю с протоколом UDP/IP 
Программа обрабатывает присланные ей датаграммы.
Вот часть кода :
Код

  repeat
    boError := False;
    WaitRes := MsgWaitForMultipleObjects(CountEvent, arrThrEvents, False, 300, QS_POSTMESSAGE) - WAIT_OBJECT_0;
    if WaitRes > 0
    then begin
      if WaitRes < CountEvent
      then begin
        SockAddrLen := sizeOf(TSockAddrIn);
        WSAResetEvent(arrThrEvent[WaitRes]);

        Received := RecvFrom(sock,recvbuff,sizeOf(recvbuff),0,SockAddrFrom,SockAddrLen);
        boError := (Received = SOCKET_ERROR);
        ......................
   until WaitRes = 0;


Когда программа запускается, а в во входном буффере данных нет - всё ок. 
Когда приходят  датаграммы, взводится событие arrThrEvent[1], RecvFrom возвращает число байт в датаграмме - всё ок, однако когда датаграммы заканчиваются - то событие всё равно взводится.
Срабатывает функция - RecvFrom с ошибкой WSAGetLastError = WSAEWOULDBLOCK. И всё цикл пошёл бесконечный, как будто я событие не сбрасываю. 

Прочитал в msdn, что типа это значит сокет в неблокирующем риежими и всё ок. Ну перевожу я его в блокирующий режим. Как я понял это делается так:
Код

arg := 0;
IOCtlSocket(sock, FIONBIO, arg)

Всё тоже самое. Проблема зацикливания остаётся, и грузит проц под 100%. Ничего не помогает. 

Пришлось сделать  так чтобы хоть нагрузку снять:
Код

  repeat
    boError := False;
    WaitRes := MsgWaitForMultipleObjects(CountEvent, arrThrEvents, False, 300, QS_POSTMESSAGE) - WAIT_OBJECT_0;
    if WaitRes > 0
    then begin
      if WaitRes < CountEvent
      then begin
        SockAddrLen := sizeOf(TSockAddrIn);
        WSAResetEvent(arrThrEvent[WaitRes]);
        arg := 0;
        IOCtlSocket(sock,FIONRead,arg)
        if arg = 0
        then begin
          sleep(500);
          continue;
        end;
        Received := RecvFrom(sock,recvbuff,sizeOf(recvbuff),0,SockAddrFrom,SockAddrLen);
        boError := (Received = SOCKET_ERROR);
        ......................
   until WaitRes = 0;


Но всё же хотел обратиться за помощью, можно ли как-то здесь придумть красиво чтобы по прибытию датаграмм событие не взаодилось до прибытия следующиХ?

Событие привязал так : WSAEventSelect(sock,arrThrEvent[1],FD_READ)


Это сообщение отредактировал(а) Lexicss - 26.9.2008, 14:21
--------------------
Бери от жизни всё.
PM MAIL WWW ICQ Skype   Вверх
Lexicss
Дата 26.9.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 16.8.2006
Где: Беларусь, Минск

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



CountEvent = 2;
--------------------
Бери от жизни всё.
PM MAIL WWW ICQ Skype   Вверх
Lexicss
Дата 26.9.2008, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 16.8.2006
Где: Беларусь, Минск

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



Нашёл в чём ошибка. В WSAResetEvent  указал элемент не того массива, но похожий на названием на тот что в MsgWait...
Блин, а немало времени убил на поиски...
--------------------
Бери от жизни всё.
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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