При старте программы фаерволлл говорит что запрос соединения происходит, после его разрешени на IRC сервер никто не джойнится, а программа рушится. Причём рушится там где сокеты уже закрываются. Не могу понять с чего так происходит. Спасибо большое. Код (Text): .486 .model flat,stdcall option casemap:none include c:\masm32\include\windows.inc include c:\masm32\include\user32.inc include c:\masm32\include\kernel32.inc include c:\masm32\include\wsock32.inc include c:\masm32\include\comctl32.inc includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib includelib c:\masm32\lib\comctl32.lib includelib c:\masm32\lib\wsock32.lib _T macro p1, p2 ;макрос обработки строк local l ifb <p2>; Строка без имени .data l db p1, 0 .code exitm <addr l> else ; Строка с именем .data p1 db p2, 0 .code exitm <addr p1> endif endm .data wsaError db "UNCONNECTED!",0 Hello db "ОЯЕБУ!",0 CommandLine dd ? hSocket1 dd ? Port dd 6667 flag dd ? ircServ db "192.168.0.1",0 wsa WSADATA <> sin sockaddr_in <?> ; -.-.- ping db "PING #rcp",13 nick db "NICK ASM",13 user db "USER ASM ASM_JEFF load prist joe",13 join db "JOIN #rcp",13 .code start: invoke WSAStartup, 101h, addr wsa ; инициализация WINSOCK DLL v1.1 .if eax == NULL ; если успешно invoke GetCommandLine ; получить адрес командной строки - не используется mov CommandLine, eax .endif invoke socket, AF_INET, SOCK_STREAM, 0 mov hSocket1, eax ;запоминаем дескриптор сокета .if (eax == SOCKET_ERROR) ;если не всё ок invoke MessageBox, NULL, addr wsaError, addr Hello, MB_OK + MB_ICONSTOP .endif ; преобразовываем номер порта в сетевой порядок байт invoke htons, Port mov sin.sin_port, ax mov sin.sin_family, AF_INET ;семейство используемых протоколов для интернет "AF_INET" invoke inet_addr, _T("192.168.0.1") ; конвертируем строковый формат в IP-адрес mov sin.sin_addr, eax ;загружаем IP в параметр структуры ; подключаем созданный сокет к указанному в sin IP- адресу invoke connect, hSocket1, addr sin, sizeof sin ;дескриптор сокета, адрес и порт удалённого узла и размер структуры mov flag,eax invoke Sleep, 1000 invoke send, hSocket1, nick, sizeof nick, 0 invoke Sleep, 1000 invoke send, hSocket1, user, sizeof user, 0 invoke Sleep, 1000 invoke send, hSocket1, join, sizeof join, 0 .while (flag !=0 ) invoke send, hSocket1, ping, sizeof ping, 0 invoke Sleep, 5000 .endw ;закрываем сокеты и подчищаем invoke closesocket, hSocket1 invoke WSACleanup end start ret
Балин, постоянно путаюсь с этим. Спасибо. Но суть в сокетах. косяки с выходом через exitprocess можно почистить.
lust Про "крушение программы" уже ответил. Про "проблемы со связью". Добавь в код _нормальную_ проверку результатов работы подпрограмм winsock. Например, connect успешно завершившись вернет _ноль_. Твоя программа присваивает возвращаемое значение переменной flag. Как ты считаешь сколько раз будет выполнен цикл Код (Text): ... .while (flag !=0 ) invoke send, hSocket1, ping, sizeof ping, 0 invoke Sleep, 5000 .endw ...
Код довольно грязный. Например, Код (Text): .if eax == NULL и Код (Text): .if (eax == SOCKET_ERROR) Почему во втором случае скобки обрамляют условие? Некрасиво. Далее, между вызовами send, вызов Sleep не нужен, т.к. send синхронная функция и не возвратит управление пока данные фактически не отправятся. Кстати может необходимо попробовать использовать "\r\n", вместо "\n". Как видится, это зависит от типа сервера к которому ты коннектишься, для виндового достаточно "\n". Код (Text): user db "USER ASM ASM_JEFF load prist joe",13 Не уверен в правильности этой команды - вот как по стандарту Command: USER Parameters: <user> <mode> <unused> <realname> Тут <mode> - числовое значение. Для тебя должно быть примерно так: Код (Text): user db "USER ASM 0 ASM_JEFF :load prist joe",13,10 Далее цикл PING не правильный. По стандарту надо на PING сервера, отвечать PONG. И условие Код (Text): .while (flag !=0 ) не корректное. Переменная flag не нужна, а надо проверять возврат connect сразу. Также необходимо проверять возврат send при каждом вызове естесственно, т.к. в любой момент соединение с сетью может быть потеряно. А прога падает далеко не из-за сокетов, из-за неправильного завершения процесса.
у тебя часом не ZoneAlarm? он что-то плохо с ирц дружит. У мну тоже такое было. Хз че я исправил, но он стал потом пропускать меня в ирц.
Нашёл где подстава. Код (Text): invoke send, hSocket1, ping, sizeof ping, 0 здесь нужно указатель использовать Код (Text): invoke send, hSocket1, addr ping, sizeof ping, 0 вот так