From e93f84fcd780a08e8b1d497359411f67c19dfdda Mon Sep 17 00:00:00 2001 From: Zhong Yang Date: Sat, 10 Apr 2021 23:18:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=BD=91=E9=80=9F=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=94=B9=E4=B8=BAGetIfTable2=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=B6=85=E8=BF=874GB=E4=BB=A5=E4=B8=8A?= =?UTF-8?q?=E7=9A=84=E7=BD=91=E9=80=9F=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TrafficMonitor/AdapterCommon.cpp | 72 ++++++------ TrafficMonitor/AdapterCommon.h | 40 +++---- TrafficMonitor/Common.cpp | 49 +------- TrafficMonitor/Common.h | 38 +++++- TrafficMonitor/CommonData.h | 2 +- TrafficMonitor/NetworkInfoDlg.cpp | 169 +++++++++++++++------------ TrafficMonitor/NetworkInfoDlg.h | 28 ++--- TrafficMonitor/TrafficMonitor.cpp | 4 +- TrafficMonitor/TrafficMonitor.h | 4 +- TrafficMonitor/TrafficMonitor.rc | Bin 250354 -> 251316 bytes TrafficMonitor/TrafficMonitorDlg.cpp | 67 +++++------ TrafficMonitor/TrafficMonitorDlg.h | 3 +- TrafficMonitor/resource.h | Bin 47180 -> 47450 bytes 13 files changed, 238 insertions(+), 238 deletions(-) diff --git a/TrafficMonitor/AdapterCommon.cpp b/TrafficMonitor/AdapterCommon.cpp index 36d3138..b7e363c 100644 --- a/TrafficMonitor/AdapterCommon.cpp +++ b/TrafficMonitor/AdapterCommon.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "AdapterCommon.h" @@ -14,27 +14,27 @@ CAdapterCommon::~CAdapterCommon() void CAdapterCommon::GetAdapterInfo(vector& adapters) { adapters.clear(); - PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO(); //PIP_ADAPTER_INFO½á¹¹ÌåÖ¸Õë´æ´¢±¾»úÍø¿¨ÐÅÏ¢ - unsigned long stSize = sizeof(IP_ADAPTER_INFO); //µÃµ½½á¹¹Ìå´óС,ÓÃÓÚGetAdaptersInfo²ÎÊý - int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize); //µ÷ÓÃGetAdaptersInfoº¯Êý,Ìî³äpIpAdapterInfoÖ¸Õë±äÁ¿;ÆäÖÐstSize²ÎÊý¼ÈÊÇÒ»¸öÊäÈëÁ¿Ò²ÊÇÒ»¸öÊä³öÁ¿ + PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO(); //PIP_ADAPTER_INFO结构体指针存储本机网å�¡ä¿¡æ�¯ + unsigned long stSize = sizeof(IP_ADAPTER_INFO); //得到结构体大å°�,用于GetAdaptersInfoå�‚æ•° + int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize); //调用GetAdaptersInfo函数,å¡«å……pIpAdapterInfo指针å�˜é‡�;其中stSizeå�‚数既是一个输入é‡�也是一个输出é‡� if (ERROR_BUFFER_OVERFLOW == nRel) { - //Èç¹ûº¯Êý·µ»ØµÄÊÇERROR_BUFFER_OVERFLOW - //Ôò˵Ã÷GetAdaptersInfo²ÎÊý´«µÝµÄÄÚ´æ¿Õ¼ä²»¹»,ͬʱÆä´«³östSize,±íʾÐèÒªµÄ¿Õ¼ä´óС - //ÕâÒ²ÊÇ˵Ã÷ΪʲôstSize¼ÈÊÇÒ»¸öÊäÈëÁ¿Ò²ÊÇÒ»¸öÊä³öÁ¿ - delete pIpAdapterInfo; //ÊÍ·ÅÔ­À´µÄÄÚ´æ¿Õ¼ä - pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize]; //ÖØÐÂÉêÇëÄÚ´æ¿Õ¼äÓÃÀ´´æ´¢ËùÓÐÍø¿¨ÐÅÏ¢ - nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize); //Ôٴε÷ÓÃGetAdaptersInfoº¯Êý,Ìî³äpIpAdapterInfoÖ¸Õë±äÁ¿ + //如果函数返回的是ERROR_BUFFER_OVERFLOW + //则说明GetAdaptersInfoå�‚数传递的内存空间ä¸�够,å�Œæ—¶å…¶ä¼ å‡ºstSize,表示需è¦�的空间大å°� + //这也是说明为什么stSize既是一个输入é‡�也是一个输出é‡� + delete pIpAdapterInfo; //释放原æ�¥çš„内存空间 + pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize]; //é‡�新申请内存空间用æ�¥å­˜å‚¨æ‰€æœ‰ç½‘å�¡ä¿¡æ�¯ + nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize); //å†�次调用GetAdaptersInfo函数,å¡«å……pIpAdapterInfo指针å�˜é‡� } - PIP_ADAPTER_INFO pIpAdapterInfoHead = pIpAdapterInfo; //±£´æpIpAdapterInfoÁ´±íÖеÚÒ»¸öÔªËØµÄµØÖ· + PIP_ADAPTER_INFO pIpAdapterInfoHead = pIpAdapterInfo; //ä¿�å­˜pIpAdapterInfo链表中第一个元素的地å�€ if (ERROR_SUCCESS == nRel) { while (pIpAdapterInfo) { NetWorkConection connection; - connection.description = pIpAdapterInfo->Description; + connection.description = CCommon::StrToUnicode(pIpAdapterInfo->Description); connection.ip_address = CCommon::StrToUnicode(pIpAdapterInfo->IpAddressList.IpAddress.String); connection.subnet_mask = CCommon::StrToUnicode(pIpAdapterInfo->IpAddressList.IpMask.String); connection.default_gateway = CCommon::StrToUnicode(pIpAdapterInfo->GatewayList.IpAddress.String); @@ -43,7 +43,7 @@ void CAdapterCommon::GetAdapterInfo(vector& adapters) pIpAdapterInfo = pIpAdapterInfo->Next; } } - //ÊÍ·ÅÄÚ´æ¿Õ¼ä + //释放内存空间 if (pIpAdapterInfoHead) { delete pIpAdapterInfoHead; @@ -51,7 +51,7 @@ void CAdapterCommon::GetAdapterInfo(vector& adapters) if (adapters.empty()) { NetWorkConection connection{}; - connection.description = CCommon::UnicodeToStr(CCommon::LoadText(L"<", IDS_NO_CONNECTION, L">")); + connection.description = CCommon::LoadText(L"<", IDS_NO_CONNECTION, L">"); adapters.push_back(connection); } } @@ -74,39 +74,39 @@ void CAdapterCommon::RefreshIpAddress(vector& adapters) } } -void CAdapterCommon::GetIfTableInfo(vector& adapters, MIB_IFTABLE* pIfTable) +void CAdapterCommon::GetIfTableInfo(vector& adapters, MIB_IF_TABLE2* pIfTable) { - //ÒÀ´ÎÔÚIfTableÀï²éÕÒÿ¸öÁ¬½Ó + //ä¾�次在IfTable里查找æ¯�个连接 for (size_t i{}; i < adapters.size(); i++) { if (adapters[i].description.empty()) continue; int index; index = FindConnectionInIfTable(adapters[i].description, pIfTable); - if (index == -1) //Èç¹ûʹÓþ«È·Æ¥ÅäµÄ·½Ê½Ã»ÓÐÕÒµ½£¬Ôò²ÉÓÃÄ£ºýÆ¥ÅäµÄ·½Ê½ÔÙ²éÕÒÒ»´Î + if (index == -1) //如果使用精确匹é…�的方å¼�没有找到,则采用模糊匹é…�的方å¼�å†�查找一次 index = FindConnectionInIfTableFuzzy(adapters[i].description, pIfTable); //if (index != -1) //{ adapters[i].index = index; - adapters[i].in_bytes = pIfTable->table[index].dwInOctets; - adapters[i].out_bytes = pIfTable->table[index].dwOutOctets; - adapters[i].description_2 = (const char*)pIfTable->table[index].bDescr; + adapters[i].in_bytes = pIfTable->Table[index].InOctets; + adapters[i].out_bytes = pIfTable->Table[index].OutOctets; + adapters[i].description_2 = pIfTable->Table[index].Description; //} } } -void CAdapterCommon::GetAllIfTableInfo(vector& adapters, MIB_IFTABLE * pIfTable) +void CAdapterCommon::GetAllIfTableInfo(vector& adapters, MIB_IF_TABLE2 * pIfTable) { vector adapters_tmp; - GetAdapterInfo(adapters_tmp); //»ñÈ¡IPµØÖ· + GetAdapterInfo(adapters_tmp); //获å�–IP地å�€ adapters.clear(); - for (size_t i{}; i < pIfTable->dwNumEntries; i++) + for (size_t i{}; i < pIfTable->NumEntries; i++) { NetWorkConection connection; - connection.description = connection.description_2 = (const char*)pIfTable->table[i].bDescr; + connection.description = connection.description_2 = pIfTable->Table[i].Description; connection.index = i; - connection.in_bytes = pIfTable->table[i].dwInOctets; - connection.out_bytes = pIfTable->table[i].dwOutOctets; + connection.in_bytes = pIfTable->Table[i].InOctets; + connection.out_bytes = pIfTable->Table[i].OutOctets; for (size_t j{}; j < adapters_tmp.size(); j++) { if (connection.description.find(adapters_tmp[j].description) != string::npos) @@ -121,24 +121,24 @@ void CAdapterCommon::GetAllIfTableInfo(vector& adapters, MIB_I } } -int CAdapterCommon::FindConnectionInIfTable(string connection, MIB_IFTABLE* pIfTable) +int CAdapterCommon::FindConnectionInIfTable(wstring connection, MIB_IF_TABLE2* pIfTable) { - for (size_t i{}; i < pIfTable->dwNumEntries; i++) + for (size_t i{}; i < pIfTable->NumEntries; i++) { - string descr = (const char*)pIfTable->table[i].bDescr; + wstring descr = pIfTable->Table[i].Description; if (descr == connection) return i; } return -1; } -int CAdapterCommon::FindConnectionInIfTableFuzzy(string connection, MIB_IFTABLE* pIfTable) +int CAdapterCommon::FindConnectionInIfTableFuzzy(wstring connection, MIB_IF_TABLE2* pIfTable) { - for (size_t i{}; i < pIfTable->dwNumEntries; i++) + for (size_t i{}; i < pIfTable->NumEntries; i++) { - string descr = (const char*)pIfTable->table[i].bDescr; + wstring descr = pIfTable->Table[i].Description; size_t index; - //Ôڽϳ¤µÄ×Ö·û´®Àï²éÕҽ϶̵Ä×Ö·û´® + //在较长的字符串里查找较短的字符串 if (descr.size() >= connection.size()) index = descr.find(connection); else @@ -146,12 +146,12 @@ int CAdapterCommon::FindConnectionInIfTableFuzzy(string connection, MIB_IFTABLE* if (index != wstring::npos) return i; } - //Èç¹û»¹ÊÇûÓÐÕÒµ½£¬ÔòʹÓÃ×Ö·û´®Æ¥ÅäËã·¨²éÕÒ + //如果还是没有找到,则使用字符串匹é…�算法查找 double max_degree{}; int best_index{}; - for (size_t i{}; i < pIfTable->dwNumEntries; i++) + for (size_t i{}; i < pIfTable->NumEntries; i++) { - string descr = (const char*)pIfTable->table[i].bDescr; + wstring descr = pIfTable->Table[i].Description; double degree = CCommon::StringSimilarDegree_LD(descr, connection); if (degree > max_degree) { diff --git a/TrafficMonitor/AdapterCommon.h b/TrafficMonitor/AdapterCommon.h index 51e57bb..7735121 100644 --- a/TrafficMonitor/AdapterCommon.h +++ b/TrafficMonitor/AdapterCommon.h @@ -1,17 +1,17 @@ -#pragma once +#pragma once #include "Common.h" -//±£´æÒ»¸öÍøÂçÁ¬½ÓÐÅÏ¢ +//ä¿�存一个网络连接信æ�¯ struct NetWorkConection { - int index{}; //¸ÃÁ¬½ÓÔÚMIB_IFTABLEÖеÄË÷Òý - string description; //ÍøÂçÃèÊö£¨»ñÈ¡×ÔGetAdapterInfo£© - string description_2; //ÍøÂçÃèÊö£¨»ñÈ¡×ÔGetIfTable£© - unsigned int in_bytes; //³õʼʱÒѽÓÊÕ×Ö½ÚÊý - unsigned int out_bytes; //³õʼʱÒÑ·¢ËÍ×Ö½ÚÊý - wstring ip_address{ L"-.-.-.-" }; //IPµØÖ· - wstring subnet_mask{ L"-.-.-.-" }; //×ÓÍøÑÚÂë - wstring default_gateway{ L"-.-.-.-" }; //ĬÈÏÍø¹Ø + int index{}; //该连接在MIB_IF_TABLE2中的索引 + wstring description; //网络æ��述(获å�–自GetAdapterInfo) + wstring description_2; //网络æ��述(获å�–自GetIfTable) + unsigned __int64 in_bytes; //åˆ�始时已接收字节数 + unsigned __int64 out_bytes; //åˆ�å§‹æ—¶å·²å�‘é€�字节数 + wstring ip_address{ L"-.-.-.-" }; //IP地å�€ + wstring subnet_mask{ L"-.-.-.-" }; //å­�网掩ç � + wstring default_gateway{ L"-.-.-.-" }; //默认网关 }; class CAdapterCommon @@ -20,22 +20,22 @@ public: CAdapterCommon(); ~CAdapterCommon(); - //»ñÈ¡ÍøÂçÁ¬½ÓÁÐ±í£¬Ìî³äÍøÂçÃèÊö¡¢IPµØÖ·¡¢×ÓÍøÑÚÂ롢ĬÈÏÍø¹ØÐÅÏ¢ + //获å�–网络连接列表,填充网络æ��è¿°ã€�IP地å�€ã€�å­�网掩ç �ã€�默认网关信æ�¯ static void GetAdapterInfo(vector& adapters); - //Ë¢ÐÂÍøÂçÁ¬½ÓÁбíÖеÄIPµØÖ·¡¢×ÓÍøÑÚÂ롢ĬÈÏÍø¹ØÐÅÏ¢ + //刷新网络连接列表中的IP地å�€ã€�å­�网掩ç �ã€�默认网关信æ�¯ static void RefreshIpAddress(vector& adapters); - //»ñÈ¡ÍøÂçÁбíÖÐÿ¸öÍøÂçÁ¬½ÓµÄMIB_IFTABLEÖеÄË÷Òý¡¢³õʼʱÒѽÓÊÕ/·¢ËÍ×Ö½ÚÊýµÄÐÅÏ¢ - static void GetIfTableInfo(vector& adapters, MIB_IFTABLE* pIfTable); + //获å�–网络列表中æ¯�个网络连接的MIB_IF_TABLE2中的索引ã€�åˆ�始时已接收/å�‘é€�字节数的信æ�¯ + static void GetIfTableInfo(vector& adapters, MIB_IF_TABLE2* pIfTable); - //Ö±½Ó½«MIB_IFTABLEÖеÄËùÓÐÁ¬½ÓÌí¼Óµ½adaptersÈÝÆ÷ÖÐ - static void GetAllIfTableInfo(vector& adapters, MIB_IFTABLE* pIfTable); + //直接将MIB_IF_TABLE2中的所有连接添加到adapters容器中 + static void GetAllIfTableInfo(vector& adapters, MIB_IF_TABLE2* pIfTable); private: - //¸ù¾ÝÒ»¸öÍøÂçÁ¬½ÓÃèÊöÅжÏÊÇ·ñÔÚIfTableÁбíÀ·µ»ØË÷Òý£¬ÕÒ²»µ½Ôò·µ»Ø-1 - static int FindConnectionInIfTable(string connection, MIB_IFTABLE* pIfTable); + //æ ¹æ�®ä¸€ä¸ªç½‘络连接æ��述判断是å�¦åœ¨IfTable列表里,返回索引,找ä¸�到则返回-1 + static int FindConnectionInIfTable(wstring connection, MIB_IF_TABLE2* pIfTable); - //¸ù¾ÝÒ»¸öÍøÂçÁ¬½ÓÃèÊöÅжÏÊÇ·ñÔÚIfTable½ÓÁбíÀ·µ»ØË÷Òý£¬ÕÒ²»µ½Ôò·µ»Ø-1¡£Ö»ÐèÒª²¿·ÖÆ¥Åä - static int FindConnectionInIfTableFuzzy(string connection, MIB_IFTABLE* pIfTable); + //æ ¹æ�®ä¸€ä¸ªç½‘络连接æ��述判断是å�¦åœ¨IfTable接列表里,返回索引,找ä¸�到则返回-1。å�ªéœ€è¦�部分匹é…� + static int FindConnectionInIfTableFuzzy(wstring connection, MIB_IF_TABLE2* pIfTable); }; diff --git a/TrafficMonitor/Common.cpp b/TrafficMonitor/Common.cpp index 477a183..4f6a4e4 100644 --- a/TrafficMonitor/Common.cpp +++ b/TrafficMonitor/Common.cpp @@ -76,7 +76,7 @@ const char* CCommon::GetFileContent(const wchar_t* file_path, size_t& length, bo return buff; } -CString CCommon::DataSizeToString(unsigned int size, const PublicSettingData& cfg) +CString CCommon::DataSizeToString(unsigned long long size, const PublicSettingData& cfg) { //CString str; CString value_str, unit_str; @@ -751,25 +751,21 @@ CString CCommon::LoadTextFormat(UINT id, const std::initializer_list& return StringFormat(str.GetString(), paras); } -CString CCommon::IntToString(int n, bool thousand_separation, bool is_unsigned) +CString CCommon::IntToString(__int64 n, bool thousand_separation, bool is_unsigned) { - CString str; - if(is_unsigned) - str.Format(_T("%u"), static_cast(n)); - else - str.Format(_T("%d"), n); - int length{ str.GetLength() }; + wstring str = std::to_wstring(is_unsigned ? static_cast(n) : n); int count{}; if (thousand_separation) { + int length{ static_cast(str.size()) }; for (int i{ length - 1 }; i > 0; i--) { count++; if (count % 3 == 0) - str.Insert(i, _T(",")); + str.insert(i, L","); } } - return str; + return str.c_str(); } void CCommon::NormalizeFont(LOGFONT & font) @@ -840,39 +836,6 @@ void CCommon::WStringCopy(wchar_t * str_dest, int dest_size, const wchar_t * str str_dest[dest_size - 1] = L'\0'; } -double CCommon::StringSimilarDegree_LD(const string & srcString, const string & matchString) -{ - int n = srcString.size(); - int m = matchString.size(); - //int[, ] d = new int[n + 1, m + 1]; // matrix - vector> d(n + 1, vector(m + 1)); - int cost; // cost - // Step 1(如果其中一个字符串长度为0,则相似度为1)? - //if (n == 0) return (double)m / max(srcString.size(), matchString.size()); - //if (m == 0) return (double)n / max(srcString.size(), matchString.size()); - if (n == 0 || m == 0) return 0.0; //如果其中一个字符串长度为0,则相似度为0 - // Step 2 - for (int i = 0; i <= n; d[i][0] = i++); - for (int j = 0; j <= m; d[0][j] = j++); - // Step 3 - for (int i = 1; i <= n; i++) - { - //Step 4 - for (int j = 1; j <= m; j++) - { - // Step 5 - cost = (matchString.substr(j - 1, 1) == srcString.substr(i - 1, 1) ? 0 : 1); - // Step 6 - d[i][j] = min(min(d[i - 1][j] + 1, d[i][j - 1] + 1), d[i - 1][j - 1] + cost); - } - } - - // Step 7 - double ds = 1 - (double)d[n][m] / max(srcString.size(), matchString.size()); - - return ds; -} - void CCommon::SetThreadLanguage(Language language) { switch (language) diff --git a/TrafficMonitor/Common.h b/TrafficMonitor/Common.h index f121f7e..8a67dca 100644 --- a/TrafficMonitor/Common.h +++ b/TrafficMonitor/Common.h @@ -117,7 +117,7 @@ public: size:数æ�®çš„字节数 返回值:转æ�¢å�Žçš„字符串 */ - static CString DataSizeToString(unsigned int size, const PublicSettingData& cfg); + static CString DataSizeToString(unsigned long long size, const PublicSettingData& cfg); static CString DataSizeToString(unsigned long long size); //将温度信æ�¯è½¬æ�¢æˆ�字符串 @@ -220,7 +220,7 @@ public: //n:è¦�转æ�¢çš„æ•°å€¼ //thousand_separation:是å�¦è¦�æ¯�éš”3ä½�数使用逗å�·åˆ†éš” //is_unsigned:数值是å�¦æ˜¯æ— ç¬¦å�·çš„ - static CString IntToString(int n, bool thousand_separation = false, bool is_unsigned = false); + static CString IntToString(__int64 n, bool thousand_separation = false, bool is_unsigned = false); //删除字体å��ç§°å�Žé�¢çš„Boldã€�Light等字符串,并根æ�®è¿™äº›å­—符串设置字体粗细 static void NormalizeFont(LOGFONT& font); @@ -232,7 +232,39 @@ public: /// 字符串相似度算法-编辑è·�离法 /// /// 返回的值为0~1,越大相似度越高 - static double StringSimilarDegree_LD(const string& srcString, const string& matchString); + template + static double StringSimilarDegree_LD(const T& srcString, const T& matchString) + { + int n = srcString.size(); + int m = matchString.size(); + //int[, ] d = new int[n + 1, m + 1]; // matrix + vector> d(n + 1, vector(m + 1)); + int cost; // cost + // Step 1(如果其中一个字符串长度为0,则相似度为1)? + //if (n == 0) return (double)m / max(srcString.size(), matchString.size()); + //if (m == 0) return (double)n / max(srcString.size(), matchString.size()); + if (n == 0 || m == 0) return 0.0; //如果其中一个字符串长度为0,则相似度为0 + // Step 2 + for (int i = 0; i <= n; d[i][0] = i++); + for (int j = 0; j <= m; d[0][j] = j++); + // Step 3 + for (int i = 1; i <= n; i++) + { + //Step 4 + for (int j = 1; j <= m; j++) + { + // Step 5 + cost = (matchString.substr(j - 1, 1) == srcString.substr(i - 1, 1) ? 0 : 1); + // Step 6 + d[i][j] = min(min(d[i - 1][j] + 1, d[i][j - 1] + 1), d[i - 1][j - 1] + cost); + } + } + + // Step 7 + double ds = 1 - (double)d[n][m] / max(srcString.size(), matchString.size()); + + return ds; + } //设置线程语言 static void SetThreadLanguage(Language language); diff --git a/TrafficMonitor/CommonData.h b/TrafficMonitor/CommonData.h index 8a6a4bc..a9d04c5 100644 --- a/TrafficMonitor/CommonData.h +++ b/TrafficMonitor/CommonData.h @@ -214,7 +214,7 @@ struct MainConfigData bool m_auto_select{ false }; //自动选择连接 bool m_select_all{ false }; //统计所有连接的网速 - string m_connection_name; //当å‰�选择网络的å��ç§° + wstring m_connection_name; //当å‰�选择网络的å��ç§° wstring m_skin_name; //选择的皮肤的å��ç§° int m_dft_notify_icon = 0; //默认的通知图标(用于区分win10的深色和浅色模å¼�) diff --git a/TrafficMonitor/NetworkInfoDlg.cpp b/TrafficMonitor/NetworkInfoDlg.cpp index e6acb6f..b263813 100644 --- a/TrafficMonitor/NetworkInfoDlg.cpp +++ b/TrafficMonitor/NetworkInfoDlg.cpp @@ -1,4 +1,4 @@ -// CNetworkInfoDlg.cpp : ʵÏÖÎļþ +// CNetworkInfoDlg.cpp : 实现文件 // #include "stdafx.h" @@ -7,12 +7,12 @@ #include "afxdialogex.h" -// CNetworkInfoDlg ¶Ô»°¿ò +// CNetworkInfoDlg 对è¯�框 IMPLEMENT_DYNAMIC(CNetworkInfoDlg, CBaseDialog) -CNetworkInfoDlg::CNetworkInfoDlg(vector& adapters, MIB_IFROW* pIfRow, int connection_selected, CWnd* pParent /*=NULL*/) - : CBaseDialog(IDD_NETWORK_INFO_DIALOG, pParent), m_connections(adapters), m_pIfRow(pIfRow), m_connection_selected(connection_selected) +CNetworkInfoDlg::CNetworkInfoDlg(vector& adapters, MIB_IF_TABLE2*& pIfTable, int connection_selected, CWnd* pParent /*=NULL*/) + : CBaseDialog(IDD_NETWORK_INFO_DIALOG, pParent), m_connections(adapters), m_pIfTable(pIfTable), m_connection_selected(connection_selected) { m_current_connection = connection_selected; } @@ -25,13 +25,13 @@ CNetworkInfoDlg::~CNetworkInfoDlg() void CNetworkInfoDlg::ShowInfo() { CString temp; - MIB_IFROW& network_info = m_pIfRow[m_connections[m_connection_selected].index]; - //½Ó¿ÚÃû - m_info_list.SetItemText(0, 1, network_info.wszName); - //½Ó¿ÚÃèÊö - m_info_list.SetItemText(1, 1, CCommon::StrToUnicode((const char*)network_info.bDescr).c_str()); - //Á¬½ÓÀàÐÍ - switch (network_info.dwType) + MIB_IF_ROW2 network_info = m_pIfTable->Table[m_connections[m_connection_selected].index]; + //接å�£å�� + m_info_list.SetItemText(0, 1, network_info.Alias); + //接å�£æ��è¿° + m_info_list.SetItemText(1, 1, network_info.Description); + //连接类型 + switch (network_info.Type) { case IF_TYPE_OTHER: temp = CCommon::LoadText(IDS_IF_TYPE_OTHER); break; case IF_TYPE_ETHERNET_CSMACD: temp = CCommon::LoadText(IDS_IF_TYPE_ETHERNET_CSMACD); break; @@ -49,56 +49,71 @@ void CNetworkInfoDlg::ShowInfo() default: temp = CCommon::LoadText(IDS_UNKNOW_CONNECTION); break; } m_info_list.SetItemText(2, 1, temp); - //ËÙ¶È - temp.Format(_T("%dMbps"), network_info.dwSpeed / 1000000); + //速度 + temp.Format(_T("%dMbps"), network_info.TransmitLinkSpeed / 1000000); m_info_list.SetItemText(3, 1, temp); - //ÊÊÅäÆ÷ÎïÀíµØÖ· + //适é…�器物ç�†åœ°å�€ temp = _T(""); char buff[3]; - for (size_t i{}; i < network_info.dwPhysAddrLen; i++) + for (size_t i{}; i < network_info.PhysicalAddressLength; i++) { - sprintf_s(buff, "%.2x", network_info.bPhysAddr[i]); + sprintf_s(buff, "%.2x", network_info.PhysicalAddress[i]); temp += buff; - if (i != network_info.dwPhysAddrLen - 1) + if (i != network_info.PhysicalAddressLength - 1) temp += _T('-'); } m_info_list.SetItemText(4, 1, temp); - //IPµØÖ· + //IP地å�€ m_info_list.SetItemText(5, 1, m_connections[m_connection_selected].ip_address.c_str()); - //×ÓÍøÑÚÂë + //å­�网掩ç � m_info_list.SetItemText(6, 1, m_connections[m_connection_selected].subnet_mask.c_str()); - //ĬÈÏÍø¹Ø + //默认网关 m_info_list.SetItemText(7, 1, m_connections[m_connection_selected].default_gateway.c_str()); - //Á¬½Ó״̬ - switch (network_info.dwOperStatus) + //连接状æ€� + switch (network_info.OperStatus) { - case IF_OPER_STATUS_NON_OPERATIONAL: temp = CCommon::LoadText(IDS_IF_OPER_STATUS_NON_OPERATIONAL); break; - case IF_OPER_STATUS_UNREACHABLE: temp = CCommon::LoadText(IDS_IF_OPER_STATUS_UNREACHABLE); break; - case IF_OPER_STATUS_DISCONNECTED: temp = CCommon::LoadText(IDS_IF_OPER_STATUS_DISCONNECTED); break; - case IF_OPER_STATUS_CONNECTING: temp = CCommon::LoadText(IDS_IF_OPER_STATUS_CONNECTING); break; - case IF_OPER_STATUS_CONNECTED: temp = CCommon::LoadText(IDS_IF_OPER_STATUS_CONNECTED); break; - case IF_OPER_STATUS_OPERATIONAL: temp = CCommon::LoadText(IDS_IF_OPER_STATUS_OPERATIONAL); break; - default: temp = CCommon::LoadText(IDS_UNKNOW_STATUS); break; + //case IF_OPER_STATUS_NON_OPERATIONAL: temp = CCommon::LoadText(IDS_IF_OPER_STATUS_NON_OPERATIONAL); break; + //case IF_OPER_STATUS_UNREACHABLE: temp = CCommon::LoadText(IDS_IF_OPER_STATUS_UNREACHABLE); break; + //case IF_OPER_STATUS_DISCONNECTED: temp = CCommon::LoadText(IDS_IF_OPER_STATUS_DISCONNECTED); break; + //case IF_OPER_STATUS_CONNECTING: temp = CCommon::LoadText(IDS_IF_OPER_STATUS_CONNECTING); break; + //case IF_OPER_STATUS_CONNECTED: temp = CCommon::LoadText(IDS_IF_OPER_STATUS_CONNECTED); break; + //case IF_OPER_STATUS_OPERATIONAL: temp = CCommon::LoadText(IDS_IF_OPER_STATUS_OPERATIONAL); break; + case IfOperStatusUp: + temp = CCommon::LoadText(IDS_IF_OPER_STATUS_UP); + break; + case IfOperStatusDown: + case IfOperStatusNotPresent: + case IfOperStatusLowerLayerDown: + temp = CCommon::LoadText(IDS_IF_OPER_STATUS_DOWN); + break; + case IfOperStatusTesting: + case IfOperStatusUnknown: + temp = CCommon::LoadText(IDS_UNKNOW_STATUS); + break; + case IfOperStatusDormant: + temp = CCommon::LoadText(IDS_IF_OPER_STATUS_DORMANT); + break; + default: temp = CCommon::LoadText(IDS_UNKNOW_STATUS); break; } m_info_list.SetItemText(8, 1, temp); - //ÒѽÓÊÕ×Ö½ÚÊý - temp.Format(_T("%s (%s)"), CCommon::IntToString(network_info.dwInOctets, true, true), CCommon::DataSizeToString(network_info.dwInOctets)); + //已接收字节数 + temp.Format(_T("%s (%s)"), CCommon::IntToString(network_info.InOctets, true, true), CCommon::DataSizeToString(network_info.InOctets)); m_info_list.SetItemText(9, 1, temp); - //ÒÑ·¢ËÍ×Ö½ÚÊý - temp.Format(_T("%s (%s)"), CCommon::IntToString(network_info.dwOutOctets, true, true), CCommon::DataSizeToString(network_info.dwOutOctets)); + //å·²å�‘é€�字节数 + temp.Format(_T("%s (%s)"), CCommon::IntToString(network_info.OutOctets, true, true), CCommon::DataSizeToString(network_info.OutOctets)); m_info_list.SetItemText(10, 1, temp); - //×Ô³ÌÐòÆô¶¯ÒÔÀ´ÒѽÓÊÕ×Ö½ÚÊý - unsigned int in_bytes_since_start; - in_bytes_since_start = network_info.dwInOctets - m_connections[m_connection_selected].in_bytes; + //自程åº�å�¯åЍ以æ�¥å·²æŽ¥æ”¶å­—节数 + unsigned __int64 in_bytes_since_start; + in_bytes_since_start = network_info.InOctets - m_connections[m_connection_selected].in_bytes; temp.Format(_T("%s (%s)"), CCommon::IntToString(in_bytes_since_start, true, true), CCommon::DataSizeToString(in_bytes_since_start)); m_info_list.SetItemText(11, 1, temp); - //×Ô³ÌÐòÆô¶¯ÒÔÀ´ÒÑ·¢ËÍ×Ö½ÚÊý - unsigned int out_bytes_since_start; - out_bytes_since_start = network_info.dwOutOctets - m_connections[m_connection_selected].out_bytes; + //自程åº�å�¯åЍ以æ�¥å·²å�‘é€�字节数 + unsigned __int64 out_bytes_since_start; + out_bytes_since_start = network_info.OutOctets - m_connections[m_connection_selected].out_bytes; temp.Format(_T("%s (%s)"), CCommon::IntToString(out_bytes_since_start, true, true), CCommon::DataSizeToString(out_bytes_since_start)); m_info_list.SetItemText(12, 1, temp); - //ÏÔʾµ±Ç°Ñ¡Ôñָʾ + //显示当å‰�选择指示 CString str; str.Format(_T("%d/%d"), m_connection_selected + 1, m_connections.size()); SetDlgItemText(IDC_INDEX_STATIC, str); @@ -112,7 +127,7 @@ void CNetworkInfoDlg::ShowInfo() void CNetworkInfoDlg::GetProgramElapsedTime() { - //³ÌÐòÒÑÔËÐÐʱ¼ä + //程åº�å·²è¿�行时间 SYSTEMTIME current_time, time; GetLocalTime(¤t_time); time = CCommon::CompareSystemTime(current_time, m_start_time); @@ -123,13 +138,13 @@ void CNetworkInfoDlg::GetProgramElapsedTime() UINT CNetworkInfoDlg::GetInternetIPThreadFunc(LPVOID lpParam) { - CCommon::SetThreadLanguage(theApp.m_general_data.language); //ÉèÖÃÏß³ÌÓïÑÔ + CCommon::SetThreadLanguage(theApp.m_general_data.language); //设置线程语言 CNetworkInfoDlg* p_instance = (CNetworkInfoDlg*)lpParam; wstring ip_address, ip_location; //IPV4 - CCommon::GetInternetIp2(ip_address, ip_location, false); //»ñÈ¡ÍâÍøIPµØÖ·£¬ - if (!IsWindow(p_instance->GetSafeHwnd())) //Èç¹ûµ±Ç°¶Ô»°¿òÒѾ­Ïú»Ù£¬ÔòÍ˳öÏß³Ì + CCommon::GetInternetIp2(ip_address, ip_location, false); //获å�–外网IP地å�€ï¼Œ + if (!IsWindow(p_instance->GetSafeHwnd())) //如果当å‰�对è¯�框已ç»�销æ¯�,则退出线程 return 0; if (!ip_address.empty()) { @@ -147,8 +162,8 @@ UINT CNetworkInfoDlg::GetInternetIPThreadFunc(LPVOID lpParam) //IPV6 wstring ipv6_address, ipv6_location; - CCommon::GetInternetIp2(ip_address, ip_location, true); //»ñÈ¡ÍâÍøIPµØÖ·£¬ - if (!IsWindow(p_instance->GetSafeHwnd())) //Èç¹ûµ±Ç°¶Ô»°¿òÒѾ­Ïú»Ù£¬ÔòÍ˳öÏß³Ì + CCommon::GetInternetIp2(ip_address, ip_location, true); //获å�–外网IP地å�€ï¼Œ + if (!IsWindow(p_instance->GetSafeHwnd())) //如果当å‰�对è¯�框已ç»�销æ¯�,则退出线程 return 0; if (!ip_address.empty()) { @@ -192,31 +207,31 @@ BEGIN_MESSAGE_MAP(CNetworkInfoDlg, CBaseDialog) END_MESSAGE_MAP() -// CNetworkInfoDlg ÏûÏ¢´¦Àí³ÌÐò +// CNetworkInfoDlg 消æ�¯å¤„ç�†ç¨‹åº� BOOL CNetworkInfoDlg::OnInitDialog() { CBaseDialog::OnInitDialog(); - // TODO: ÔÚ´ËÌí¼Ó¶îÍâµÄ³õʼ»¯ + // TODO: 在此添加é¢�外的åˆ�始化 SetWindowText(CCommon::LoadText(IDS_TITLE_CONNECTION_DETIAL)); - SetIcon(theApp.GetMenuIcon(IDI_INFO), FALSE); // ÉèÖÃСͼ±ê + SetIcon(theApp.GetMenuIcon(IDI_INFO), FALSE); // 设置å°�图标 - //ÖØÐ»ñÈ¡IPµØÖ· + //é‡�新获å�–IP地å�€ CAdapterCommon::RefreshIpAddress(m_connections); - //³õʼ»¯ÁÐ±í¿Ø¼þ + //åˆ�始化列表控件 CRect rect; m_info_list.GetClientRect(rect); m_info_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP); int width0, width1; width0 = rect.Width() / 4; width1 = rect.Width() - width0 - theApp.DPI(20) - 1; - m_info_list.InsertColumn(0, CCommon::LoadText(IDS_ITEM), LVCFMT_LEFT, width0); //²åÈëµÚ0ÁÐ - m_info_list.InsertColumn(1, CCommon::LoadText(IDS_VALUE), LVCFMT_LEFT, width1); //²åÈëµÚ1ÁÐ + m_info_list.InsertColumn(0, CCommon::LoadText(IDS_ITEM), LVCFMT_LEFT, width0); //æ�’入第0列 + m_info_list.InsertColumn(1, CCommon::LoadText(IDS_VALUE), LVCFMT_LEFT, width1); //æ�’入第1列 - //ÏòÁбíÖвåÈëÐÐ + //å�‘列表中æ�’入行 m_info_list.InsertItem(0, CCommon::LoadText(IDS_INTERFACE_NAME)); m_info_list.InsertItem(1, CCommon::LoadText(IDS_INTERFACE_DESCRIPTION)); m_info_list.InsertItem(2, CCommon::LoadText(IDS_CONNECTION_TYPE)); @@ -244,7 +259,7 @@ BOOL CNetworkInfoDlg::OnInitDialog() m_info_list.SetItemText(15, 1, CCommon::LoadText(IDS_DOUBLE_CLICK_TO_ACQUIRE)); //} - //ÏÔʾÁбíÖеÄÐÅÏ¢ + //显示列表中的信æ�¯ LOGFONT lf{}; GetFont()->GetLogFont(&lf); lf.lfWeight = FW_BOLD; @@ -254,23 +269,23 @@ BOOL CNetworkInfoDlg::OnInitDialog() //CCommon::GetInternetIp(); //if (theApp.m_cfg_data.m_show_internet_ip) - // m_pGetIPThread = AfxBeginThread(GetInternetIPThreadFunc, this); //Æô¶¯»ñÈ¡ÍâÍøIPµÄÏß³Ì + // m_pGetIPThread = AfxBeginThread(GetInternetIPThreadFunc, this); //å�¯åŠ¨èŽ·å�–外网IP的线程 - //SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); //È¡ÏûÖö¥ + //SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); //å�–消置顶 m_info_list.GetToolTips()->SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); - m_menu.LoadMenu(IDR_INFO_MENU); //×°ÔØÓÒ¼ü²Ëµ¥ + m_menu.LoadMenu(IDR_INFO_MENU); //装载å�³é”®è�œå�• SetTimer(CONNECTION_DETAIL_TIMER, 1000, NULL); return TRUE; // return TRUE unless you set the focus to a control - // Òì³£: OCX ÊôÐÔÒ³Ó¦·µ»Ø FALSE + // 异常: OCX 属性页应返回 FALSE } void CNetworkInfoDlg::OnCopyText() { - // TODO: ÔÚ´ËÌí¼ÓÃüÁî´¦Àí³ÌÐò´úÂë + // TODO: 在此添加命令处ç�†ç¨‹åº�代ç � if (!CCommon::CopyStringToClipboard(wstring(m_selected_string))) MessageBox(CCommon::LoadText(IDS_COPY_TO_CLIPBOARD_FAILED), NULL, MB_ICONWARNING); } @@ -279,19 +294,19 @@ void CNetworkInfoDlg::OnCopyText() void CNetworkInfoDlg::OnNMRClickInfoList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); - // TODO: ÔÚ´ËÌí¼Ó¿Ø¼þ֪ͨ´¦Àí³ÌÐò´úÂë + // TODO: 在此添加控件通知处ç�†ç¨‹åº�代ç � - //»ñÈ¡Êó±êµã»÷´¦µÄÎı¾ + //获å�–鼠标点击处的文本 int item, sub_item; item = pNMItemActivate->iItem; sub_item = pNMItemActivate->iSubItem; m_selected_string = m_info_list.GetItemText(item, sub_item); - //µ¯³öÓÒ¼ü²Ëµ¥ - CMenu* pContextMenu = m_menu.GetSubMenu(0); //»ñÈ¡µÚÒ»¸öµ¯³ö²Ëµ¥ - CPoint point1; //¶¨ÒåÒ»¸öÓÃÓÚÈ·¶¨¹â±êλÖõÄλÖà - GetCursorPos(&point1); //»ñÈ¡µ±Ç°¹â±êµÄλÖã¬ÒÔ±ãʹµÃ²Ëµ¥¿ÉÒÔ¸úËæ¹â±ê - pContextMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point1.x, point1.y, this); //ÔÚÖ¸¶¨Î»ÖÃÏÔʾµ¯³ö²Ëµ¥ + //弹出å�³é”®è�œå�• + CMenu* pContextMenu = m_menu.GetSubMenu(0); //获å�–第一个弹出è�œå�• + CPoint point1; //定义一个用于确定光标ä½�置的ä½�ç½® + GetCursorPos(&point1); //获å�–当å‰�光标的ä½�置,以便使得è�œå�•å�¯ä»¥è·Ÿéš�光标 + pContextMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point1.x, point1.y, this); //在指定ä½�置显示弹出è�œå�• *pResult = 0; } @@ -299,8 +314,8 @@ void CNetworkInfoDlg::OnNMRClickInfoList1(NMHDR *pNMHDR, LRESULT *pResult) void CNetworkInfoDlg::OnClose() { - // TODO: ÔÚ´ËÌí¼ÓÏûÏ¢´¦Àí³ÌÐò´úÂëºÍ/»òµ÷ÓÃĬÈÏÖµ - //¶Ô»°¿ò¹Ø±ÕÊ±Ç¿ÖÆ½áÊø»ñÈ¡IPµØÖ·µÄÏß³Ì + // TODO: 在此添加消æ�¯å¤„ç�†ç¨‹åº�代ç �å’Œ/或调用默认值 + //对è¯�框关闭时强制结æ�ŸèŽ·å�–IP地å�€çš„线程 //if(theApp.m_cfg_data.m_show_internet_ip) // TerminateThread(m_pGetIPThread->m_hThread, 0); CBaseDialog::OnClose(); @@ -309,7 +324,7 @@ void CNetworkInfoDlg::OnClose() void CNetworkInfoDlg::OnBnClickedPreviousButton() { - // TODO: ÔÚ´ËÌí¼Ó¿Ø¼þ֪ͨ´¦Àí³ÌÐò´úÂë + // TODO: 在此添加控件通知处ç�†ç¨‹åº�代ç � if (m_connection_selected > 0) { m_connection_selected--; @@ -320,7 +335,7 @@ void CNetworkInfoDlg::OnBnClickedPreviousButton() void CNetworkInfoDlg::OnBnClickedNextButton() { - // TODO: ÔÚ´ËÌí¼Ó¿Ø¼þ֪ͨ´¦Àí³ÌÐò´úÂë + // TODO: 在此添加控件通知处ç�†ç¨‹åº�代ç � if (m_connection_selected < m_connections.size() - 1) { m_connection_selected++; @@ -331,7 +346,7 @@ void CNetworkInfoDlg::OnBnClickedNextButton() BOOL CNetworkInfoDlg::PreTranslateMessage(MSG* pMsg) { - // TODO: ÔÚ´ËÌí¼ÓרÓôúÂëºÍ/»òµ÷ÓûùÀà + // TODO: 在此添加专用代ç �å’Œ/或调用基类 if (pMsg->message == WM_KEYDOWN) { if (pMsg->wParam == VK_LEFT) @@ -353,7 +368,7 @@ BOOL CNetworkInfoDlg::PreTranslateMessage(MSG* pMsg) void CNetworkInfoDlg::OnTimer(UINT_PTR nIDEvent) { - // TODO: ÔÚ´ËÌí¼ÓÏûÏ¢´¦Àí³ÌÐò´úÂëºÍ/»òµ÷ÓÃĬÈÏÖµ + // TODO: 在此添加消æ�¯å¤„ç�†ç¨‹åº�代ç �å’Œ/或调用默认值 if (nIDEvent == CONNECTION_DETAIL_TIMER) { GetProgramElapsedTime(); @@ -364,8 +379,8 @@ void CNetworkInfoDlg::OnTimer(UINT_PTR nIDEvent) BOOL CNetworkInfoDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { - // TODO: ÔÚ´ËÌí¼ÓÏûÏ¢´¦Àí³ÌÐò´úÂëºÍ/»òµ÷ÓÃĬÈÏÖµ - //ͨ¹ýÊó±ê¹öÂÖ·­Ò³ + // TODO: 在此添加消æ�¯å¤„ç�†ç¨‹åº�代ç �å’Œ/或调用默认值 + //通过鼠标滚轮翻页 if (zDelta > 0) { OnBnClickedPreviousButton(); @@ -382,8 +397,8 @@ BOOL CNetworkInfoDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) void CNetworkInfoDlg::OnNMDblclkInfoList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); - // TODO: ÔÚ´ËÌí¼Ó¿Ø¼þ֪ͨ´¦Àí³ÌÐò´úÂë - if (/*!theApp.m_cfg_data.m_show_internet_ip && */!m_ip_acquired && (pNMItemActivate->iItem == 14 || pNMItemActivate->iItem == 15)) //Ë«»÷ÁËIPµØÖ·Ò»ÐÐʱ + // TODO: 在此添加控件通知处ç�†ç¨‹åº�代ç � + if (/*!theApp.m_cfg_data.m_show_internet_ip && */!m_ip_acquired && (pNMItemActivate->iItem == 14 || pNMItemActivate->iItem == 15)) //å�Œå‡»äº†IP地å�€ä¸€è¡Œæ—¶ { m_info_list.SetItemText(14, 1, CCommon::LoadText(IDS_ACQUIRING, _T("..."))); m_info_list.SetItemText(15, 1, CCommon::LoadText(IDS_ACQUIRING, _T("..."))); diff --git a/TrafficMonitor/NetworkInfoDlg.h b/TrafficMonitor/NetworkInfoDlg.h index bf846df..7825587 100644 --- a/TrafficMonitor/NetworkInfoDlg.h +++ b/TrafficMonitor/NetworkInfoDlg.h @@ -1,51 +1,51 @@ -#pragma once +#pragma once #include"Common.h" #include "afxcmn.h" #include "AdapterCommon.h" #include "BaseDialog.h" -// CNetworkInfoDlg ¶Ô»°¿ò +// CNetworkInfoDlg 对è¯�框 class CNetworkInfoDlg : public CBaseDialog { DECLARE_DYNAMIC(CNetworkInfoDlg) public: - CNetworkInfoDlg(vector& adapters, MIB_IFROW* pIfRow, int connection_selected, CWnd* pParent = NULL); // ±ê×¼¹¹Ô캯Êý + CNetworkInfoDlg(vector& adapters, MIB_IF_TABLE2*& pIfTable, int connection_selected, CWnd* pParent = NULL); // 标准构造函数 virtual ~CNetworkInfoDlg(); -// ¶Ô»°¿òÊý¾Ý +// 对è¯�框数æ�® #ifdef AFX_DESIGN_TIME enum { IDD = IDD_NETWORK_INFO_DIALOG }; #endif - SYSTEMTIME m_start_time; //³ÌÐòÆô¶¯µÄʱ¼ä + SYSTEMTIME m_start_time; //程åº�å�¯åŠ¨çš„æ—¶é—´ protected: vector& m_connections; - MIB_IFROW* m_pIfRow; - int m_connection_selected; //µ±Ç°¶Ô»°¿òÏÔʾµÄÁ¬½Ó - int m_current_connection; //³õʼѡÔñµÄÁ¬½Ó + MIB_IF_TABLE2*& m_pIfTable; + int m_connection_selected; //当å‰�对è¯�框显示的连接 + int m_current_connection; //åˆ�始选择的连接 CListCtrl m_info_list; CMenu m_menu; CString m_selected_string; - CFont m_font_bold; //ĬÈÏ×ÖÌåµÄ´ÖÌå + CFont m_font_bold; //默认字体的粗体 - CWinThread* m_pGetIPThread; //»ñÈ¡ÍâÍøIPµÄÏß³Ì - bool m_ip_acquired{ false }; //Èç¹ûÒÑ»ñÈ¡ÍâÍøipµØÖ·£¬ÔòΪtrue + CWinThread* m_pGetIPThread; //获å�–外网IP的线程 + bool m_ip_acquired{ false }; //如果已获å�–外网ip地å�€ï¼Œåˆ™ä¸ºtrue - //void GetIPAddress(); //»ñÈ¡IPµØÖ· + //void GetIPAddress(); //获å�–IP地å�€ void ShowInfo(); void GetProgramElapsedTime(); - //»ñÈ¡ÍâÍøIPµÄÏ̺߳¯Êý + //获å�–外网IP的线程函数 static UINT GetInternetIPThreadFunc(LPVOID lpParam); virtual CString GetDialogName() const override; - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Ö§³Ö + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支æŒ� DECLARE_MESSAGE_MAP() diff --git a/TrafficMonitor/TrafficMonitor.cpp b/TrafficMonitor/TrafficMonitor.cpp index d71a39d..c27fdff 100644 --- a/TrafficMonitor/TrafficMonitor.cpp +++ b/TrafficMonitor/TrafficMonitor.cpp @@ -91,7 +91,7 @@ void CTrafficMonitorApp::LoadConfig() ini.LoadMainWndColors(_T("config"), _T("text_color"), m_main_wnd_data.text_colors, 16384); m_main_wnd_data.specify_each_item_color = ini.GetBool(_T("config"), _T("specify_each_item_color"), false); m_cfg_data.m_hide_main_window = ini.GetBool(_T("config"), _T("hide_main_window"), false); - m_cfg_data.m_connection_name = CCommon::UnicodeToStr(ini.GetString(L"connection", L"connection_name", L"").c_str()); + m_cfg_data.m_connection_name = ini.GetString(L"connection", L"connection_name", L""); m_cfg_data.m_skin_name = ini.GetString(_T("config"), _T("skin_selected"), _T("")); if (m_cfg_data.m_skin_name.substr(0, 8) == L".\\skins\\") //如果读å�–到的皮肤å��ç§°å‰�é�¢æœ‰".\\skins\\",则把它删除。(用于和å‰�一个版本ä¿�æŒ�兼容性) m_cfg_data.m_skin_name = m_cfg_data.m_skin_name.substr(7); @@ -266,7 +266,7 @@ void CTrafficMonitorApp::SaveConfig() ini.SaveMainWndColors(L"config", L"text_color", m_main_wnd_data.text_colors); ini.WriteBool(_T("config"), _T("specify_each_item_color"), m_main_wnd_data.specify_each_item_color); ini.WriteInt(L"config", L"hide_main_window", m_cfg_data.m_hide_main_window); - ini.WriteString(L"connection", L"connection_name", CCommon::StrToUnicode(m_cfg_data.m_connection_name.c_str()).c_str()); + ini.WriteString(L"connection", L"connection_name", m_cfg_data.m_connection_name.c_str()); ini.WriteString(_T("config"), _T("skin_selected"), m_cfg_data.m_skin_name.c_str()); ini.WriteInt(L"config", L"notify_icon_selected", m_cfg_data.m_notify_icon_selected); ini.WriteBool(L"config", L"notify_icon_auto_adapt", m_cfg_data.m_notify_icon_auto_adapt); diff --git a/TrafficMonitor/TrafficMonitor.h b/TrafficMonitor/TrafficMonitor.h index 4d7a2aa..fab3810 100644 --- a/TrafficMonitor/TrafficMonitor.h +++ b/TrafficMonitor/TrafficMonitor.h @@ -39,8 +39,8 @@ public: wstring m_config_dir; //以下数æ�®å®šä¹‰ä¸ºApp类中的公共æˆ�员,以便于在主对è¯�框和任务æ �窗å�£ä¸­éƒ½èƒ½è®¿é—® - unsigned int m_in_speed{}; //下载速度 - unsigned int m_out_speed{}; //上传速度 + unsigned __int64 m_in_speed{}; //下载速度 + unsigned __int64 m_out_speed{}; //上传速度 int m_cpu_usage{ -1 }; //CPU利用率 int m_memory_usage{ -1 }; //内存利用率 int m_used_memory{}; //å�¯ç”¨ç‰©ç�†å†…存(å�•ä½�为KB) diff --git a/TrafficMonitor/TrafficMonitor.rc b/TrafficMonitor/TrafficMonitor.rc index 9ca4f0754ccf58b2de58029fc74c718f7545231e..edd4e08720b126fb46e433d1fa40edea6bcfe0ba 100644 GIT binary patch delta 378 zcmeygn19P^{)R1#=iH~4DKhFwgfav$D1f071JeZGi5X#^V(;}YO`g8MiP2~J0}m!S z2^R)`hHwTypdy5lwW$p8(+d08%cI)_(Fd{#q!VtFOFq+fmwe`5 zG1KEpm<2$dP!LD>(vcyBA(5egp@boop=i3{6lUq^@1`)bOiMCXU$~DV@RLg*vl*m^!fI*Gt51#0LM3H1^@s6 delta 59 zcmdn8n*Y;c{)R1#=iDco>GDnDk!qLlWZW*{$)u(Z6X+;p+TKyf{3~YqjFrqFCEGPF IF!!(m0DOBClmGw# diff --git a/TrafficMonitor/TrafficMonitorDlg.cpp b/TrafficMonitor/TrafficMonitorDlg.cpp index ef3d97e..cb841d0 100644 --- a/TrafficMonitor/TrafficMonitorDlg.cpp +++ b/TrafficMonitor/TrafficMonitorDlg.cpp @@ -27,7 +27,7 @@ CTrafficMonitorDlg::CTrafficMonitorDlg(CWnd* pParent /*=NULL*/) CTrafficMonitorDlg::~CTrafficMonitorDlg() { - free(m_pIfTable); + FreeMibTable(m_pIfTable); if (m_tBarDlg != nullptr) { @@ -282,16 +282,16 @@ void CTrafficMonitorDlg::GetScreenSize() void CTrafficMonitorDlg::AutoSelect() { - unsigned int max_in_out_bytes{}; - unsigned int in_out_bytes; + unsigned __int64 max_in_out_bytes{}; + unsigned __int64 in_out_bytes; //m_connection_selected = m_connections[0].index; m_connection_selected = 0; //自动选择连接时,查找已å�‘é€�和已接收字节数之和最多的那个连接,并将其设置为当å‰�查看的连接 for (size_t i{}; itable[m_connections[i].index].dwOperStatus == IF_OPER_STATUS_OPERATIONAL) //å�ªé€‰æ‹©ç½‘络状æ€�为正常的连接 + if (m_pIfTable->Table[m_connections[i].index].OperStatus == IfOperStatusUp) //å�ªé€‰æ‹©ç½‘络状æ€�为正常的连接 { - in_out_bytes = m_pIfTable->table[m_connections[i].index].dwInOctets + m_pIfTable->table[m_connections[i].index].dwOutOctets; + in_out_bytes = m_pIfTable->Table[m_connections[i].index].InOctets + m_pIfTable->Table[m_connections[i].index].OutOctets; if (in_out_bytes > max_in_out_bytes) { max_in_out_bytes = in_out_bytes; @@ -305,19 +305,9 @@ void CTrafficMonitorDlg::AutoSelect() void CTrafficMonitorDlg::IniConnection() { - //为m_pIfTable开辟所需大å°�的内存 - free(m_pIfTable); - m_dwSize = sizeof(MIB_IFTABLE); - m_pIfTable = (MIB_IFTABLE *)malloc(m_dwSize); - int rtn; - rtn = GetIfTable(m_pIfTable, &m_dwSize, FALSE); - if (rtn == ERROR_INSUFFICIENT_BUFFER) //如果函数返回值为ERROR_INSUFFICIENT_BUFFER,说明m_pIfTable的大å°�ä¸�够 - { - free(m_pIfTable); - m_pIfTable = (MIB_IFTABLE *)malloc(m_dwSize); //用新的大å°�é‡�新开辟一å�—内存 - } + FreeMibTable(m_pIfTable); + GetIfTable2(&m_pIfTable); //获å�–当å‰�所有的连接,并ä¿�存到m_connections容器中 - GetIfTable(m_pIfTable, &m_dwSize, FALSE); if (!theApp.m_general_data.show_all_interface) { CAdapterCommon::GetAdapterInfo(m_connections); @@ -349,11 +339,11 @@ void CTrafficMonitorDlg::IniConnection() log_str += _T("\n"); } log_str += _T("IfTable:\n"); - for (size_t i{}; i < m_pIfTable->dwNumEntries; i++) + for (size_t i{}; i < m_pIfTable->NumEntries; i++) { log_str += CCommon::IntToString(i); log_str += _T(" "); - log_str += (const char*)m_pIfTable->table[i].bDescr; + log_str += m_pIfTable->Table[i].Description; log_str += _T("\n"); } CCommon::WriteLog(log_str, (theApp.m_config_dir + L".\\connections.log").c_str()); @@ -412,7 +402,7 @@ void CTrafficMonitorDlg::IniConnectionMenu(CMenu * pMenu) CString connection_descr; for (size_t i{}; i < m_connections.size(); i++) { - connection_descr = CCommon::StrToUnicode(m_connections[i].description.c_str()).c_str(); + connection_descr = m_connections[i].description.c_str(); pMenu->AppendMenu(MF_STRING | MF_ENABLED, ID_SELECT_ALL_CONNECTION + i + 1, connection_descr); } } @@ -838,11 +828,12 @@ void CTrafficMonitorDlg::OnTimer(UINT_PTR nIDEvent) if (nIDEvent == MONITOR_TIMER) { //获å�–网络连接速度 - int rtn = GetIfTable(m_pIfTable, &m_dwSize, FALSE); + FreeMibTable(m_pIfTable); + int rtn = GetIfTable2(&m_pIfTable); if (!theApp.m_cfg_data.m_select_all) //获å�–当å‰�选中连接的网速 { - m_in_bytes = m_pIfTable->table[m_connections[m_connection_selected].index].dwInOctets; - m_out_bytes = m_pIfTable->table[m_connections[m_connection_selected].index].dwOutOctets; + m_in_bytes = m_pIfTable->Table[m_connections[m_connection_selected].index].InOctets; + m_out_bytes = m_pIfTable->Table[m_connections[m_connection_selected].index].OutOctets; } else //获å�–全部连接的网速 { @@ -853,8 +844,8 @@ void CTrafficMonitorDlg::OnTimer(UINT_PTR nIDEvent) //if (i > 0 && m_pIfTable->table[m_connections[i].index].dwInOctets == m_pIfTable->table[m_connections[i - 1].index].dwInOctets // && m_pIfTable->table[m_connections[i].index].dwOutOctets == m_pIfTable->table[m_connections[i - 1].index].dwOutOctets) // continue; //连接列表中å�¯èƒ½ä¼šæœ‰ç›¸å�Œçš„连接,统计所有连接的网速时,忽略掉已å�‘é€�和已接收字节数完全相å�Œçš„连接 - m_in_bytes += m_pIfTable->table[m_connections[i].index].dwInOctets; - m_out_bytes += m_pIfTable->table[m_connections[i].index].dwOutOctets; + m_in_bytes += m_pIfTable->Table[m_connections[i].index].InOctets; + m_out_bytes += m_pIfTable->Table[m_connections[i].index].OutOctets; } } @@ -879,8 +870,8 @@ void CTrafficMonitorDlg::OnTimer(UINT_PTR nIDEvent) // cur_out_speed = 0; //将当å‰�监控时间间隔的æµ�é‡�转æ�¢æˆ�æ¯�秒时间间隔内的æµ�é‡� - theApp.m_in_speed = static_cast(cur_in_speed * 1000 / theApp.m_general_data.monitor_time_span); - theApp.m_out_speed = static_cast(cur_out_speed * 1000 / theApp.m_general_data.monitor_time_span); + theApp.m_in_speed = static_cast(cur_in_speed * 1000 / theApp.m_general_data.monitor_time_span); + theApp.m_out_speed = static_cast(cur_out_speed * 1000 / theApp.m_general_data.monitor_time_span); m_connection_change_flag = false; //清除连接å�‘生å�˜åŒ–的标志 @@ -932,14 +923,14 @@ void CTrafficMonitorDlg::OnTimer(UINT_PTR nIDEvent) } } - if (rtn == ERROR_INSUFFICIENT_BUFFER) - { - IniConnection(); - CString info; - info.LoadString(IDS_INSUFFICIENT_BUFFER); - info.Replace(_T("<%cnt%>"), CCommon::IntToString(m_restart_cnt)); - CCommon::WriteLog(info, theApp.m_log_path.c_str()); - } + //if (rtn == ERROR_NOT_ENOUGH_MEMORY) + //{ + // IniConnection(); + // CString info; + // info.LoadString(IDS_INSUFFICIENT_BUFFER); + // info.Replace(_T("<%cnt%>"), CCommon::IntToString(m_restart_cnt)); + // CCommon::WriteLog(info, theApp.m_log_path.c_str()); + //} if (m_monitor_time_cnt % GetMonitorTimerCount(3) == GetMonitorTimerCount(3) - 1) @@ -963,8 +954,8 @@ void CTrafficMonitorDlg::OnTimer(UINT_PTR nIDEvent) } last_interface_num = interface_num; - string descr; - descr = (const char*)m_pIfTable->table[m_connections[m_connection_selected].index].bDescr; + wstring descr; + descr = m_pIfTable->Table[m_connections[m_connection_selected].index].Description; if (descr != theApp.m_cfg_data.m_connection_name) { //写入é¢�外的调试信æ�¯ @@ -1416,7 +1407,7 @@ void CTrafficMonitorDlg::OnNetworkInfo() { // TODO: 在此添加命令处ç�†ç¨‹åº�代ç � //弹出“连接详情â€�对è¯�框 - CNetworkInfoDlg aDlg(m_connections, m_pIfTable->table, m_connection_selected); + CNetworkInfoDlg aDlg(m_connections, m_pIfTable, m_connection_selected); ////å�‘CNetworkInfoDlg类传递自å�¯åЍ以æ�¥å·²å�‘é€�和接收的字节数 //aDlg.m_in_bytes = m_pIfTable->table[m_connections[m_connection_selected].index].dwInOctets - m_connections[m_connection_selected].in_bytes; //aDlg.m_out_bytes = m_pIfTable->table[m_connections[m_connection_selected].index].dwOutOctets - m_connections[m_connection_selected].out_bytes; diff --git a/TrafficMonitor/TrafficMonitorDlg.h b/TrafficMonitor/TrafficMonitorDlg.h index 51eb90d..fca7593 100644 --- a/TrafficMonitor/TrafficMonitorDlg.h +++ b/TrafficMonitor/TrafficMonitorDlg.h @@ -47,8 +47,7 @@ protected: CTaskBarDlg* m_tBarDlg; //任务æ �窗å�£çš„æŒ‡é’ˆ vector m_connections; //ä¿�存获å�–到的è¦�显示到“选择网å�¡â€�è�œå�•项中的所有网络连接 - MIB_IFTABLE* m_pIfTable; - DWORD m_dwSize{}; //m_pIfTable的大å°� + MIB_IF_TABLE2* m_pIfTable; int m_connection_selected{ 0 }; //è¦�显示æµ�é‡�的连接的åº�å�· unsigned __int64 m_in_bytes; //当å‰�已接收的字节数 unsigned __int64 m_out_bytes; //当å‰�å·²å�‘é€�的字节数 diff --git a/TrafficMonitor/resource.h b/TrafficMonitor/resource.h index 9304ad7011086302fcf9f5d206f0219d67a0bc97..52e4db7896f5e1999acbe017302705eccb6ce81f 100644 GIT binary patch delta 91 zcmX@}f$7#KrVXb8CqIzpnmkWQYVsv731(vk