Попробовал переписать на масм код Криса для создания сокетов, не ожидал, что возникнут проблемы, вроде же один API Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\wsock32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\shell32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\wsock32.lib includelib \masm32\lib\shell32.lib CreateSocket PROTO :DWORD .DATA WSA WSADATA <> .CODE start: ; Шаг 1 - Инициализация Библиотеки Сокетов INVOKE WSAStartup, 202h, addr WSA .IF (EAX) JMP JErr; .ENDIF INVOKE CreateSocket, 6677 JErr: INVOKE WSACleanup INVOKE ExitProcess, 0 ClientThread PROC Sock : SOCKET LOCAL Bytes : DWORD LOCAL BufStr[1024] : BYTE .REPEAT INVOKE recv, Sock, addr BufStr, sizeof BufStr, 0 MOV Bytes, EAX INVOKE MessageBox,0,addr BufStr,0,0 .UNTIL (Bytes <= 0) INVOKE closesocket, Sock ClientThread ENDP CreateSocket PROC Port :DWORD LOCAL Sock : SOCKET LOCAL Client : SOCKET LOCAL sin : sockaddr_in LOCAL thID : DWORD ; Шаг 2 - создание сокета INVOKE socket, AF_INET, SOCK_STREAM, 0 .IF (EAX < 0) JMP JErr; .ENDIF ;Шаг 3 - связывание сокета с локальным адресом MOV Sock, EAX MOV sin.sin_family, AF_INET INVOKE htons, Port MOV sin.sin_port, AX MOV sin.sin_addr, INADDR_ANY ; Вызываем bind для связывания INVOKE bind, Sock, addr sin, sizeof sin .IF (EAX != 0) JMP JErr .ENDIF ;Шаг 4 - ожидание подключений INVOKE listen, Sock, SOMAXCONN .IF (EAX) JMP JErr .ENDIF ;Шаг 5 - извлекаем сообщение из очереди .REPEAT INVOKE accept, Sock, 0, 0 MOV Client, EAX INVOKE CreateThread, 0, 0, addr ClientThread, Client, 0, addr thID .UNTIL (!Client) CreateSocket ENDP END start Но после нескольких коннектов\дисконнектов вылетает. Никак не могу найти где ошибка, помогите пожалуйста
hiho У меня (Win32XP SP3) твой текст работает нормально, ничего не вылетает на 4-6 клиентах. Больше просто лень было )))
Win 7 x64, вылетает когда один и тот же клиент переподсоединяется 3-4 раза, причем все функции возвращают то что и должны, просто происходит закрытие приложения, причем даже винда исключение не генерит, проверил, сама программа ExitProcess не вызывает, отсюда и вся проблема. Уж лучше бы ошибки были =)
Ну когда КК эту статью писал 7x64 еще не видать было, так что он не виноват. )) Как это "один и тот же клиент переподсоединяется"? А как ты тут из-под клиента прервешь сеанс? Как вариант - на С собери посмотри отладчиком что кому передается.
hiho Упрости свою ClientThread() до придела и как-то продумай наверное ожидание завершения потока, там с WaitForSingleObject() как-то.
Так я и не говорю, что КК виноват, виноват я, вот только где?.. На плюсах собирал - всё нормально. В этой программе всё те же значения возвращает\принимает. Соединение я рву из своей программы-клиента, телнет для соединения не использую. Определил, что программа завершается после того, как из-за разрыва будет выход из потока: Код (Text): ClientThread PROC Sock : SOCKET .... INVOKE closesocket, Sock ;Этот код выполнится после разрыва ClientThread ENDP Сразу после выхода из потока - вылет. Причем даже вызов Accept-а завершается без ошибок. Такое ощущение, что происходит переполнение какой-то переменной(О_о), так как вылетает не после первого подключения.
Не доглядел. Исправил, но ошибка осталась Крис Касперски. Данная программа написана по его статье http://www.insidepro.com/kk/006/006r.shtml PS: Счастливые обладатели Win7 x64, попробуйте погонять код
На ошибку наверное нет, но направление )) У тебя имхо проблема с запущенным процессом. Для начала без CreateThread() собери, посмотри.
Нашел я свою ошибку. Забыл RET при завершении потока, в итоге после выхода из ClientThread он продолжал выполнять код, натыкался на создание сокета и выходил через JMP JErr. Вот код вроде бы рабочего примера: Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\wsock32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\shell32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\wsock32.lib includelib \masm32\lib\shell32.lib CreateSocket PROTO :DWORD ClientThread PROTO :SOCKET .DATA WSA WSADATA <> szOut db "STOP THREAD",0 szIn db "START THREAD",0 szText db "ERROR",0 .CODE start: ; Шаг 1 - Инициализация Библиотеки Сокетов INVOKE WSAStartup, 202h, addr WSA .IF (EAX) JMP JErr .ENDIF INVOKE CreateSocket, 6677 JErr: INVOKE WSACleanup INVOKE ExitProcess, 0 CreateSocket PROC Port :DWORD LOCAL Sock : SOCKET LOCAL Client : SOCKET LOCAL sin : sockaddr_in LOCAL thID : DWORD ; Шаг 2 - создание сокета INVOKE socket, AF_INET, SOCK_STREAM, 0 .IF (EAX < 0) JMP JErr .ENDIF ;Шаг 3 - связывание сокета с локальным адресом MOV Sock, EAX MOV sin.sin_family, AF_INET INVOKE htons, Port MOV sin.sin_port, AX MOV sin.sin_addr, INADDR_ANY ; Вызываем bind для связывания INVOKE bind, Sock, addr sin, sizeof sin .IF (EAX) JMP JErr .ENDIF ;Шаг 4 - ожидание подключений INVOKE listen, Sock, SOMAXCONN .IF (EAX) JMP JErr .ENDIF ;Шаг 5 - извлекаем сообщение из очереди .REPEAT INVOKE accept, Sock, 0, 0 MOV Client, EAX INVOKE CreateThread, 0, 0, addr ClientThread, Client, 0, addr thID .UNTIL (!Client) CreateSocket ENDP ClientThread PROC Sock : SOCKET LOCAL Bytes : DWORD LOCAL BufStr[1024] : BYTE LOCAL hThread : DWORD MOV hThread, EAX .REPEAT INVOKE RtlZeroMemory, addr BufStr, sizeof BufStr INVOKE recv, Sock, addr BufStr, sizeof BufStr,0 MOV Bytes, EAX .IF (EAX) INVOKE MessageBox, 0, addr BufStr,0,0 .ENDIF .UNTIL (!Bytes) INVOKE closesocket, Sock INVOKE CloseHandle, hThread RET ClientThread ENDP END start