Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.59.218.147] |
|
Сообщ.
#1
,
|
|
|
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; } } 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 секунду. |
Сообщ.
#2
,
|
|
|
22 минуты заняла отправка 0xffff узлов x 7 интерфейсов x 1 порт в выполнении в окончательной версии программы..
То есть 65536*7*1/22/60 = 347 отправок сообщений за 1 секунду. Добавлено Как найти соседние компьютеры из локального адресного пространства? Работает нереально медленно. |
Сообщ.
#3
,
|
|
|
Цитата Kozlov_Sergey @ предположительно 65000+ рабочих потоках. Я правильно понял, что у вас создано в одной программе более чем 65000 потоков? Кстати, сколько RAM на компе... |
Сообщ.
#4
,
|
|
|
Цитата Oleg2004 @ Я правильно понял, что у вас создано в одной программе более чем 65000 потоков? Кстати, сколько RAM на компе. Количество потоков, работающих одновременно, неизвестно (потенциально неограниченно). RAM: 4 GB + 4 GB (Всего 8 GB). Причём все обработчики событий кнопок и всего остального создают рабочие потоки и завершаются, чтобы программа не теряла управление пользователя. Минус этого: ещё нету затемнения кнопки для работы рабочего потока, но может ещё сделаю. Хотя все потоки являются повторно входимыми. От такого метода поиска компьютеров я уже отказался из-за неэффективновсти в силу огромности сети. Теперь использую ввод доменного имени или ipv4 или ipv6 адреса компьютера. Нашёл код для управления по UPnP соединением интернета. Исправил его. Но есть проблемы: Не работает 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. На портах перенаправленных через веб интерфейс модема всё работает отлично (для всё тех же всех программ). |
Сообщ.
#5
,
|
|
|
Цитата Kozlov_Sergey @ ICMP 144 Destination unreachable (Port unreachable) Первое что приходит в голову - модем работает - комп нет. |
Сообщ.
#6
,
|
|
|
Уже разобрались: nat loopback в службе upnp в модемах ZyXEL Keenetic не реализован.
Направил запрос на разработку. |
Сообщ.
#7
,
|
|
|
На счёт оперативной памяти:
помимо 8 GB есть ещё как минимум 1 TB свободного места на жёстком диске для использования в качестве оперативной памяти. |
Сообщ.
#8
,
|
|
|
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 #Бракоделы #Интернет |
Сообщ.
#9
,
|
|
|
Цитата Зачем постить скриншоты консольных сообщений, если можно просто постить сами сообщения в тех quote ? Затем, что это доказательство. M Все остальное оставьте при себе |
Сообщ.
#10
,
Сообщение отклонено: Oleg2004 -
|