после вызова connect - ошибка WSAEFAULT Код (Text): invoke WSAStartup,101h,offset WSDAT invoke WSASocket,AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,NULL,NULL mov [hSocket],eax invoke inet_addr,offset IPADR mov [RSock.sin_addr], eax mov [RSock.sin_family],AF_INET invoke htons,Port mov [RSock.sin_port],ax invoke connect,[hSocket],offset RSock,sizeof RSock -------------------------------------------- hSocket dd ? Port dw 255 IPADR db '127.0.0.1',0h RSock sockaddr_in <> WSDAT WSADATA <> Я наверное с ума сойду... перерыл все по сокетам. И работаю я с сетью не первый раз. бинд создаю без проблем. вот никак не могу понять в чем дела. У меня одна проблема - невнимательность. Может и щас я что то пропустил.????
А хендл сокета после ф-ии WSASocket можно использовать в обычном connect, а не WSAConnect? А то давно интересовал этот вопрос, а руки почитать MSDN не доходят
можно вроде... а если чесно хрен их разберет... не пойму я эти сокеты. работают как покайфу.... Вот например. В описании (и во всех статьях) функции connect или bind указывается что 3им параметром должен быть размер структуры sockaddr_in. т.е. sizeof (sockaddr_in). Тогда как у меня: Код (Text): mov [varlen],sizeof (sockaddr_in) invoke connect,[hSocket],offset RSock,offset varlen т.е. передается указатель на переменую с размером, а не сам размер.... вот спрашивается почему? в статьях и манах по сокетам передается только размер... кто ошибся? однако мой код работает. ПС.. больше всего обидно, зная что на форуме очень много спецов, они как будто игнорируют. Считая типо того что все новички ленивые и т.д. Не все такие
xenoid Вызывай socket вместо WSASocket. WSASocket - функция 2ой версии Windows Sockets. А ты WSAStartup передаешь номер версии 1.1.
хм... хм.... ага может еще ядро винды за одно дизассемблировать? =) я шо первый кто с этим сталкнулся?
xenoid В масме : Код (Text): invoke WSAStartup,202h,addr wsa .if eax!=0 invoke ExitProcess,0 .endif invoke socket,AF_INET,SOCK_STREAM,0 .if eax==SOCKET_ERROR invoke MessageBox,0,addr E_sock,NULL,MB_OK invoke SendMessage,0,WM_CLOSE,0,0 .endif mov sock1,eax invoke htons,addr bufPort mov sa.sin_port,ax mov sa.sin_family,AF_INET invoke inet_addr,addr bufIP mov sa.sin_addr,eax invoke connect,sock1,addr sa,sizeof sa ;... wsa WSADATA <> sa sockaddr_in <> bufIP db 16 dup(?) bufPort db 8 dup(?) sock1 dd ? Приблизительно так.. Должно работать
xenoid передается указатель на переменую с размером .... мой код работает Адрес, который ты передаешь в качестве третьего параметра заведомо больше, чем размер структуры sockaddr_in какой бы address family ты не указал. Возможно, до поры, до времени проверка третьего параметра заключалась в том, что размер буфера, адрес которого передается во втором параметре, должен быть не меньше, чем размер sockaddr_in для выбранного address family. Теперь winsock хочет точного соответствия (переданного в третьем параметре) размера заявленному AF_XXX или хочет убедиться, что, начиная с адреса, переданного во втором параметре, он может записать количество байт указанных в третьем параметре. Afaik win'да любит определять всяческие версии по размеру переданной структуры. Соглашусь с _Levis - хочешь определить причину ошибки "Найди проверку этого параметра". Если не хочешь делать это сам, то укажи версию win’ды и информацию по dll’кам.