Спасибо за подсказку. Написал скрипт, при помощи программы Neo Sign 0f Misery, скрывающий окно. Затем при помощи отладчика посмотрел, как заполнено STARTUPINFO.
Народ,начал изучать WinSock.Вот наткнулся на исходники sams`a.Вот серверная часть: Code: .386 .model Flat, StdCall option casemap:none includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\wsock32.lib include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\wsock32.inc include \masm32\include\windows.inc .data wsadata WSADATA <> mCaption db "Error! Suxx!", 0 mText1 db "Error WSAStartUp", 0 mText2 db "Error2", 0 hSock DWORD ? hSock2 dd ? sin sockaddr_in <> sPort DWORD 6001 sIP db "127.0.0.1", 0 buffer db 1024 dup (0) mCaption2 db "Woohoo", 0 mText3 db "Connected!", 0 .code Main: 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 invoke inet_addr, ADDR sIP mov sin.sin_addr, eax mov sin.sin_family, AF_INET invoke bind, hSock, ADDR sin, sizeof sin invoke listen, hSock, SOMAXCONN invoke accept, hSock, NULL, NULL mov hSock2, eax datarecv: invoke recv, hSock2, ADDR buffer, 1024, 0 .if byte ptr buffer=="Q" invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption2, 0 jmp Quit .endif jmp datarecv Quit: invoke WSACleanup invoke ExitProcess, 0 end Main Клиент: Code: .386 .model flat, stdcall option casemap:none includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\wsock32.lib include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\wsock32.inc include \masm32\include\windows.inc .data wsadata WSADATA <> mCaption db "Error! Suxx!", 0 mText1 db "Error WSAStartUp", 0 mText2 db "Error Connect", 0 mText3 db "Error Send", 0 hSock DWORD ? hSock2 dd ? sin sockaddr_in <> sPort DWORD 6001 sIP db "127.0.0.1", 0 buffer db "Q", 0 .code Main: invoke WSAStartup, 101h, ADDR wsadata .if eax!=NULL 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 invoke inet_addr, ADDR sIP mov sin.sin_addr, eax mov sin.sin_family, AF_INET invoke connect, hSock, ADDR sin, sizeof sin .if eax==SOCKET_ERROR invoke MessageBoxA, 0, ADDR mText2, ADDR mCaption, 0 jmp Quit .endif mov hSock2, eax invoke send, hSock, ADDR buffer, sizeof buffer, 0 .if eax==SOCKET_ERROR invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption, 0 jmp Quit .endif Quit: invoke closesocket, hSock invoke WSACleanup invoke ExitProcess, 0 end Main А можно ли сделать,что-бы клиент коннектился с сервером с любого айпи?То есть сервер открыл порт,и обрабатывает запроосы с разных айпи.Или я что-то не допонимаю?
если в виду имеется, что у сервера есть несколько IP и все их нужно связать с сокетом, то при связывании(bind) следует передать в функцие константу INADDR_ANY(раная нулю) вместо IP адреса.
Кто подскажет?Почему не коннектится сокет?Вот исходники: Сервер: Code: .386 .model Flat, StdCall option casemap:none includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\wsock32.lib include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\wsock32.inc include \masm32\include\windows.inc .data wsadata WSADATA <> mCaption db "Error! Suxx!", 0 mText1 db "Error WSAStartUp", 0 mText2 db "Error2", 0 hSock DWORD ? hSock2 dd ? sin sockaddr_in <> sPort DWORD 5555 buffer db 1024 dup (0) mCaption2 db "Woohoo", 0 mText3 db "Connected!", 0 .code Main: 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 listen, hSock, SOMAXCONN invoke accept, hSock, NULL, NULL mov hSock2, eax datarecv: invoke recv, hSock2, ADDR buffer, 1024, 0 .if byte ptr buffer=="Q" invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption2, 0 jmp Quit .endif jmp datarecv Quit: invoke WSACleanup invoke ExitProcess, 0 end Main Клиент: Code: .386 .model flat, stdcall option casemap:none includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\wsock32.lib include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\wsock32.inc include \masm32\include\windows.inc .data wsadata WSADATA <> mCaption db "Error! Suxx!", 0 mText1 db "Error WSAStartUp", 0 mText2 db "Error Connect", 0 mText3 db "Error Send", 0 hSock DWORD ? hSock2 dd ? sin sockaddr_in <> sPort DWORD 5555 sIP db "ТУТ ВНЕШНИЙ АЙПИ СЕРВЕРА", 0 buffer db "Q", 0 .code Main: invoke WSAStartup, 101h, ADDR wsadata .if eax!=NULL 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 invoke inet_addr, ADDR sIP mov sin.sin_addr, eax mov sin.sin_family, AF_INET invoke connect, hSock, ADDR sin, sizeof sin .if eax==SOCKET_ERROR invoke MessageBoxA, 0, ADDR mText2, ADDR mCaption, 0 jmp Quit .endif mov hSock2, eax invoke send, hSock, ADDR buffer, sizeof buffer,0 .if eax==SOCKET_ERROR invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption, 0 jmp Quit .endif Quit: invoke closesocket, hSock invoke WSACleanup invoke ExitProcess, 0 end Main Пишет error connect,хотя при айпшнике 127.0.0.1 все работает нормально.В чем проблема? Может это из за того,что у меня стоит роутер?Даже при запуске у меня на компе,открывается порт 5555 если я сканирую мои внутренний айпи(192.168.1.102).А если внешний,то сканер показывается порт закрыт!
ты используешь sockaddr_in, на сколько я помню - это более новая версия структуры sockaddr. структура эволюционировала, но прототипы ф-й остались старыми. короче говоря - ф-я connect принимает указатель на структуру sockaddr, а ты ей передаешь указатель на sockaddr_in. может еще что то есть, но дальше не смотрел.
К стати вот еще: Code: struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; мы видим, что sin_addr - это обьект структуры in_addr. Смотрим: Code: typedef struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un; } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
Нет,ребят,мне кажется дело не в этом.У меня стоит роутер. У меня просто не открывается порт.Точнее если я у себя на компе запущу сервер,то при скане внутреннего айпи(192.168.1.102)-порт открыт.А при скане внешнего моего айпи- закрыт.Через хамачи все нормально работает .
Эм, а при чем тут вообще ассемблер и программирование? Настройки роутера -> Виртуальная машина. Перенаправленные с внешнего айпи на внутренний. Читай документацию.
А кто подскажет как программно открыть bat файл?Делал так: Code: invoke WinExec,addr file1,ShowWindow Вообще не чего не просиходит(( Пробовал еще вот так: Code: invoke CreateFile,addr file2,GENERIC_WRITE,FILE_SHARE_WRITE,0,0,FILE_ATTRIBUTE_NORMAL,0 mov [handle],eax invoke ShellExecute,handle,addr open1,addr file2,0,0,addr tmp1 Тоже самое(Нечего не происходит((
Code: invoke ShellExecute, 0, chr$("open"), chr$("file.bat"), 0, 0, SW_SHOW Макрос chr$ можно при необходимости заменить на адрес строки. Вообще, все же написано предельно ясно: http://msdn.microsoft.com/en-us/library/bb762153%28v=vs.85%29.aspx
Вот код: Code: .386 .model Flat, StdCall option casemap:none ;######################################################### includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib C:\masm32\lib\shell32.lib include \masm32\include\shell32.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\windows.inc ;########################################################## .data? handle dd ? tmp dd ? .data file1 db 'D:\boot.bat',0 open1 byte 'open',0 buffer db 'dir D:\>>1.txt',0 cr db 0dh,0ah chcp db 'chcp 1251',0 .code start: invoke CreateFile,addr file1,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0 mov [handle],eax invoke WriteFile,handle,addr chcp,9,addr tmp,0 invoke WriteFile,handle,addr cr,2,addr tmp,0 invoke WriteFile,handle,addr buffer,150,addr tmp,0 invoke Sleep,10000 invoke ShellExecute, handle,addr open1,addr file1,0,0,SW_SHOW invoke CloseHandle,handle invoke ExitProcess,0 end start
Я видел как я пишу.Почему тогда у меня все запускается?Если даже сделать не 150 а 14 байт прописывалось,все равно не запускается!
MTV, неужели не дано прочитать док по функции ShellExecute? Первый параметр - это не хендл файла, а хендл окна, а так как у тебя нет окон в приложении, то просто 0. Смотри мой предыдущий пост. Файл надо открыть, записать туда данные, потом закрыть, а потом запустить, как я показал выше. Кроме того, параметр FILE_SHARE_WRITE говорит о том, что пока ты держишь файл открытым, другая программа сможет открыть его только для записи, но никак не для чтения.
вот короче рабочий код. Code: ;This program was created in assembler editor .386 .model Flat, StdCall option casemap:none includelib lib\kernel32.lib includelib lib\user32.lib includelib lib\shell32.lib include include\shell32.inc include include\kernel32.inc include include\user32.inc include include\windows.inc .data? handle dd ? tmp dd ? .data file1 db 'D:\boot.bat',0 open1 BYTE "open",0 bufer db 'dir D:\ >>1.txt',0 cr db 0dh,0ah chcp db 'chcp 1251',0 .code start: invoke CreateFile,addr file1,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0 mov handle,eax invoke WriteFile,handle,addr chcp,9,addr tmp,0 invoke WriteFile,handle,addr cr,2,addr tmp,0 invoke WriteFile,handle,addr bufer,15,addr tmp,0 invoke CloseHandle,handle invoke ShellExecute,0,addr open1,addr file1,0,0,SW_SHOW invoke ExitProcess,0 end start