WSAAsyncselect выдаёт INVALID_SOCKET несмотря на то, что сокеты создаются, и к ним даже можно подключится.наличие и состояние сокетов проверял программой TcpView.выкладываю участок кода, в котором описывается слушающий сокет: Код (Text): invoke WSAStartup, 101h, addr wsa invoke gethostname, addr buffer, sizeof buffer invoke gethostbyname, addr buffer ; получаем стpуктуpу HOSTENT ; теперь eax содеpжит указатель на структ. HOSTENT, см. windows.inc mov eax, [eax+12] ; получаем указатель на элемент h_list в HOSTENT mov eax, [eax] ; получаем указатель на указатель на IP mov eax, [eax] ; получаем указатель на строку IP в сетевом порядке байт ; конвертировать IP адрес в строковый формат с точками invoke inet_ntoa, eax ; при выходе в eax - указатель на строку вида 127.0.0.1 mov hIP, eax ; запомнить указатель на строку с IP invoke wsprintf, addr buf_out1, addr NameIP, hIP invoke socket, AF_INET, \ ; Address family (в веp 1.1 доступно только семейство AF_INET) SOCK_STREAM,\ ; задает тип сокета (STREAM или DATAGRAM) 0 ; тип протокола (не устанавливать никакого пpотокола: 0) mov [hSocket2], eax ; запомнить хендл invoke WSAAsyncSelect,addr hSocket2,addr hWnd, addr DownLoadButton1ID, FD_ACCEPT+FD_READ .if eax==INVALID_SOCKET invoke MessageBox,NULL,NULL,NULL,MB_OK .endif invoke htons, Port mov sin.sin_port, ax mov sin.sin_family, AF_INET mov sin.sin_addr, INADDR_ANY ; ассоциировать локальный адрес (представленный в структуре sin) с сокетом invoke bind, hSocket2, addr sin, sizeof sin invoke listen, hSocket2, 5
", addr hSocket2," ? может быть ", hSocket2," ? Не понимаю, нафига на ассемблере все это писать, садомазахизм какой-то по-моему.
ктомуж какие ты предлагаеш альтернативы ассемблеру?ассемблер я изучаю почти год, пишу под WINAPI почти месяц)это первый мой танец с бубном за всё это время
Да, хендл. http://msdn.microsoft.com/en-us/library/ms741540(VS.85).aspx В написании программы сразу на ассемблере очень легко ошибиться и написать addr var вместо var и т.д. Намного проще, когда есть IDE, которая сама подсказывает какой тип аргумента передается.
Код (Text): int WSAAsyncSelect( __in SOCKET s, __in HWND hWnd, __in unsigned int wMsg, __in long lEvent ); все переменные передаются по значению, а ты везде ссылки на них понатыкивал))
Ну да, кстати. Просто SOCKET_ERROR она возвращает именно из-за того, что передается не сокет, а указатель ...
спс.сёдня утрецом опробую)но вот ещё вопрос - в списке сокетов в момент подключения третий сокет(тот, который должен появлятся после вызова ф-ии ACCEPT) появляется автоматически!почему?
Ну, он должен проявляться, когда есть подключение, и это подключение необходимо принять с помощью accept() ... А не _после_ вызова ф-ии ACCEPT ...
Да, с помощью функции accept() ты получаешь хендл нового сокета. Этот сокет соответствует подключившемуся к тебе клиенту. Хочешь послать данные подключившемуся клиенту или прочитать что он прислал - юзай этот сокет. А selectы/WSAAsyncSelect'ы всяческие, если задан сокет, который прослушивается (listen) сигналят его при подключении клиента (читай msdn про функцию select()). И ещёА если сокет в состоянии connecting to ... (вызвал connect асинхронно), то сигнал, что в сокет можно писать будет означать, что подключение завершено (или обломалось с ошибкой).
поправка: >А selectы/WSAAsyncSelect'ы всяческие, если задан сокет, который прослушивается (listen) сигналят его при подключении клиента (читай msdn про функцию select()). сигналят его как возможный на чтение данных
т.е. сначало надо ставить сокет на прослушку а потом уже использовать WSAAsyncSelect?если это так, то тот исходник что я скачал,видимо писал тот, кто едва вышед из памперсов
WSAAsyncSelect просто запоминает, что winsock тебе пошлет нотификацию, когда произойдет заданое событие на сокете. Юзать то ее конечно можно сразу после создания сокета, но логичнее по-моему как-то после bind(). select() ждущий само собой надо было бы юзать перед accept(). Так что впринципе то оно верно. Кстати, как сейчас выяснилось, listen() тут и не нужен)
Слово "нотификация" в контексте моего поста никак не связано с конкретным сообщением WM_NOTIFY ) Я имел ввиду просто оповестит сообщением оконным. нее, я ж написал потом - нужен listen()
про listen я понял, а созданное мной значение(указанное в WSAA.....) будет посылатся в uMsg, правильно?