Проблема с WSAAsyncSelect под WinNT 4.0 и Win98

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

  1. Puncher

    Puncher New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2005
    Сообщения:
    16
    Адрес:
    Russia
    Добрый день уважаемые посетители конференции.



    Столкнулся с такой проблемой:

    В общем решил наклепать чат на фасме с использованием неблокирующих сокетов и UDP. Затея удалась, но все работает только под WinNT 5.0 или старше (проверял на Win XP и Win2k). А вот на Win98 и WinNT 4.0 WSAAsyncSelect заканчивается с 0xFFFF в ЕАХ и кодом ошибки WSAEINVAL. При этом отправка работает нормально.



    Короче говоря сокет не переходит в неблокирующий режим, но продолжает работать, например если вручную вызвать команду recvfrom, то данные из буфера будут считаны. В общем буду благодарен если поможете разобраться с сложившейся ситуацией.



    Вот кусок кода:


    Код (Text):
    1.  
    2. invoke  WSAStartup,101h,wsdata
    3. invoke  WSASocket,AF_INET,SOCK_DGRAM,IPPROTO_UDP,0,0,0  
    4. mov [hSock],EAX
    5. invoke  bind,[hSock],saddr_l,16
    6. invoke  WSAAsyncSelect,[hSock],[hDlg],WM_SOCK,FD_READ
    7.  




    Кратко о самой проге:

    Для отправки регистрирется хоткей (Ctrl+Enter), вторая копия программы не сможет получить хоткей, но продолжит работать на прием. Можно запустить одну копию и самому себе на один и тотже порт слать сообщения.



    Прога прилагается с исходниками…



    [​IMG] 698774654__wsock.rar
     
  2. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    Посмотрим...

    WSAEINVAL - Получен недопустимый аргумент.

    Что-то мне подсказывает, что тебе лучше использовать WSAEventSelect.
     
  3. Puncher

    Puncher New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2005
    Сообщения:
    16
    Адрес:
    Russia
    Vasil

    Щас вот переделываю под EventSelect...



    Кстати, а мона использовать евенты созданные CreateEvent, а не WSACreateEvent? (для функции WSAEventSelect разумеется)
     
  4. Guest

    Guest Guest

    Публикаций:
    0
    Puncher

    Естественно можно (врядли бы микрософт изобретал велосипед (хотя ой как могйт)), достаточно посмотреть в том же олли
    Код (Text):
    1.  
    2. push 0
    3. push 0
    4. push 1
    5. push 0
    6. call CreateEvent
    7.  




    Еще момент. Работаю с сокетами год гдето. За это время понял что лучше блокирующих, тех первых (Беркли кажется) нету. Так же мне больше нравится ф-я select чем привязка к событиям.
     
  5. Puncher

    Puncher New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2005
    Сообщения:
    16
    Адрес:
    Russia
    Corleone

    Ага правильно! Для EventSelect нужен евент с ручным сбросом, в MSDN так и написано, что WSACreateEvent это и есть обычный евент с мануальным сбросом...



    Кстати мне тоже WSAAsyncSelect показался более удобным, чем EventSelect. Программу всетаки пересадил на EventSelect, в 98-й работает. Осталось пару глюков отловить...



    Спасибо всем !
     
  6. Guest

    Guest Guest

    Публикаций:
    0


    Я имел ввиду ф-ю select



    Поясню почему мне она больше нравится чем событийная или ассинхронная модели. Я писал SOCKS-сервер, и заметил что при серфинге ч-з браузер страницы грузятся не до конца. То что я правильно написал рабочий тред - сомнения у меня не вызывало, в общем иногда не приходили сообщения FD_CLOSE, как я потом вичислил. Перевел же все на селект, во первых код уменьшил с 2,5 кб до 1027 байт, во вторых обмен данными на соксе происходит в полном объеме. С тех пор события использую только если ч-з сокеты не идут тонны данных, WSAAsyncSelect - всего использовал пару раз (ну полная лажа!)
     
  7. Puncher

    Puncher New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2005
    Сообщения:
    16
    Адрес:
    Russia
    Corleone

    Пардон, перепутал слегка...