Проьлема с связью через сокеты и крушение программы непонятно.

Тема в разделе "WASM.BEGINNERS", создана пользователем lust, 14 мар 2008.

  1. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    При старте программы фаерволлл говорит что запрос соединения происходит, после его разрешени на IRC сервер никто не джойнится, а программа рушится. Причём рушится там где сокеты уже закрываются. Не могу понять с чего так происходит. Спасибо большое.
    Код (Text):
    1.     .486
    2.     .model flat,stdcall
    3.     option casemap:none
    4.  
    5. include c:\masm32\include\windows.inc
    6. include c:\masm32\include\user32.inc
    7. include c:\masm32\include\kernel32.inc
    8. include c:\masm32\include\wsock32.inc
    9. include c:\masm32\include\comctl32.inc
    10.  
    11. includelib c:\masm32\lib\user32.lib
    12. includelib c:\masm32\lib\kernel32.lib
    13. includelib c:\masm32\lib\comctl32.lib  
    14. includelib c:\masm32\lib\wsock32.lib
    15.  
    16. _T macro p1, p2 ;макрос обработки строк
    17.       local l
    18.         ifb <p2>; Строка без имени
    19.             .data
    20.                 l   db p1, 0
    21.             .code
    22.             exitm   <addr l>
    23.         else    ; Строка с именем
    24.             .data
    25.                 p1  db p2, 0
    26.             .code
    27.             exitm   <addr p1>
    28.         endif
    29. endm
    30.  
    31. .data
    32. wsaError    db "UNCONNECTED!",0
    33. Hello       db "ОЯЕБУ!",0
    34. CommandLine dd  ?
    35. hSocket1    dd  ?
    36. Port        dd 6667
    37. flag        dd  ?
    38. ircServ     db "192.168.0.1",0
    39.  
    40. wsa WSADATA <>
    41. sin         sockaddr_in <?> ; -.-.-
    42.  
    43. ping    db "PING #rcp",13
    44. nick    db "NICK ASM",13
    45. user    db "USER ASM ASM_JEFF load prist joe",13
    46. join    db "JOIN #rcp",13
    47.  
    48.  
    49. .code
    50.  
    51. start: 
    52.  
    53. invoke WSAStartup, 101h, addr wsa   ; инициализация  WINSOCK DLL v1.1
    54. .if eax == NULL             ; если успешно
    55.     invoke GetCommandLine       ; получить адрес командной строки - не используется
    56.     mov    CommandLine, eax    
    57. .endif
    58. invoke  socket, AF_INET, SOCK_STREAM, 0
    59.     mov     hSocket1, eax               ;запоминаем дескриптор сокета
    60. .if (eax == SOCKET_ERROR)           ;если не  всё ок
    61.     invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP              
    62. .endif
    63.        
    64.                 ; преобразовываем номер порта в сетевой порядок байт
    65.                 invoke  htons, Port
    66.                 mov     sin.sin_port, ax
    67.                 mov     sin.sin_family, AF_INET         ;семейство используемых протоколов для интернет  "AF_INET"
    68.                 invoke  inet_addr, _T("192.168.0.1")        ; конвертируем строковый формат в IP-адрес
    69.                 mov     sin.sin_addr, eax           ;загружаем IP в параметр структуры
    70.                
    71.         ; подключаем созданный сокет к указанному в sin IP- адресу
    72.                 invoke  connect, hSocket1, addr sin, sizeof sin     ;дескриптор сокета, адрес и порт удалённого узла и размер структуры
    73.                 mov flag,eax
    74.      
    75.       invoke Sleep, 1000
    76.           invoke send, hSocket1, nick, sizeof nick, 0
    77.       invoke Sleep, 1000   
    78.           invoke send, hSocket1, user, sizeof user, 0
    79.       invoke Sleep, 1000
    80.       invoke send, hSocket1, join, sizeof join, 0    
    81.  
    82. .while (flag !=0 )  
    83.           invoke send, hSocket1, ping, sizeof ping, 0
    84.           invoke Sleep, 5000
    85.      
    86. .endw
    87.                
    88. ;закрываем сокеты и подчищаем
    89. invoke closesocket, hSocket1
    90. invoke WSACleanup
    91.  
    92.  
    93. end start
    94. ret
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    lust
    Почему ret после end start?
     
  3. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    Балин, постоянно путаюсь с этим. Спасибо.
    Но суть в сокетах. косяки с выходом через exitprocess можно почистить.
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    lust
    Про "крушение программы" уже ответил.

    Про "проблемы со связью".
    Добавь в код _нормальную_ проверку результатов работы подпрограмм winsock.
    Например, connect успешно завершившись вернет _ноль_. Твоя программа присваивает возвращаемое значение переменной flag. Как ты считаешь сколько раз будет выполнен цикл
    Код (Text):
    1. ...
    2. .while (flag !=0 )  
    3.           invoke send, hSocket1, ping, sizeof ping, 0
    4.           invoke Sleep, 5000
    5.      
    6. .endw
    7. ...
     
  5. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    154
    Код довольно грязный. Например,
    Код (Text):
    1. .if eax == NULL
    и
    Код (Text):
    1. .if (eax == SOCKET_ERROR)
    Почему во втором случае скобки обрамляют условие? Некрасиво.

    Далее, между вызовами send, вызов Sleep не нужен, т.к. send синхронная функция и не возвратит управление пока данные фактически не отправятся.

    Кстати может необходимо попробовать использовать "\r\n", вместо "\n". Как видится, это зависит от типа сервера к которому ты коннектишься, для виндового достаточно "\n".

    Код (Text):
    1. user db "USER ASM ASM_JEFF load prist joe",13
    Не уверен в правильности этой команды - вот как по стандарту

    Command: USER
    Parameters: <user> <mode> <unused> <realname>

    Тут <mode> - числовое значение. Для тебя должно быть примерно так:
    Код (Text):
    1. user db "USER ASM 0 ASM_JEFF :load prist joe",13,10
    Далее цикл PING не правильный. По стандарту надо на PING сервера, отвечать PONG.
    И условие
    Код (Text):
    1. .while (flag !=0 )
    не корректное. Переменная flag не нужна, а надо проверять возврат connect сразу. Также необходимо проверять возврат send при каждом вызове естесственно, т.к. в любой момент соединение с сетью может быть потеряно. А прога падает далеко не из-за сокетов, из-за неправильного завершения процесса.
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    у тебя часом не ZoneAlarm? он что-то плохо с ирц дружит. У мну тоже такое было. Хз че я исправил, но он стал потом пропускать меня в ирц.
     
  7. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    Он самый, но даже если его вырубить, результат тот же.
     
  8. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    Нашёл где подстава.
    Код (Text):
    1. invoke send, hSocket1, ping, sizeof ping, 0
    здесь нужно указатель использовать
    Код (Text):
    1. invoke send, hSocket1, addr ping, sizeof ping, 0
    вот так