TCP сервер MASM32

Тема в разделе "MASM", создана пользователем Mihalych, 2 сен 2023.

  1. Mihalych

    Mihalych New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2023
    Сообщения:
    6
    Помогите, пожалуйста, нашёл в старом топике код на TCP сервер на масме, переписал немного, получилось вот:
    Код (ASM):
    1. option casemap:none
    2. includelib \masm32\lib\kernel32.lib
    3. includelib \masm32\lib\user32.lib
    4. includelib \masm32\lib\wsock32.lib
    5. includelib \masm32\lib\masm32.lib
    6. include \masm32\include\kernel32.inc
    7. include \masm32\include\user32.inc
    8. include \masm32\include\wsock32.inc
    9. include \masm32\include\windows.inc
    10. include \masm32\include\msvcrt.inc
    11. includelib \masm32\lib\msvcrt.lib
    12. .data
    13. wsadata WSADATA <>
    14. mCaption db "E", 0
    15. mText1 db "E", 0
    16. sTitle db "Server",0
    17. t db "text", 0
    18. t2 db "R", 0
    19. n dd ?
    20. hStdin  dd ?
    21. mText2 db "e", 0
    22. hSock DWORD ?
    23. hSock2 dd ?
    24. ThreadHandle DWORD ?
    25. ThreadId DWORD ?
    26. sin sockaddr_in <>
    27. sPort DWORD 1337
    28. buffer db 1024 dup (0)
    29. hThread HANDLE ?
    30. mCaption2 db "m", 0
    31. mText3 db "c", 0
    32.  
    33. .code
    34.  
    35. Cn PROC
    36. invoke listen, hSock, SOMAXCONN
    37. invoke accept, hSock, NULL, NULL
    38. invoke CreateThread, 0, 0, ADDR Cn, NULL, 0, 0
    39. mov hSock2, eax
    40.  
    41. invoke crt_printf, ADDR t, eax
    42.  
    43. while_loop:
    44. invoke recv, hSock2, ADDR buffer, 1024, 0
    45. .IF (buffer != 0)
    46. invoke crt_printf, ADDR t2, eax
    47. invoke crt_printf, ADDR buffer, eax
    48. jmp while_loop
    49. .ENDIF
    50.  
    51. _end:
    52. invoke ExitThread,0
    53. ret
    54.  
    55. Cn ENDP
    56.  
    57. Main:
    58.  
    59. invoke AllocConsole
    60. invoke SetConsoleTitle, offset sTitle
    61.  
    62. invoke WSAStartup, 101h, ADDR wsadata
    63. .if eax!=NULL
    64. invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0
    65. .endif
    66.  
    67. invoke socket, AF_INET, SOCK_STREAM, 0
    68. .if eax==INVALID_SOCKET
    69. invoke WSAGetLastError
    70. .endif
    71. mov hSock, eax
    72.  
    73. invoke htons, sPort
    74. mov sin.sin_port, ax
    75. mov sin.sin_addr,0
    76. mov sin.sin_family, AF_INET
    77.  
    78. invoke bind, hSock, ADDR sin, sizeof sin
    79. invoke CreateThread, 0, 0, ADDR Cn, NULL, 0, 0
    80. mov hThread, eax
    81. invoke WaitForSingleObject, hThread, INFINITE
    82. invoke crt__getch
    83.  
    84. Quit:
    85. invoke WSACleanup
    86. invoke ExitProcess, 0
    87. end Main
    Вообщем, хочу сделать многопоточный сервер, чтобы после каждого подключения создавался новый поток который принимает информацию от сервера, если клиент отсоединяется, завершает поток. Гуглил - ничего, не понимаю что не работает. Заранее спасибо.
     
  2. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    для начала идентифицируйте что именно не работает
    а затем можно гуглить зная проблему
    дебажить пробовали?
     
    Mikl___ нравится это.
  3. Mihalych

    Mihalych New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2023
    Сообщения:
    6
    Пробовал, не помогло. Я новичок в ассемблере, было бы круто если бы просто скинули рабочий код.
     
  4. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    а зачем тогда ассемблер?
    пробуйте с С, С++ и др
     
  5. Mihalych

    Mihalych New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2023
    Сообщения:
    6
    хочу на ассемблере попробовать, на си и плюсах слишком легко:grin:
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
  7. mantissa

    mantissa Мембер Команда форума

    Публикаций:
    0
    Регистрация:
    9 сен 2022
    Сообщения:
    156
    Из всего сразу могу выделить несколько пунктов, которые могут, но не обязаны вызывать ошибку:
    1. В винде сокеты имеют тип void*, в UNIX int, так как программа под виндовс, то hSock должен быть dq
    2. Проинициализируйте структуру sockaddr_in нулями перед использованием, там может быть мусор, т.к. она является подмножеством над sockaddr и там в конце нули должны быть (смотрите тут)
    3. Глобальные переменные это плохо, у вас многопоточное приложение - нужна синхронизация потоков в этом случае, чтобы этого избежать используйте локальные переменные, особенно в функции Cn
    --- Сообщение объединено, 3 сен 2023 ---
    Самое главное - видеть ошибку, так сложно сказать, что не работает, а рабочий код чтобы скинули, нужно обращаться в WASM.COMMERCE
    :grin:
     
    Mikl___ нравится это.
  8. Mihalych

    Mihalych New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2023
    Сообщения:
    6
    Ну при компиляции ошибок нет, с локальными переменными попробую, тут в логике наверное ошибка:
    Код (ASM):
    1. while_loop:
    2. invoke recv, hSock2, ADDR buffer, 1024, 0
    3. invoke crt_printf, ADDR t2, eax
    4. invoke crt_printf, ADDR buffer, eax
    5. invoke crt_printf, ADDR t2, eax
    6.  
    7. .IF (buffer != 0)
    8.  
    9. invoke crt_printf, ADDR t, eax
    10. invoke crt_printf, ADDR buffer, eax
    11.  
    12. jmp while_loop
    13. .ENDIF
    (t2 = "!")
    Когда через браузер на localhost:1337 захожу, в консоль пишет "!!!!!", раньше без многопоточности нормально выводило текст http запроса.
     
  9. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    Какой еще браузер :)
    по какому протоколу браузер общается с сервером? :)

    telnet пробуйте стучаться к своему асемблерному серверу
     
  10. Mihalych

    Mihalych New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2023
    Сообщения:
    6
    Какая разница? Главное что раньше работало, а сейчас нет
     
  11. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    чуть подрихтовал ваш кодес

    Код (ASM):
    1. .686
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. includelib \masm32\lib\kernel32.lib
    6. includelib \masm32\lib\user32.lib
    7. includelib \masm32\lib\wsock32.lib
    8. ;includelib \masm32\lib\masm32.lib
    9. include \masm32\include\kernel32.inc
    10. include \masm32\include\user32.inc
    11. include \masm32\include\wsock32.inc
    12. include \masm32\include\windows.inc
    13. include \masm32\include\msvcrt.inc
    14. includelib \masm32\lib\msvcrt.lib
    15.  
    16. .data
    17. wsadata WSADATA <>
    18.  
    19. mCaption db "E", 0
    20. mText1 db "E", 0
    21. sTitle db "Server",0
    22.  
    23. t         db "new conn: %d", 0
    24. t2         db "recv: %d bt ", 0
    25. t3         db "%s", 0
    26. n dd ?
    27. hStdin  dd ?
    28. mText2 db "e", 0
    29.  
    30. hSock DWORD ?
    31. hSock2 dd ?
    32.  
    33. ThreadHandle DWORD ?
    34. ThreadId DWORD ?
    35.  
    36. sin sockaddr_in <>
    37. sPort DWORD 1337
    38.  
    39. buffer db 1024 dup (0)
    40. hThread HANDLE ?
    41.  
    42. mCaption2     db "m", 0
    43. mText3         db "c", 0
    44.  
    45. .const
    46.     wVersionRequested equ 0101h
    47.  
    48. .code
    49. Cn PROC
    50. invoke listen, hSock, SOMAXCONN
    51. invoke accept, hSock, NULL, NULL
    52. mov hSock2, eax
    53. invoke crt_printf, OFFSET t, eax
    54.  
    55. invoke CreateThread, 0, 0, ADDR Cn, NULL, 0, 0
    56.  
    57. while_loop:
    58.     invoke recv, hSock2, ADDR buffer, SIZEOF buffer, 0
    59.     .IF (eax != SOCKET_ERROR) && (eax != 0) ; 0 -> client closed connection
    60.         ;invoke crt_printf, ADDR t2, eax
    61.         invoke crt_printf, ADDR t3, OFFSET buffer
    62.         jmp while_loop
    63.     .ENDIF
    64. _end:
    65. invoke ExitThread,0
    66. ret
    67. Cn ENDP
    68. Main:
    69. ; no need in case you specify /SUBSYSTEM:CONSOLE in .bat
    70. ;invoke AllocConsole
    71. ;invoke SetConsoleTitle, offset sTitle
    72. invoke WSAStartup, wVersionRequested, OFFSET wsadata
    73. .if eax!=0
    74.     invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0
    75.     jmp Quit
    76. .endif
    77. invoke socket, AF_INET, SOCK_STREAM, 0
    78. .if eax==INVALID_SOCKET
    79.     invoke WSAGetLastError
    80.     jmp Quit
    81. .endif
    82.  
    83. mov hSock, eax
    84. invoke htons, sPort
    85. mov sin.sin_port, ax
    86. mov sin.sin_addr,0
    87. mov sin.sin_family, AF_INET
    88. invoke bind, hSock, ADDR sin, sizeof sin
    89. invoke CreateThread, 0, 0, ADDR Cn, NULL, 0, 0
    90. mov hThread, eax
    91. invoke WaitForSingleObject, hThread, INFINITE
    92. invoke crt__getch
    93. Quit:
    94. invoke WSACleanup
    95. invoke ExitProcess, 0
    96. end Main
    97.  
    Проблем осталось много
    главная - мульти-клиент
    если есть текущий и законектился еще один -1й йок :)
     
    Application и Marylin нравится это.
  12. Mihalych

    Mihalych New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2023
    Сообщения:
    6
    Заработало, большое спасибо!
     
  13. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    теперь напишите "Работа над ошибками"
    и вообще какая у вас задача с сим странным и подозрительным упражнением, не понятно
    вот если поднять 100К+ коннектов на одной тачке - еще можно понять, а так..