WSAAsyncSelect(); Ложится любой сервак :)

Тема в разделе "WASM.NETWORKS", создана пользователем _Serega_, 29 ноя 2006.

  1. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Глюк - не глюк, дырка - не дырка, глупость иль еще что-то... но у меня случайно получился очччень странный клиент, который ложит все ОПЕНСОРС примеры, (которые мне удалось найти) серверов с WSAAsyncSelect, а те которые не ложатся, у них заканчиваются хэндлы :).
    Мож, я что-то не понимаю, иль авторы не дописали проверок, но получается такая вот ботва:

    1. FD_ACCEPT тут все ОК.
    2. FD_READ {данные есть, их много, и нет разницы считать их н-байт; или в цикле пока не WSAEWOULDBLOCK}
    3. FD_CLOSE {recv c msgpeek выдает, что данные есть, wsarecv - аналогично, ioctlsocket - аналогично (даже если их нет в системном буфере на самом деле), WSAGETSELECTERROR - ошибок нет}
    4. FD_READ {[данные есть, считываются],[данных нет]} - самое интересное начинается здесь, ведь многие "примеры", данные о сокете и связанные структуры освободили :)))), при том я думаю, что люди их писали грамотные.
    5. FD_READ {данных нет}
    6. FD_READ {данных нет}
    7. FD_READ {данных нет}
    8. FD_READ {данных нет}
    9....
    А, клиент нормально завершился еще на 2 пункте :)

    Что происходит при подключении на 10 пункте нового моего клиента, и говорить не буду, а то со смеху сдохнуть можно...
    Короче бился над сабжем неделю, правильного решения для сервера так и не нашел, пришлось править клиента :)
    ЗЫ: без разницы вызывать closesocket в пункте 3 или нет, FD_READ всё равно будет идти а ещё может прити парочку FD_CLOSE, а дальше генератор случайных глюков (Например DispatchMessage никуда не приводит:).
    ЗЗЫ: для блокирующих сокетов и просто select(), все в порядке...
    ЗЗЗЫ: а еще иногда recv(.,[<var>,<0>],0,мсж_пиик) выдает эксепшн :)
    ЗЗЗЗЫ: клиент передает данные (файл) и завершается.