smtp serv

Discussion in 'WASM.ASSEMBLER' started by asm0day01, Feb 4, 2022.

  1. asm0day01

    asm0day01 Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2020
    Messages:
    132
    serv
    исходник
     

    Attached Files:

  2. asm0day01

    asm0day01 Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2020
    Messages:
    132
    щас напишу рабочюю версию и _свой_ исходник, кто разберется тому респект!
    --- Сообщение объединено, Feb 19, 2022 ---
    1 ое это мой файлик который _не_работает_ ((((((
    2 файлик который _работает_ ))
     

    Attached Files:

  3. __sheva740

    __sheva740 Active Member

    Blog Posts:
    0
    Joined:
    Oct 18, 2017
    Messages:
    312
    Молодец!
    Так вот количество попыток и перерастает в качественный продукт.
    Только не опускай руки
    :)
     
    TrashGen and Mikl___ like this.
  4. TrashGen

    TrashGen ТрещГен

    Blog Posts:
    0
    Joined:
    Mar 15, 2011
    Messages:
    1,201
    Location:
    подполье
    сперва так сбрутфорсить код, чтобы конпилился, потом так - чтобы работал, а уж как он работает - да какая вообще разница)
     
  5. ormoulu

    ormoulu Well-Known Member

    Blog Posts:
    0
    Joined:
    Jan 24, 2011
    Messages:
    1,206
    Тут точно без бутылки генетического алгоритма не обойтись!
     
  6. asm0day01

    asm0day01 Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2020
    Messages:
    132
    )))) где ошибка у меня в коде? )))))))))))))))))
     
  7. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    Ошибка может и есть, но ты только руки не опускай, это - самое главное, верь в себя и у тебя все получится!
     
  8. asm0day01

    asm0day01 Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2020
    Messages:
    132
    чем и занимаюсь )
     
  9. asm0day01

    asm0day01 Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2020
    Messages:
    132
    В общем народ... accept и connect виснет, результирующие функции... что делать? может защиты какие то...
     
  10. ormoulu

    ormoulu Well-Known Member

    Blog Posts:
    0
    Joined:
    Jan 24, 2011
    Messages:
    1,206
    Обратите внимание, вот здесь идеальный пример того, как новичок может задать вопрос.
    Вот пример похуже, автор кардинально плывет в теме, но все-таки он старается, добавляет скрины и пытается описать то как он понимает происходящее.

    Если у вас, как и у многих тут, есть нарушения, не позволяющие внятно сформулировать мысли, наверное стоит это упомянуть, у форумчан может появиться какое-то желание вам помогать. Потому что сейчас ваш стиль выглядит как неуважение и небрежность по отношению к своему и чужому потраченному времени.
     
  11. asm0day01

    asm0day01 Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2020
    Messages:
    132
    По теме, есть ?
    --- Сообщение объединено, Feb 27, 2022 ---
    по поводу кода?
     
  12. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
     
  13. ormoulu

    ormoulu Well-Known Member

    Blog Posts:
    0
    Joined:
    Jan 24, 2011
    Messages:
    1,206
    Известно где.
     
  14. asm0day01

    asm0day01 Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2020
    Messages:
    132
  15. asm0day01

    asm0day01 Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2020
    Messages:
    132
    send выдает WSAENOTCONN (00002749)

    The socket is not connected.
    что это?
     

    Attached Files:

    • net.rar
      File size:
      1.6 KB
      Views:
      217
  16. asm0day01

    asm0day01 Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2020
    Messages:
    132
  17. aa_dav

    aa_dav Active Member

    Blog Posts:
    0
    Joined:
    Dec 24, 2008
    Messages:
    525
    Давно уже не брал в руки сокеты, но глянул сейчас в свой код на Си и принцип в следующем - серверный сокет типа TCP/IP (STREAM) создаётся через socket/bind/listen - он теперь слушает попытки установить входящее соединение по серверному своему порту. В серверный такой сокет не надо делать send/recv. С ним надо делать accept который в случае попытки входящего соединения вернёт уже клиентский сокет - вот именно с ним надо делать send/recv.
    Один серверный сокет выполняет рукопожатие и даёт любое число клиенских сокетов point-to-point по которым уже происходит общение по своим клиентским портам.
    И любая функция может вернуть неудачу - все надо проверять на возвращаемые значения чтобы понимать на каком этапе происходит ошибка. Так тот же серверный сокет может не забиндится на порт если есть другой процесс уже занявший это число.
     
  18. asm0day01

    asm0day01 Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2020
    Messages:
    132
    код в студию если можно...
     
  19. aa_dav

    aa_dav Active Member

    Blog Posts:
    0
    Joined:
    Dec 24, 2008
    Messages:
    525
    Code (C++):
    1. /*static */ bool simple_server::set_socket_blocking( SOCKET fd, bool blocking )
    2. {
    3.     if ( fd == INVALID_SOCKET )
    4.         return false;
    5. #ifdef _WIN32
    6.     unsigned long mode = blocking ? 0 : 1;
    7.     return ( ioctlsocket( fd, FIONBIO, &mode ) == 0 ) ? true : false;
    8. #else
    9.     int flags = fcntl( fd, F_GETFL, 0 );
    10.     if ( flags == -1 )
    11.         return false;
    12.     flags = blocking ? (flags & ~O_NONBLOCK) : (flags | O_NONBLOCK);
    13.     return ( fcntl( fd, F_SETFL, flags ) == 0 ) ? true : false;
    14. #endif
    15. }
    16.  
    17. ...
    18.  
    19. void simple_server::cleanup()
    20. {
    21.     if ( wsa_started )
    22.     {
    23.         if ( client_s != INVALID_SOCKET )
    24.         {
    25.             closesocket( client_s );
    26.             client_s = INVALID_SOCKET;
    27.         }
    28.         if ( server_s != INVALID_SOCKET )
    29.         {
    30.             closesocket( server_s );
    31.             server_s = INVALID_SOCKET;
    32.             }
    33.         if ( bcast_s != INVALID_SOCKET )
    34.         {
    35.             closesocket( bcast_s );
    36.             bcast_s = INVALID_SOCKET;
    37.             }
    38.         WSACleanup();
    39.         wsa_started = false;
    40.     }
    41. }
    42.  
    43. // 0 - success, <0 - errors
    44. int simple_server::init( int port, int bcastp, const char *bcast_saddr, const char *bcast_msg )
    45. {
    46.     WSAData wData;
    47.     SOCKADDR_IN addr;
    48.     int res = 0; // ok
    49.     char broadcast = '1';
    50.     this->bcast_msg = bcast_msg;
    51.  
    52.     //writeToLog( "BCASTMSGIS:" + this->bcast_msg );
    53.  
    54.     error_msg.clear();
    55.     data.clear();
    56.  
    57.     if ( WSAStartup( MAKEWORD(2, 2), &wData ) != 0 )
    58.     {
    59.         error_msg = L"WSA Startup failure (" + getWSAErrorString() + L")";
    60.         res = -1;
    61.         goto fail;
    62.     }
    63.     wsa_started = true;
    64.  
    65.     // Setup server socket
    66.     addr.sin_addr.S_un.S_addr = INADDR_ANY;
    67.     addr.sin_port = htons( port );
    68.     addr.sin_family = AF_INET;
    69.     server_s = socket( AF_INET, SOCK_STREAM, 0 );
    70.     if ( server_s == INVALID_SOCKET ) {
    71.         error_msg = L"Socket creation failure (" + getWSAErrorString() + L")";
    72.         res = -2;
    73.         goto fail;
    74.     }
    75.     set_socket_blocking( server_s, false );
    76.     if ( bind( server_s, (struct sockaddr*)&addr, sizeof(addr) ) == SOCKET_ERROR )
    77.     {
    78.         error_msg = L"Socket bind failure (" + getWSAErrorString() + L")";
    79.         res = -3;
    80.         goto fail;
    81.     }
    82.     if ( listen( server_s, SOMAXCONN ) == SOCKET_ERROR )
    83.     {
    84.         error_msg = std::wstring( L"Listening at port " ) + longToStr( ntohs( addr.sin_port ) ) + L" failed (" + getWSAErrorString() + L")";
    85.         res = -4;
    86.         goto fail;
    87.     }
    88.  
    89.     // Setup broadcast socket
    90.     bcast_s = socket( AF_INET, SOCK_DGRAM, 0 );
    91.     if ( bcast_s == INVALID_SOCKET ) {
    92.         error_msg = L"Broadcast socket creation failure (" + getWSAErrorString() + L")";
    93.         res = -5;
    94.         goto fail;
    95.     }
    96.     if ( setsockopt( bcast_s, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof( broadcast ) ) < 0 )
    97.     {
    98.         error_msg = L"Broadcast init failure (" + getWSAErrorString() + L")";
    99.         res = -6;
    100.         goto fail;
    101.     }
    102.     bcast_addr.sin_family       = AF_INET;      
    103.     bcast_addr.sin_port         = htons( bcastp );  
    104.     //bcast_addr.sin_addr.s_addr  = INADDR_BROADCAST;
    105.     bcast_addr.sin_addr.s_addr = inet_addr( bcast_saddr ); //"192.168.0.255" );
    106.  
    107.     goto end;    // all is ok
    108. fail:
    109.     cleanup();
    110. end:
    111.     return res;
    112. }
    113.  
    114. // <0 - errors
    115. // 0 - pending...
    116. // 1 - client has connected
    117. // 2 - client normally disconnected
    118. // 3 - data was read
    119. int simple_server::tick()
    120. {
    121.     const int buf_size = 1024;
    122.     char buf[ buf_size ];
    123.     SOCKADDR_IN addr_c;
    124.     int addrlen = sizeof( addr_c );
    125.  
    126.     error_msg.clear();
    127.     if ( server_s == INVALID_SOCKET )
    128.     {
    129.         error_msg = L"Server socket is not initialized!";
    130.         return -1;
    131.     }
    132.     if ( bcast_s == INVALID_SOCKET )
    133.     {
    134.         error_msg = L"Broadcast socket is not initialized!";
    135.         return -1;
    136.     }
    137.     if ( client_s == INVALID_SOCKET )
    138.     {
    139.         // broadcast...
    140.         sendto( bcast_s, bcast_msg.c_str(), bcast_msg.size(), 0, (sockaddr *)&bcast_addr, sizeof( bcast_addr ) );
    141.        
    142.         // Listen for clients...
    143.         client_s = accept( server_s, (struct sockaddr*)&addr_c, &addrlen );
    144.         if ( client_s != INVALID_SOCKET )
    145.         {
    146.             set_socket_blocking( client_s, false );
    147.             client_address[ 0 ] = addr_c.sin_addr.S_un.S_un_b.s_b1;
    148.             client_address[ 1 ] = addr_c.sin_addr.S_un.S_un_b.s_b2;
    149.             client_address[ 2 ] = addr_c.sin_addr.S_un.S_un_b.s_b3;
    150.             client_address[ 3 ] = addr_c.sin_addr.S_un.S_un_b.s_b4;
    151.             data.clear();
    152.             return 1;    // client has connected
    153.         }
    154.     }
    155.     if ( client_s != INVALID_SOCKET )
    156.     {
    157.         int read = recv( client_s, buf, buf_size, 0 );
    158.         if ( read == SOCKET_ERROR )
    159.         {
    160.             int err = WSAGetLastError();
    161.             if ( err != WSAEWOULDBLOCK )
    162.             {
    163.                 error_msg = L"Client socket error (" + getWSAErrorString() + L")";
    164.                 closesocket( client_s );
    165.                 client_s = INVALID_SOCKET;
    166.                 return -2;
    167.             }
    168.         }
    169.         else
    170.         {
    171.             if ( read == 0 )
    172.             {
    173.                 closesocket( client_s );
    174.                 client_s = INVALID_SOCKET;
    175.                 return 2;
    176.             }
    177.             for ( int i = 0; i < read; i++ )
    178.             {
    179.                 data.push_back( buf[ i ] );
    180.             }
    181.             return 3; // data was read
    182.         }
    183.     }
    184.     return 0;
    185. }
    186.  
    Немного пояснений - это _однопоточная_ и в этом смысле примитивная и простая в использовании библиотека которая рассылает броадкастом по UDP адрес текущего сервера любому потенциальному клиенту в локальной сети, устанавливает связь с клиентом через серверный сокет и считывает в буфер (vector) data всё что тот ему пошлёт пока соединение не закроется.
    В связи с этим во первых все сокеты переводятся в неблокирующий режим (сразу возвращают управление, если новый событий нет).
    А интерфейс к этому объекту выглядит крайне примитивно:
    1. вызываем init и если он вернул 0, то:
    2. периодически вызываем (вызов неблокирующий, паузы надо выдерживать самому) tick.
    Результат tick есть руководство к последующему действию:
    0 - ничего интересного не произошло (ждём и снова вызываем tick)
    1 - присоединился новый клиент (больше одного за заход либка не поддерживает)
    в этот момент внешний код может взять client_s и послать ему что-либо через send (как и в любой другой момент пока клиент подключен)
    2 - клиент отвалился по собственной инициативе, можно прекратить всю деятельность или ждать следующего клиента
    3 - клиент прислал новую порцию данных - она добавится к массиву data
    < 0 - произошла ошибка

    Такой простой интерфейс позволяет обходить сложность многопоточки и мне вполне подходил.
     
  20. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    Вангую, что ТС попросит код на ассемблере.