ws2_32.connect уже 3ый день не могу понять, посмотрите плиз.

Тема в разделе "WASM.BEGINNERS", создана пользователем xenoid, 30 мар 2007.

  1. xenoid

    xenoid New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2007
    Сообщения:
    9
    после вызова connect - ошибка WSAEFAULT
    Код (Text):
    1. invoke WSAStartup,101h,offset WSDAT
    2. invoke WSASocket,AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,NULL,NULL
    3. mov [hSocket],eax
    4. invoke inet_addr,offset IPADR
    5. mov [RSock.sin_addr], eax  
    6. mov [RSock.sin_family],AF_INET
    7. invoke htons,Port
    8. mov [RSock.sin_port],ax
    9. invoke connect,[hSocket],offset RSock,sizeof RSock
    10.  
    11. --------------------------------------------
    12. hSocket  dd ?
    13. Port    dw 255
    14. IPADR   db '127.0.0.1',0h
    15. RSock   sockaddr_in <> 
    16. WSDAT   WSADATA <>
    Я наверное с ума сойду... перерыл все по сокетам. И работаю я с сетью не первый раз. бинд создаю без проблем. вот никак не могу понять в чем дела. У меня одна проблема - невнимательность. Может и щас я что то пропустил.????
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    хотя можт дело в том, что у тя нет 255 открытого порта..
     
  3. xenoid

    xenoid New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2007
    Сообщения:
    9
    ну если nc -lvvp 255 (Listening on [any] 255) не открывает порт... тогда может.
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    А хендл сокета после ф-ии WSASocket можно использовать в обычном connect, а не WSAConnect? А то давно интересовал этот вопрос, а руки почитать MSDN не доходят
     
  5. xenoid

    xenoid New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2007
    Сообщения:
    9
    можно вроде... а если чесно хрен их разберет... не пойму я эти сокеты. работают как покайфу....

    Вот например. В описании (и во всех статьях) функции connect или bind указывается что 3им параметром должен быть размер структуры sockaddr_in. т.е. sizeof (sockaddr_in). Тогда как у меня:

    Код (Text):
    1. mov [varlen],sizeof (sockaddr_in)
    2. invoke connect,[hSocket],offset RSock,offset varlen
    т.е. передается указатель на переменую с размером, а не сам размер.... вот спрашивается почему? в статьях и манах по сокетам передается только размер... кто ошибся? однако мой код работает.


    ПС.. больше всего обидно, зная что на форуме очень много спецов, они как будто игнорируют. Считая типо того что все новички ленивые и т.д. Не все такие :derisive:
     
  6. _Levis

    _Levis New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2007
    Сообщения:
    6
    Можно и в connect, и в send, и в closesocket.
     
  7. _Levis

    _Levis New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2007
    Сообщения:
    6
    xenoid
    Вызывай socket вместо WSASocket. WSASocket - функция 2ой версии Windows Sockets. А ты WSAStartup передаешь номер версии 1.1.
     
  8. _Levis

    _Levis New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2007
    Сообщения:
    6
    Подизасми и узнаешь почему работает. Найди проверку этого параметра.
     
  9. xenoid

    xenoid New Member

    Публикаций:
    0
    Регистрация:
    19 мар 2007
    Сообщения:
    9
    хм... хм....

    ага может еще ядро винды за одно дизассемблировать? =) я шо первый кто с этим сталкнулся?
     
  10. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    xenoid
    В масме :
    Код (Text):
    1. invoke WSAStartup,202h,addr wsa
    2. .if eax!=0
    3.         invoke ExitProcess,0
    4. .endif
    5. invoke socket,AF_INET,SOCK_STREAM,0
    6. .if eax==SOCKET_ERROR
    7.         invoke MessageBox,0,addr E_sock,NULL,MB_OK
    8.         invoke SendMessage,0,WM_CLOSE,0,0
    9. .endif
    10. mov sock1,eax
    11. invoke htons,addr bufPort
    12. mov sa.sin_port,ax
    13. mov sa.sin_family,AF_INET
    14. invoke inet_addr,addr bufIP
    15. mov sa.sin_addr,eax
    16. invoke connect,sock1,addr sa,sizeof sa 
    17. ;...
    18. wsa WSADATA <>
    19. sa sockaddr_in <>
    20.  
    21. bufIP db 16 dup(?)
    22. bufPort db 8 dup(?)
    23.  
    24. sock1 dd ?
    Приблизительно так.. Должно работать
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    xenoid
    передается указатель на переменую с размером .... мой код работает
    Адрес, который ты передаешь в качестве третьего параметра заведомо больше, чем размер структуры sockaddr_in какой бы address family ты не указал.
    Возможно, до поры, до времени проверка третьего параметра заключалась в том, что размер буфера, адрес которого передается во втором параметре, должен быть не меньше, чем размер sockaddr_in для выбранного address family. Теперь winsock хочет точного соответствия (переданного в третьем параметре) размера заявленному AF_XXX или хочет убедиться, что, начиная с адреса, переданного во втором параметре, он может записать количество байт указанных в третьем параметре. Afaik win'да любит определять всяческие версии по размеру переданной структуры.

    Соглашусь с _Levis - хочешь определить причину ошибки "Найди проверку этого параметра".
    Если не хочешь делать это сам, то укажи версию win’ды и информацию по dll’кам.