проблема с WSAAsyncselect

Тема в разделе "WASM.WIN32", создана пользователем 6opoDuJIo, 22 май 2009.

  1. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    WSAAsyncselect выдаёт INVALID_SOCKET несмотря на то, что сокеты создаются, и к ним даже можно подключится.наличие и состояние сокетов проверял программой TcpView.выкладываю участок кода, в котором описывается слушающий сокет:
    Код (Text):
    1.  
    2.          invoke WSAStartup, 101h, addr wsa
    3.          invoke gethostname, addr buffer, sizeof buffer
    4.          invoke gethostbyname, addr buffer ; получаем стpуктуpу HOSTENT
    5. ; теперь eax содеpжит указатель на структ. HOSTENT, см. windows.inc
    6.     mov eax, [eax+12]   ; получаем указатель на элемент h_list в HOSTENT
    7.           mov eax, [eax]        ; получаем указатель на указатель на IP
    8.           mov eax, [eax]        ; получаем указатель на строку IP в сетевом порядке байт
    9. ; конвертировать IP адрес в строковый формат с точками
    10.           invoke inet_ntoa, eax ; при выходе в eax - указатель на строку вида 127.0.0.1
    11.             mov hIP, eax        ; запомнить указатель на строку с IP
    12.             invoke wsprintf, addr buf_out1, addr NameIP, hIP
    13.             invoke socket, AF_INET, \   ; Address family (в веp 1.1 доступно только семейство AF_INET)
    14.         SOCK_STREAM,\   ; задает тип сокета (STREAM или DATAGRAM)
    15.         0               ; тип протокола (не устанавливать никакого пpотокола: 0)
    16.                    
    17.                     mov [hSocket2], eax         ; запомнить хендл
    18.    
    19. invoke WSAAsyncSelect,addr hSocket2,addr hWnd, addr DownLoadButton1ID, FD_ACCEPT+FD_READ
    20. .if eax==INVALID_SOCKET
    21. invoke MessageBox,NULL,NULL,NULL,MB_OK
    22. .endif
    23.  
    24.            
    25. invoke htons, Port
    26.         mov sin.sin_port, ax
    27.         mov sin.sin_family, AF_INET
    28.         mov sin.sin_addr, INADDR_ANY
    29.        
    30. ; ассоциировать локальный адрес (представленный в структуре sin)  с сокетом
    31.     invoke bind, hSocket2, addr sin, sizeof sin
    32.  
    33.         invoke listen, hSocket2, 5
     
  2. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    ", addr hSocket2," ? может быть ", hSocket2," ?

    Не понимаю, нафига на ассемблере все это писать, садомазахизм какой-то по-моему.
     
  3. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    addr hSocket2 -это указатель на хендл сокета
    разве надо передавать сам хэндл?
     
  4. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    ктомуж какие ты предлагаеш альтернативы ассемблеру?ассемблер я изучаю почти год, пишу под WINAPI почти месяц)это первый мой танец с бубном за всё это время
     
  5. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    Да, хендл. http://msdn.microsoft.com/en-us/library/ms741540(VS.85).aspx

    В написании программы сразу на ассемблере очень легко ошибиться и написать addr var вместо var и т.д. Намного проще, когда есть IDE, которая сама подсказывает какой тип аргумента передается.
     
  6. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Код (Text):
    1. int WSAAsyncSelect(
    2.   __in          SOCKET s,
    3.   __in          HWND hWnd,
    4.   __in          unsigned int wMsg,
    5.   __in          long lEvent
    6. );
    все переменные передаются по значению, а ты везде ссылки на них понатыкивал))
     
  7. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    Ну да, кстати. Просто SOCKET_ERROR она возвращает именно из-за того, что передается не сокет, а указатель ...
     
  8. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    спс.сёдня утрецом опробую)но вот ещё вопрос - в списке сокетов в момент подключения третий сокет(тот, который должен появлятся после вызова ф-ии ACCEPT) появляется автоматически!почему?
     
  9. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    Ну, он должен проявляться, когда есть подключение, и это подключение необходимо принять с помощью accept() ... А не _после_ вызова ф-ии ACCEPT ...
     
  10. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    аааа.т.е. с помощью ф-ии Accept я получаю хендл нового сокета?
     
  11. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    Да, с помощью функции accept() ты получаешь хендл нового сокета. Этот сокет соответствует подключившемуся к тебе клиенту. Хочешь послать данные подключившемуся клиенту или прочитать что он прислал - юзай этот сокет.
    А selectы/WSAAsyncSelect'ы всяческие, если задан сокет, который прослушивается (listen) сигналят его при подключении клиента (читай msdn про функцию select()).
    И ещёА если сокет в состоянии connecting to ... (вызвал connect асинхронно), то сигнал, что в сокет можно писать будет означать, что подключение завершено (или обломалось с ошибкой).
     
  12. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    поправка:

    >А selectы/WSAAsyncSelect'ы всяческие, если задан сокет, который прослушивается (listen) сигналят его при подключении клиента (читай msdn про функцию select()).

    сигналят его как возможный на чтение данных
     
  13. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    т.е. сначало надо ставить сокет на прослушку а потом уже использовать WSAAsyncSelect?если это так, то тот исходник что я скачал,видимо писал тот, кто едва вышед из памперсов
     
  14. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    WSAAsyncSelect просто запоминает, что winsock тебе пошлет нотификацию, когда произойдет заданое событие на сокете.
    Юзать то ее конечно можно сразу после создания сокета, но логичнее по-моему как-то после bind().
    select() ждущий само собой надо было бы юзать перед accept().
    Так что впринципе то оно верно.
    Кстати, как сейчас выяснилось, listen() тут и не нужен)
     
  15. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    А нет, нужен. В TCP нужен, в udp не нужен. Сорри.
     
  16. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    вот это меня смутило чуток)
    спасибо за помощ.утром буду разбираццо
     
  17. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    разве сообщение окну будет WM_NOTIFY?
     
  18. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    Слово "нотификация" в контексте моего поста никак не связано с конкретным сообщением WM_NOTIFY )
    Я имел ввиду просто оповестит сообщением оконным.

    нее, я ж написал потом - нужен listen()
     
  19. 6opoDuJIo

    6opoDuJIo New Member

    Публикаций:
    0
    Регистрация:
    22 май 2009
    Сообщения:
    105
    про listen я понял, а созданное мной значение(указанное в WSAA.....) будет посылатся в uMsg, правильно?
     
  20. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    Чел, ты б msdn читал. Там же все написано:

    wMsg посылается