線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1469
推到 Plurk!
推到 Facebook!

請問如何取得Internet的IP?

答題得分者是:RaynorPao
purejack
一般會員


發表:8
回覆:8
積分:3
註冊:2002-12-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-27 12:00:28 IP:61.59.xxx.xxx 未訂閱
我用討論區裡的範例是可以抓到IP. 但我想先抓Internet IP,如果沒連上Internet再抓LAN IP. 我是把範例改成h_addr_list[i],用迴圈抓最後一個IP. 原本以為可以了,但我試了三台電腦結果有一台仍抓到LAN IP. 請問該怎麼處理才能固定先抓Internet IP?
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-27 12:52:19 IP:61.221.xxx.xxx 未訂閱
引言: 我用討論區裡的範例是可以抓到IP. 但我想先抓Internet IP,如果沒連上Internet再抓LAN IP. 我是把範例改成h_addr_list[i],用迴圈抓最後一個IP. 原本以為可以了,但我試了三台電腦結果有一台仍抓到LAN IP. 請問該怎麼處理才能固定先抓Internet IP?
purejack 你好: 請把你的程式碼貼上來,讓各位大大幫你看一看 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
purejack
一般會員


發表:8
回覆:8
積分:3
註冊:2002-12-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-27 14:21:42 IP:61.59.xxx.xxx 未訂閱
struct hostent *thisHost; struct in_addr in; char MyName[80]; char *ptr,*hostname; WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2,0); err=WSAStartup(wVersionRequested,&wsaData); if( err != 0 )return; if( LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0 ) { WSACleanup(); return; } if( gethostname(MyName,80) == SOCKET_ERROR )return; if( !(thisHost=gethostbyname(MyName)) )return; hostname = thisHost->h_name; memset((void*)&in,sizeof(in),0); // Get Last IP int i; for ( i = 0 ; thisHost->h_addr_list[i] ; i ); i--; in.s_addr = *((unsigned long*)thisHost->h_addr_list[i]); if( !(ptr = inet_ntoa(in)) )return; WSACleanup(); EstablishForm->Edit4->Text = AnsiString(ptr); Get Last IP的部份,for迴圈是我自己加的,程式哪來的我也不大記得了,而且complie會有三個warning,因為看不懂所以我也沒改. 只是後來發覺抓IP會抓錯,看了一下發現h_addr_list[n]是指定哪一個IP用的,原本以為只要抓最後一個就沒錯了,但試的結果大多數是沒錯,但有時好像還是會錯. 不知h_addr_list[n]的IP是依照什麼規則來排的?
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-28 20:57:34 IP:61.221.xxx.xxx 未訂閱
引言: struct hostent *thisHost; struct in_addr in; char MyName[80]; char *ptr,*hostname; WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2,0); err=WSAStartup(wVersionRequested,&wsaData); if( err != 0 )return; if( LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0 ) { WSACleanup(); return; } if( gethostname(MyName,80) == SOCKET_ERROR )return; if( !(thisHost=gethostbyname(MyName)) )return; hostname = thisHost->h_name; memset((void*)&in,sizeof(in),0); // Get Last IP int i; for ( i = 0 ; thisHost->h_addr_list[i] ; i ); i--; in.s_addr = *((unsigned long*)thisHost->h_addr_list[i]); if( !(ptr = inet_ntoa(in)) )return; WSACleanup(); EstablishForm->Edit4->Text = AnsiString(ptr); Get Last IP的部份,for迴圈是我自己加的,程式哪來的我也不大記得了,而且complie會有三個warning,因為看不懂所以我也沒改. 只是後來發覺抓IP會抓錯,看了一下發現h_addr_list[n]是指定哪一個IP用的,原本以為只要抓最後一個就沒錯了,但試的結果大多數是沒錯,但有時好像還是會錯. 不知h_addr_list[n]的IP是依照什麼規則來排的?
purejack 你好:
(1)我已經試過你的程式碼了,在三台電腦上測試的結果,應該是沒有問題
( >
(>    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
purejack
一般會員


發表:8
回覆:8
積分:3
註冊:2002-12-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-28 22:51:16 IP:210.244.xxx.xxx 未訂閱
我自己試時出現LAN IP的機會好像也不大,但是只要一出現就算把Internet Disconnect掉後,重連再執行仍然是LAN IP,只有重開機後才會正常. 所以我覺得h_addr_list的順序好像是一開機就固定了,如果要避免先抓到LAN IP可能只能自己先Check了,如果要自己過濾,是不是只要照你給的那個網址裡的Summary Table裡,把它全部過濾掉?好像挺麻煩的,位址不少. 謝謝啦!
系統時間:2024-03-29 9:44:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!