Помогите, пожалуйста, нашёл в старом топике код на TCP сервер на масме, переписал немного, получилось вот: Код (ASM): option casemap:none includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\wsock32.lib includelib \masm32\lib\masm32.lib include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\wsock32.inc include \masm32\include\windows.inc include \masm32\include\msvcrt.inc includelib \masm32\lib\msvcrt.lib .data wsadata WSADATA <> mCaption db "E", 0 mText1 db "E", 0 sTitle db "Server",0 t db "text", 0 t2 db "R", 0 n dd ? hStdin dd ? mText2 db "e", 0 hSock DWORD ? hSock2 dd ? ThreadHandle DWORD ? ThreadId DWORD ? sin sockaddr_in <> sPort DWORD 1337 buffer db 1024 dup (0) hThread HANDLE ? mCaption2 db "m", 0 mText3 db "c", 0 .code Cn PROC invoke listen, hSock, SOMAXCONN invoke accept, hSock, NULL, NULL invoke CreateThread, 0, 0, ADDR Cn, NULL, 0, 0 mov hSock2, eax invoke crt_printf, ADDR t, eax while_loop: invoke recv, hSock2, ADDR buffer, 1024, 0 .IF (buffer != 0) invoke crt_printf, ADDR t2, eax invoke crt_printf, ADDR buffer, eax jmp while_loop .ENDIF _end: invoke ExitThread,0 ret Cn ENDP Main: invoke AllocConsole invoke SetConsoleTitle, offset sTitle invoke WSAStartup, 101h, ADDR wsadata .if eax!=NULL invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0 .endif invoke socket, AF_INET, SOCK_STREAM, 0 .if eax==INVALID_SOCKET invoke WSAGetLastError .endif mov hSock, eax invoke htons, sPort mov sin.sin_port, ax mov sin.sin_addr,0 mov sin.sin_family, AF_INET invoke bind, hSock, ADDR sin, sizeof sin invoke CreateThread, 0, 0, ADDR Cn, NULL, 0, 0 mov hThread, eax invoke WaitForSingleObject, hThread, INFINITE invoke crt__getch Quit: invoke WSACleanup invoke ExitProcess, 0 end Main Вообщем, хочу сделать многопоточный сервер, чтобы после каждого подключения создавался новый поток который принимает информацию от сервера, если клиент отсоединяется, завершает поток. Гуглил - ничего, не понимаю что не работает. Заранее спасибо.
для начала идентифицируйте что именно не работает а затем можно гуглить зная проблему дебажить пробовали?
Mihalych, посмотри топик "WASM.ARTICLES → Inter Process Communication", там есть Сокеты, датаграммы и каналы связи Программа работающая. Разбирайся. Возможно, это то, что тебе нужно.
Из всего сразу могу выделить несколько пунктов, которые могут, но не обязаны вызывать ошибку: В винде сокеты имеют тип void*, в UNIX int, так как программа под виндовс, то hSock должен быть dq Проинициализируйте структуру sockaddr_in нулями перед использованием, там может быть мусор, т.к. она является подмножеством над sockaddr и там в конце нули должны быть (смотрите тут) Глобальные переменные это плохо, у вас многопоточное приложение - нужна синхронизация потоков в этом случае, чтобы этого избежать используйте локальные переменные, особенно в функции Cn --- Сообщение объединено, 3 сен 2023 --- Самое главное - видеть ошибку, так сложно сказать, что не работает, а рабочий код чтобы скинули, нужно обращаться в WASM.COMMERCE
Ну при компиляции ошибок нет, с локальными переменными попробую, тут в логике наверное ошибка: Код (ASM): while_loop: invoke recv, hSock2, ADDR buffer, 1024, 0 invoke crt_printf, ADDR t2, eax invoke crt_printf, ADDR buffer, eax invoke crt_printf, ADDR t2, eax .IF (buffer != 0) invoke crt_printf, ADDR t, eax invoke crt_printf, ADDR buffer, eax jmp while_loop .ENDIF (t2 = "!") Когда через браузер на localhost:1337 захожу, в консоль пишет "!!!!!", раньше без многопоточности нормально выводило текст http запроса.
Какой еще браузер по какому протоколу браузер общается с сервером? telnet пробуйте стучаться к своему асемблерному серверу
чуть подрихтовал ваш кодес Код (ASM): .686 .model flat,stdcall option casemap:none includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\wsock32.lib ;includelib \masm32\lib\masm32.lib include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\wsock32.inc include \masm32\include\windows.inc include \masm32\include\msvcrt.inc includelib \masm32\lib\msvcrt.lib .data wsadata WSADATA <> mCaption db "E", 0 mText1 db "E", 0 sTitle db "Server",0 t db "new conn: %d", 0 t2 db "recv: %d bt ", 0 t3 db "%s", 0 n dd ? hStdin dd ? mText2 db "e", 0 hSock DWORD ? hSock2 dd ? ThreadHandle DWORD ? ThreadId DWORD ? sin sockaddr_in <> sPort DWORD 1337 buffer db 1024 dup (0) hThread HANDLE ? mCaption2 db "m", 0 mText3 db "c", 0 .const wVersionRequested equ 0101h .code Cn PROC invoke listen, hSock, SOMAXCONN invoke accept, hSock, NULL, NULL mov hSock2, eax invoke crt_printf, OFFSET t, eax invoke CreateThread, 0, 0, ADDR Cn, NULL, 0, 0 while_loop: invoke recv, hSock2, ADDR buffer, SIZEOF buffer, 0 .IF (eax != SOCKET_ERROR) && (eax != 0) ; 0 -> client closed connection ;invoke crt_printf, ADDR t2, eax invoke crt_printf, ADDR t3, OFFSET buffer jmp while_loop .ENDIF _end: invoke ExitThread,0 ret Cn ENDP Main: ; no need in case you specify /SUBSYSTEM:CONSOLE in .bat ;invoke AllocConsole ;invoke SetConsoleTitle, offset sTitle invoke WSAStartup, wVersionRequested, OFFSET wsadata .if eax!=0 invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0 jmp Quit .endif invoke socket, AF_INET, SOCK_STREAM, 0 .if eax==INVALID_SOCKET invoke WSAGetLastError jmp Quit .endif mov hSock, eax invoke htons, sPort mov sin.sin_port, ax mov sin.sin_addr,0 mov sin.sin_family, AF_INET invoke bind, hSock, ADDR sin, sizeof sin invoke CreateThread, 0, 0, ADDR Cn, NULL, 0, 0 mov hThread, eax invoke WaitForSingleObject, hThread, INFINITE invoke crt__getch Quit: invoke WSACleanup invoke ExitProcess, 0 end Main Проблем осталось много главная - мульти-клиент если есть текущий и законектился еще один -1й йок
теперь напишите "Работа над ошибками" и вообще какая у вас задача с сим странным и подозрительным упражнением, не понятно вот если поднять 100К+ коннектов на одной тачке - еще можно понять, а так..