smtp serv

Тема в разделе "WASM.ASSEMBLER", создана пользователем asm0day01, 4 фев 2022.

  1. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    128
    serv
    исходник
     

    Вложения:

    • smtp.rar
      Размер файла:
      2,7 КБ
      Просмотров:
      181
  2. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    128
    щас напишу рабочюю версию и _свой_ исходник, кто разберется тому респект!
    --- Сообщение объединено, 19 фев 2022 ---
    1 ое это мой файлик который _не_работает_ ((((((
    2 файлик который _работает_ ))
     

    Вложения:

    • 3-4-5.zip
      Размер файла:
      1,7 КБ
      Просмотров:
      138
    • serv_work.zip
      Размер файла:
      2,9 КБ
      Просмотров:
      149
  3. __sheva740

    __sheva740 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2017
    Сообщения:
    310
    Молодец!
    Так вот количество попыток и перерастает в качественный продукт.
    Только не опускай руки
    :)
     
    TrashGen и Mikl___ нравится это.
  4. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    сперва так сбрутфорсить код, чтобы конпилился, потом так - чтобы работал, а уж как он работает - да какая вообще разница)
     
  5. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Тут точно без бутылки генетического алгоритма не обойтись!
     
  6. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    128
    )))) где ошибка у меня в коде? )))))))))))))))))
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.250
    Ошибка может и есть, но ты только руки не опускай, это - самое главное, верь в себя и у тебя все получится!
     
  8. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    128
    чем и занимаюсь )
     
  9. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    128
    В общем народ... accept и connect виснет, результирующие функции... что делать? может защиты какие то...
     
  10. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Обратите внимание, вот здесь идеальный пример того, как новичок может задать вопрос.
    Вот пример похуже, автор кардинально плывет в теме, но все-таки он старается, добавляет скрины и пытается описать то как он понимает происходящее.

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

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    128
    По теме, есть ?
    --- Сообщение объединено, 27 фев 2022 ---
    по поводу кода?
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.250
     
  13. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Известно где.
     
  14. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    128
  15. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    128
    send выдает WSAENOTCONN (00002749)

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

    Вложения:

    • net.rar
      Размер файла:
      1,6 КБ
      Просмотров:
      144
  16. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    128
  17. aa_dav

    aa_dav Active Member

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

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    128
    код в студию если можно...
     
  19. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    441
    Код (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

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.250
    Вангую, что ТС попросит код на ассемблере.