cooper 的个人资料COOPER SHARE SPACE照片日志列表更多 ![]() | 帮助 |
COOPER SHARE SPACE |
|||||
|
2009/2/3 如何獲取網卡資訊 get ip address MAC address ...在C++中 可以有許多的方式 去獲得網卡的資訊 甚至去修改以便得到正確ip 並連上internet
什麼是ip mac等等 甚至什麼是OSI(Open system Interconnection) 那就查google吧 這只著重在codeing 只是自己做個紀錄
參照的方式 主要是mdsn上範例 調用iphlpapi 可實現不重開機而修改ip等 所以使用iphlpapi很方便 許多的應用程式都使用
其他也有用WMI 或是其他方式 用wmi也很方便 有空再介紹
首先考參考msdn 可查詢iphelpapi function http://msdn.microsoft.com/en-us/library/aa366071(VS.85).aspx 中有說明
使用iphlpapi 以下程式節錄mdsn 調用方式很簡單 這方式在VC6 或 vs2005 C++ 都適用
#include <winsock2.h>
#include <iphlpapi.h> #include <stdio.h> #include <stdlib.h> #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) /* Note: could also use malloc() and free() */ int __cdecl main()
{ /* Declare and initialize variables */
// It is possible for an adapter to have multiple
// IPv4 addresses, gateways, and secondary WINS servers // assigned to the adapter. // // Note that this sample code only prints out the // first entry for the IP address/mask, and gateway, and // the primary and secondary WINS server for each adapter. PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL; DWORD dwRetVal = 0; UINT i; /* variables used to print DHCP time info */
struct tm newtime; char buffer[32]; errno_t error; ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(sizeof (IP_ADAPTER_INFO)); if (pAdapterInfo == NULL) { printf("Error allocating memory needed to call GetAdaptersinfo\n"); return 1; } // Make an initial call to GetAdaptersInfo to get // the necessary size into the ulOutBufLen variable if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) { FREE(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen); if (pAdapterInfo == NULL) { printf("Error allocating memory needed to call GetAdaptersinfo\n"); return 1; } } if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
pAdapter = pAdapterInfo; //這裡就可以得到adapter info. 有幾張都可以從這獲得by cooper while (pAdapter) { printf("\tComboIndex: \t5d\n", pAdapter->ComboIndex); printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName); //adapter 名字 by cooper printf("\tAdapter Desc: \t%s\n", pAdapter->Description); //adapter Description by cooper printf("\tAdapter Addr: \t"); //MAC Address 這裡for loop 是把它轉成16位元 如xx-xx-xx-xx-xx-xx by cooper for (i = 0; i < pAdapter->AddressLength; i++) { if (i == (pAdapter->AddressLength - 1)) printf("%.2X\n", (int) pAdapter->Address[i]); else printf("%.2X-", (int) pAdapter->Address[i]); } printf("\tIndex: \t%d\n", pAdapter->Index); printf("\tType: \t"); switch (pAdapter->Type) { //這裡是網路連結的型態 by cooper case MIB_IF_TYPE_OTHER: printf("Other\n"); break; case MIB_IF_TYPE_ETHERNET: printf("Ethernet\n"); break; case MIB_IF_TYPE_TOKENRING: printf("Token Ring\n"); break; case MIB_IF_TYPE_FDDI: printf("FDDI\n"); break; case MIB_IF_TYPE_PPP: printf("PPP\n"); break; case MIB_IF_TYPE_LOOPBACK: printf("Lookback\n"); break; case MIB_IF_TYPE_SLIP: printf("Slip\n"); break; default: printf("Unknown type %ld\n", pAdapter->Type); break; } printf("\tIP Address: \t%s\n",
pAdapter->IpAddressList.IpAddress.String); //這是IP Address by cooper printf("\tIP Mask: \t%s\n", pAdapter->IpAddressList.IpMask.String); //這是IP Mask by cooper printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String); //這是 Gateway by cooper
printf("\t***\n"); if (pAdapter->DhcpEnabled) { //這是DHCP by cooper
printf("\tDHCP Enabled: Yes\n"); printf("\t DHCP Server: \t%s\n", pAdapter->DhcpServer.IpAddress.String); printf("\t Lease Obtained: ");
/* Display local time */ error = _localtime32_s(&newtime, &pAdapter->LeaseObtained); if (error) printf("Invalid Argument to _localtime32_s\n"); else { // Convert to an ASCII representation error = asctime_s(buffer, 32, &newtime); if (error) printf("Invalid Argument to asctime_s\n"); else /* asctime_s returns the string terminated by \n\0 */ printf("%s", buffer); } printf("\t Lease Expires: ");
error = _localtime32_s(&newtime, &pAdapter->LeaseExpires); if (error) printf("Invalid Argument to _localtime32_s\n"); else { // Convert to an ASCII representation error = asctime_s(buffer, 32, &newtime); if (error) printf("Invalid Argument to asctime_s\n"); else /* asctime_s returns the string terminated by \n\0 */ printf("%s", buffer); } } else printf("\tDHCP Enabled: No\n"); if (pAdapter->HaveWins) {
printf("\tHave Wins: Yes\n"); printf("\t Primary Wins Server: %s\n", pAdapter->PrimaryWinsServer.IpAddress.String); printf("\t Secondary Wins Server: %s\n", pAdapter->SecondaryWinsServer.IpAddress.String); } else printf("\tHave Wins: No\n"); pAdapter = pAdapter->Next; printf("\n"); } } else { printf("GetAdaptersInfo failed with error: %d\n", dwRetVal); }
if (pAdapterInfo) FREE(pAdapterInfo); return 0;
} code很簡短 主要就是GetAdaptersInfo() 調用iphelpapi後就可使用 其中
PIP_ADAPTER_INFO pAdapterInfo 這結構struct 中紀錄我們local端的網路資訊 這就是我們有的啦
若不懂info.是什麼或是對不對的話 可以打開命令提示字元 或是 開始=>程式集=>執行 鍵入 cmd
然後鍵入 ipconfig /all 就會列出來啦 可以對照看看
另外再介紹幾個func. 這都可以在msdn上查到 也有sample參考
AddIPAddress() 加入ip address 這要注意一點 若是已有ip 再用的話 就會一張網卡多個IP
DeleteIPAddress() 篩除IP address 若已無ip 會return fail
IpRenewAddress() renew 網路連線 必須有DHCP
IpReleaseAddress() release 已有的連線
2007/5/31 收聽民視MLB大聯盟現場轉播許多的人可能無法守在電視機前收看電視 像是上班族 程式會呼叫兩種播放程式 按右鍵另存目標 按我download 將其下載到桌面後 更改檔名 2007/5/21 加速ADSL通訊協定的連線速度加速ADSL通訊協定的連線速度
開始 --> 執行 --> regedit
打開 登錄檔編輯程式
修改以下資料
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Ndiswan\Parameters
新增機碼 Protocols 後再
新增機碼 0
新增以下DWORD值
ProtocolType 2048(十進位)
ProtocolMTU 1480(十進位) PPPProtocolType 33(十進位)
建好後重開機就可以優化PPPoE通訊協定 加快ADSL上網速度 2007/5/17 OCX版本及自動更新功能OCX版本及自動更新功能(由於是使用 ActiveX 方式, 故僅支援 IE 的瀏覽器.)
使用網頁部署程式是最方便的, 因為每台電腦都有 web browser, 利用 ocx 的方式更是好用的更新方式, 然而, 版本檢查更新是該部署方式最好用的地方. 如何利用 ocx 部署應用程式, 並且自動偵測使用者端的版本及現在要部署的版本新舊狀況後, 再進行更新呢? 因為 ocx 在 build 時, 可以放入版本資訊, 例如 1.0.0.0, 其中 4個代碼分別為:
major.minor.build.revision 簡單說就是版本啦
放到 ocx 裡的資訊, 會在安裝於客戶端電腦時, 記錄於 %windir%\downloaded program files 裡, 這樣一來, 系統就會知道目前的 ocx 版本, 但是變成 client 都要 download 才會知道版本, 若是 ocx 過大, 不就會有要先下載才能比對的問題?
其實不然, 在的語法中, 有個 codebase 的屬性, 該屬性可以指定該 ocx 的版本 利用這個資訊, web browser 將會自動帶出已安裝於客戶端的同 guid 的 ocx 版本, 一但比較出來, web 上的 #x,x,x,x 的版本較新於已安裝於客戶端的 ocx 版本時, 將會提示使用者是否下載, 由於是全部信任 web 上的版本屬性, 所以一旦寫錯了, 將會有一些問題, 當然也可以加以利用, 主要就是版本比對機制的功能, 所以最好部署的 ocx 就和頁面上的版本屬性一致, 才能節省部署的資源(頻寬, 使用者安裝時間).
以下為完整的 ocx 的語法, 重要的是版本屬性是使用 "," (逗號) 做區隔, 而不是使用 "." (點號) 做區隔!
width=0 height=0 id=XNAME codebase="http://url/mycontrol.ocx#1,0,0,0"> 如此一來, 就能使用方便又好用的 ocx 版本比對部署功能囉! PS. ocx 檔案本身若沒有數位簽章時, 將會依 web browser 本身的安全性設定而有不同的表現方式, 如限制或提示, 但有數位簽章時, web browser 會提示使用者是否要下載安裝, 可以大大減低部署 ocx 的困難!
(註一)就只是用來描述用的, 並非是真的 ocx 的版本, 所以 mycontrol.ocx 和 1,0,0,0 不見得要相同, 但若不同, 就會有使用者要一直下載的問題, 因為真的安裝到客戶端電腦的 download ocx 版本, 一定是會讀到該 ocx 本身寫的版本號.
以上ocx的部屬使用者不一定會在網頁中看見相關的code 因為可能放在隱藏頁中 就跟病毒一樣 好恐怖
不過現在ie是有提高他的安全性 所以上面所說數位簽章就會過濾是否為合法軟體
因為有在寫相關的東西 才在整理一下
以下就要多注意怎樣檢查說有ocx在電腦裡
所以可以自行檢查有裝了哪些的ocx在電腦裡 在%windir%\downloaded program files 資料夾裡
不懂%windir%的意思 其實就是C:\WINDOWS 若你系統是裝在C槽的話
若是不知也沒關係 按 開始 --> 執行 --> [鍵入]%windir%
跳出的視窗就是你的windir 就可以找到downloaded program files
ocx其實是很危險的程式 若是植入後 網頁就可以對你電腦予取予求 要小心
一般若是沒做什麼是不會安裝什麼ocx 常用就是flash的程式他是Adobe的 可以檢查看看
其他若是有玩股票用線上下單 在電腦也會安裝ocx作為驗證密碼安全用
還有其他的 就要注意他是否有數位簽章 以及是否為合法軟體 這樣電腦才安全 |
|
|||
|
|