На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Как найти соседние компьютеры из локального адресного пространства , Работает нереально медленно.
      ExpandedWrap disabled
        UINT __cdecl datagram_connect_connection_thread_ip_6(LPVOID parameter)
        {
            thread_connect_parameters_structure_type *local_connect_thread_parameters_structure = (thread_connect_parameters_structure_type *)parameter;
         
            if(local_connect_thread_parameters_structure==NULL)
            {
                return 0;
            }
         
            Cstl_network_ip_4_ip_6_udp_engineDlg *local_main_dialog = (local_connect_thread_parameters_structure)->parameter_main_dialog;
         
            if(local_main_dialog==NULL)
            {
                delete local_connect_thread_parameters_structure;
                return 0;
            }
         
            CString local_address(localhost_definition);
         
            CStringA local_address_internet_address;
         
            in6_addr ia6;
            sockaddr_in6 addr6;
            int ret = 0;
            int idx = 0;
         
            while(1)
            {
                ret = network::ip_6::lookup_addr_indx_ip_6(idx, &addr6);
                if(ret < 0)
                {
                    break;
                }
                else if(ret == 0)
                {
                    break;
                }
         
                ia6 = addr6.sin6_addr;
         
                char local_address_buffer[100];
                inet_ntop(AF_INET6,&ia6,local_address_buffer,100);
                //      printf("address %d: %s\n", idx, local_address_buffer);
                idx++;
         
                local_address = CString(local_address_buffer);
         
                for(DWORD local_low_subnet_temp_number=0;local_low_subnet_temp_number<=0xFFFF;local_low_subnet_temp_number++)
                {
         
                    for(UINT local_parameter_port_number=port_number_start_const;local_parameter_port_number<=port_number_end_const;local_parameter_port_number++)
                    {
                        {
                            void *local_connect_thread_parameters_structure_loop = new thread_connect_parameters_structure_loop_type;
         
                            ((thread_connect_parameters_structure_loop_type*)local_connect_thread_parameters_structure_loop)->thread_connect_parameters_structure_parameter = *local_connect_thread_parameters_structure;
         
                            ((thread_connect_parameters_structure_loop_type*)local_connect_thread_parameters_structure_loop)->local_address = local_address;    
                            ((thread_connect_parameters_structure_loop_type*)local_connect_thread_parameters_structure_loop)->local_address_internet_address = local_address_internet_address;
         
                            ((thread_connect_parameters_structure_loop_type*)local_connect_thread_parameters_structure_loop)->local_low_subnet_temp_number = local_low_subnet_temp_number;
                            ((thread_connect_parameters_structure_loop_type*)local_connect_thread_parameters_structure_loop)->local_parameter_port_number = local_parameter_port_number;
         
                            CWinThread *local_thread = AfxBeginThread(datagram_connect_connection_thread_loop_ip_6,local_connect_thread_parameters_structure_loop);
                        }
                    }
         
                    if(local_main_dialog->get_command_threads_stop())
                    {
                        break;
                    }
                    else
                    {
                        Sleep(1);
                    }
                }
                if(local_main_dialog->get_command_threads_stop())
                {
                    break;
                }
                else
                {
                    Sleep(1);
                }
            }
         
            {
                delete local_connect_thread_parameters_structure;
                return 1;
            }
        }


      ExpandedWrap disabled
        UINT __cdecl datagram_connect_connection_thread_loop_ip_6(LPVOID parameter)
        {
            thread_connect_parameters_structure_loop_type *local_connect_thread_parameters_structure_loop = (thread_connect_parameters_structure_loop_type *)parameter;
         
            if(local_connect_thread_parameters_structure_loop==NULL)
            {
                return 0;
            }
         
            Cstl_network_ip_4_ip_6_udp_engineDlg *local_main_dialog = local_connect_thread_parameters_structure_loop->thread_connect_parameters_structure_parameter.parameter_main_dialog;
         
            if(local_main_dialog==NULL)
            {
                delete local_connect_thread_parameters_structure_loop;
                return 0;
            }
         
            network::ip_6::CBlockingSocket_ip_6 local_blocking_socket;
         
            if(network::ip_6::domain_name_to_internet_6_name(local_connect_thread_parameters_structure_loop->local_address,local_connect_thread_parameters_structure_loop->local_address_internet_address)==false)
            {
                const int local_error_message_size = 10000;
                wchar_t local_error_message[local_error_message_size];
         
                const int local_system_error_message_size = local_error_message_size-1000;
                wchar_t local_system_error_message[local_system_error_message_size];
         
                wcscpy_s(local_system_error_message,local_system_error_message_size,L"domain_name_to_internet_6_name завершилась неудачей");
         
                CString local_time_string = CTime::GetCurrentTime().FormatGmt("%d/%m/%y %H:%M:%S GMT");
         
                wsprintf((wchar_t*)local_error_message, L"Сетевая ошибка -- %s -- %s\r\n", local_system_error_message, local_time_string.GetBuffer());
         
                delete local_connect_thread_parameters_structure_loop;
         
                //          MessageBox(0,local_error_message,CString(L"Error"),MB_ICONERROR);
         
                return 0;
            }
         
            network::ip_6::CSockAddr_ip_6 local_socket_address_temp(local_connect_thread_parameters_structure_loop->local_address_internet_address,local_connect_thread_parameters_structure_loop->local_parameter_port_number);
         
            CStringA local_address_internet_address_temp = CStringA(local_socket_address_temp.DottedDecimal());
            for(int local_char_counter=local_address_internet_address_temp.GetLength();local_char_counter>=0;local_char_counter--)
            {
                CStringA local_address_internet_address_temp_1;
                for(int local_char_counter_1=0;local_char_counter_1<local_char_counter-1;local_char_counter_1++)
                {
                    local_address_internet_address_temp_1 += local_address_internet_address_temp.GetAt(local_char_counter_1);
                }
                if(local_address_internet_address_temp_1.GetAt(local_address_internet_address_temp_1.GetLength()-1)==':')
                {
                    local_address_internet_address_temp = local_address_internet_address_temp_1;
                    break;
                }
            }
            local_connect_thread_parameters_structure_loop->local_address_internet_address.Format("%s%x",local_address_internet_address_temp,local_connect_thread_parameters_structure_loop->local_low_subnet_temp_number);
         
            network::ip_6::CSockAddr_ip_6 local_socket_address(local_connect_thread_parameters_structure_loop->local_address_internet_address,local_connect_thread_parameters_structure_loop->local_parameter_port_number);
         
            try
            {
                local_blocking_socket.Create(SOCK_DGRAM);
            }
            catch(network::ip_6::CBlockingSocketException_ip_6 *local_blocking_socket_exception)
            {
                const int local_error_message_size = 10000;
                wchar_t local_error_message[local_error_message_size];
         
                const int local_system_error_message_size = local_error_message_size-1000;
                wchar_t local_system_error_message[local_system_error_message_size];
         
                CString local_time_string = CTime::GetCurrentTime().FormatGmt("%d/%m/%y %H:%M:%S GMT");
         
                local_blocking_socket_exception->GetErrorMessage(local_system_error_message,local_system_error_message_size);
         
                wsprintf((wchar_t*)local_error_message, L"Сетевая ошибка -- %s -- %s\r\n", local_system_error_message, local_time_string.GetBuffer());
         
                local_blocking_socket_exception->Delete();
         
                delete local_connect_thread_parameters_structure_loop;
         
                //          MessageBox(0,local_error_message,CString(L"Error"),MB_ICONERROR);
         
                return 0;
            }
         
            int local_bytes_sent = 0;
            int local_error_number = 0;
         
            try
            {
                local_bytes_sent = local_blocking_socket.SendDatagram(service_signature,service_signature_definition_length,local_socket_address,CONST_WAIT_TIME_SEND);
            }
            catch(network::ip_6::CBlockingSocketException_ip_6 *local_blocking_socket_exception)
            {
                const int local_error_message_size = 10000;
                wchar_t local_error_message[local_error_message_size];
         
                const int local_system_error_message_size = local_error_message_size;
                wchar_t local_system_error_message[local_system_error_message_size];
         
                CString local_time_string = CTime::GetCurrentTime().FormatGmt("%d/%m/%y %H:%M:%S GMT");
         
                local_blocking_socket_exception->GetErrorMessage(local_system_error_message,local_system_error_message_size);
         
                wsprintf((wchar_t*)local_error_message, L"Сетевая ошибка -- %s -- %s\r\n", local_system_error_message, local_time_string.GetBuffer());
         
                local_error_number = local_blocking_socket_exception->GetErrorNumber();
         
                local_blocking_socket_exception->Delete();
         
                if(local_error_number!=0)
                {
                    //              MessageBox(0,local_error_message,CString(L"Error"),MB_ICONERROR);
                }
            }
         
            local_blocking_socket.Close();
         
            if(local_bytes_sent<=0 && local_error_number==0)
            {
                //          MessageBox(0,CString(L"local_bytes_sent<=0"),CString(L"Error"),MB_ICONERROR);
            }
         
            {
                delete local_connect_thread_parameters_structure_loop;
                return 1;
            }
        }


      Поясню свою идею:
      создаётся количество рабочих потоков 0xffff (диапазон ip_6 соседних адресов) на количество нужных для проверки портов (диапазон) для каждого локального интерфейса,
      в каждом потоке отправляются данные по сформированному адресу и порту, поток завершается.

      В итоге, как минимум на локальном компьютере на адресе ::0 должны обнаружиться сервисы программы на каждом интерфейсе.

      Если прямо указать нужный локальный адрес, то сервис обнаруживается.

      Почему работает так медленно?

      Ждал по 10 минут безрезультатно.

      Включал профилировщик Visual Studio 2012 - 30 % времени выполняется ws2_32.

      Загрузка 8 ядерного центрального процессора 6 %.

      Непонятно, почему там мало при предположительно 65000+ рабочих потоках.

      Реальное количество рабочих потоков посмотреть не могу в диспетчере задач из-за его упрощённости в Windows 10.

      Добавлено
      34 минуты заняла отправка 0xffff узлов x 7 интерфейсов x 1 порт в выполнении по кнопке F5.

      То есть 65536*7*1/34/60 = 225 отправок сообщений за 1 секунду.
        22 минуты заняла отправка 0xffff узлов x 7 интерфейсов x 1 порт в выполнении в окончательной версии программы..

        То есть 65536*7*1/22/60 = 347 отправок сообщений за 1 секунду.

        Добавлено
        Как найти соседние компьютеры из локального адресного пространства? Работает нереально медленно.
          Цитата Kozlov_Sergey @
          предположительно 65000+ рабочих потоках.

          Я правильно понял, что у вас создано в одной программе более чем 65000 потоков?
          Кстати, сколько RAM на компе... :)
            Цитата Oleg2004 @
            Я правильно понял, что у вас создано в одной программе более чем 65000 потоков?
            Кстати, сколько RAM на компе.

            Количество потоков, работающих одновременно, неизвестно (потенциально неограниченно).
            RAM: 4 GB + 4 GB (Всего 8 GB).

            Причём все обработчики событий кнопок и всего остального создают рабочие потоки и завершаются, чтобы программа не теряла управление пользователя.
            Минус этого: ещё нету затемнения кнопки для работы рабочего потока, но может ещё сделаю.
            Хотя все потоки являются повторно входимыми.

            От такого метода поиска компьютеров я уже отказался из-за неэффективновсти в силу огромности сети.

            Теперь использую ввод доменного имени или ipv4 или ipv6 адреса компьютера.
            Нашёл код для управления по UPnP соединением интернета.
            Исправил его.

            Но есть проблемы:

            ExpandedWrap disabled
              Не работает UPnP службы моего модема.
              ZyXEL - бракоделы.
              Я им на них же жалобу накатал.
              У меня модем плохо работает: служба модема UPnP не работает - поэтому я не могу проверить свою новую программу, которую сделал за несколько дней.


            Кстати полезная программа для TCP: http://zyxel.ru/openport

            В Wireshark поймал такие пакеты при перенаправленном порту UDP 10000 на порт UDP 10000:
            1) пакет к модему на внешний адрес
            771 5.265655 172.16.100.10 86.57.152.110 UDP 116 55690 → 10000 Len=74
            2) пакет от модема на компьютер
            772 5.266105 86.57.152.110 172.16.100.10 ICMP 144 Destination unreachable (Port unreachable)


            Кто может помочь разобраться с происхождением пакета "ICMP 144 Destination unreachable (Port unreachable)"?

            Проверял ещё и TCP на правилах перенаправления портов, созданных через службу UPnP: ошибка соединения 10061.

            На портах перенаправленных через веб интерфейс модема всё работает отлично (для всё тех же всех программ).
              Цитата Kozlov_Sergey @
              ICMP 144 Destination unreachable (Port unreachable)

              Первое что приходит в голову - модем работает - комп нет.
                Уже разобрались: nat loopback в службе upnp в модемах ZyXEL Keenetic не реализован.

                Направил запрос на разработку.
                  На счёт оперативной памяти:
                  помимо 8 GB есть ещё как минимум 1 TB свободного места на жёстком диске для использования в качестве оперативной памяти.
                    A) Бракоделы из ZyXEL не хотят ничего делать и не хотят работать даже за деньги, а только предлагают покупать новые свои железяки:

                    1) nat loopback в службе upnp в модемах ZyXEL Keenetic отказались делать;
                    2) микропрограмму версии v2.06 делают уже я года и она появилась якобы только в новых железяках, которые они и хотят заставить покупать;
                    3) в микропрограмме версии v2.06 якобы сделана реализация ограничения скорости по интерфейсам, ipv4 и ipv6 адресам и портам UDP и TCP по моему заказу.

                    B) У провайдера VELCOM Беларусь мобильный интернет совсем не работает:
                    1) служба dns не работает;
                    2) ping не работает;
                    3) задержки в городе Минске по 3 секунды при успешном (меньше 25 % случаев) ping ответе в на ping.

                    Прикреплённая картинка
                    Прикреплённая картинка
                    Прикреплённая картинка
                    Прикреплённая картинка
                    Прикреплённая картинка
                    Прикреплённая картинка


                    #ZyXEL
                    #VELCOM
                    #Бракоделы
                    #Интернет
                    Сообщение отредактировано: Kozlov_Sergey -
                      Цитата

                      Зачем постить скриншоты консольных сообщений, если можно просто постить сами сообщения в тех quote ?


                      Затем, что это доказательство.

                      M
                      Все остальное оставьте при себе :)
                      Сообщение отредактировано: Oleg2004 -
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0810 ]   [ 19 queries used ]   [ Generated: 26.04.24, 11:07 GMT ]