1、vb 如何獲取外網ip?
vb中從域名得到IP及從IP得到域名
Private Const WS_VERSION_REQD = &H101
Private Const WS_VERSION_MAJOR = WS_VERSION_REQD &H100 And &HFF&
Private Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&
Private Const MIN_SOCKETS_REQD = 1
Private Const SOCKET_ERROR = -1
Private Const WSADescription_Len = 256
Private Const WSASYS_Status_Len = 128
Private Type HOSTENT
hname As Long
hAliases As Long
hAddrType As Integer
hLength As Integer
hAddrList As Long
End Type
Private Type WSADATA
wversion As Integer
wHighVersion As Integer
szDescription(0 To WSADescription_Len) As Byte
szSystemStatus(0 To WSASYS_Status_Len) As Byte
iMaxSockets As Integer
iMaxUdpDg As Integer
lpszVendorInfo As Long
End Type
Private Declare Function gethostbyaddr Lib "WSOCK32.DLL" (addr As Any, ByVal _
byteslen As Integer, addrtype As Integer) As Long
Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal _
wVersionRequired&, lpWSAData As WSADATA) As Long
Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal _
hostname$) As Long
Private Declare Sub RtlMoveMemory Lib "KERNEL32" (hpvDest As Any, _
ByVal hpvSource&, ByVal cbCopy&)
Function hibyte(ByVal wParam As Integer) 注釋:獲得整數的高位
hibyte = wParam &H100 And &HFF&
End Function
Function lobyte(ByVal wParam As Integer) 注釋:獲得整數的低位
lobyte = wParam And &HFF&
End Function
Function SocketsInitialize()
Dim WSAD As WSADATA
Dim iReturn As Integer
Dim sLowByte As String, sHighByte As String, sMsg As String
iReturn = WSAStartup(WS_VERSION_REQD, WSAD)
If iReturn <> 0 Then
MsgBox "Winsock.dll 沒有反應."
End
End If
If lobyte(WSAD.wversion) < WS_VERSION_MAJOR Or (lobyte(WSAD.wversion) = WS_VERSION_MAJOR And hibyte(WSAD.wversion) < WS_VERSION_MINOR) Then
sHighByte = Trim$(str$(hibyte(WSAD.wversion)))
sLowByte = Trim$(str$(lobyte(WSAD.wversion)))
sMsg = "Windows Sockets版本 " & sLowByte & "." & sHighByte
sMsg = sMsg & " 不被winsock.dll支持 "
MsgBox sMsg
End
End If
If WSAD.iMaxSockets < MIN_SOCKETS_REQD Then
sMsg = "這個系統需要的最少Sockets數為 "
sMsg = sMsg & Trim$(str$(MIN_SOCKETS_REQD))
MsgBox sMsg
End
End If
End Function
Sub SocketsCleanup()
Dim lReturn As Long
lReturn = WSACleanup()
If lReturn <> 0 Then
MsgBox "Socket錯誤 " & Trim$(str$(lReturn)) & " occurred in Cleanup "
End
End If
End Sub
Sub Form_Load()
注釋:初始化Socket
SocketsInitialize
End Sub
Private Sub Form_Unload(Cancel As Integer)
注釋:清除Socket
SocketsCleanup
End Sub
Private Function getip(name As String) As String
Dim hostent_addr As Long
Dim host As HOSTENT
Dim hostip_addr As Long
Dim temp_ip_address() As Byte
Dim i As Integer
Dim ip_address As String
hostent_addr = gethostbyname(name)
If hostent_addr = 0 Then
getip = "" 注釋:主機名不能被解釋
Exit Function
End If
RtlMoveMemory host, hostent_addr, LenB(host)
RtlMoveMemory hostip_addr, host.hAddrList, 4
ReDim temp_ip_address(1 To host.hLength)
RtlMoveMemory temp_ip_address(1), hostip_addr, host.hLength
For i = 1 To host.hLength
ip_address = ip_address & temp_ip_address(i) & "."
Next
ip_address = Mid$(ip_address, 1, Len(ip_address) - 1)
getip = ip_address
End Function
Private Sub Command1_click()
Dim str As String
str = getip(Text1.Text)
If str = "" Then
Text2.Text = "主機名不能被解釋"
Else
Text2.Text = str
End If
End Sub
Private Function getname(addrstr As String) As String
Dim hostent_addr As Long
Dim host As HOSTENT
Dim addr(0 To 50) As Byte
Dim addrs As String
Dim hname(1 To 50) As Byte
Dim str As String
Dim i As Integer, j As Integer
Dim temp_int As Integer
Dim byt As Byte
str = Trim$(addrstr)
i = 0
j = 0
Do
temp_int = 0
i = i + 1
Do While Mid$(str, i, 1) >= "0" And Mid$(str, i, 1) <= "9" And i <= Len(str)
temp_int = temp_int * 10 + Mid$(str, i, 1)
i = i + 1
Loop
If temp_int <= 255 Then
addr(j) = temp_int
j = j + 1
End If
Loop Until Mid$(str, i, 1) <> "." Or i > Len(str) Or temp_int > 255
If temp_int > 255 Then
getname = "地址非法"
Exit Function
End If
hostent_addr = gethostbyaddr(addr(0), j, 2)
If hostent_addr = 0 Then
getname = "此地址無法解析"
Exit Function
End If
RtlMoveMemory host, hostent_addr, LenB(host)
RtlMoveMemory hname(1), host.hname, 50
j = 51
For i = 1 To 50
If hname(i) = 0 Then
j = i
End If
If i >= j Then
hname(i) = 32
End If
Next i
getname = Trim$(StrConv(hname, vbUnicode))
End Function
Private Sub Command2_Click()
Dim name As String
name = getname(Text2.Text)
If name = "" Then
name = "此地址沒有域名"
End If
Text1.Text = name
End Sub
2、外網如何獲取內網的IP?
內網IP只能在內copy網區域網訪問連接,在外網是不能認識內網IP不能訪問的。有路由許可權,且路由有固定公網IP,可以通過路由的埠映射,實現外網訪問內網。如無路由,或路由無公網IP,需要藉助第三方開放的nat123埠映射網路輔助實現外網訪問內網。
埠映射網路輔助的好處是適用於任何網路環境,外網訪問內網的實現過程:
1.在內網安裝並啟用nat123埠映射。添加映射,配置內外網映射信息,對應內網IP埠和外網自己的域名。外網地址可直接使用提示默認域名。
2.NAT映射後,通過域名訪問,即可以連接內網對應IP應用。
3、WebApi中,怎麼獲取介面調用者的外網ip地址
It's possible to do that, but not very discoverable - you need to use
the property bag from the incoming request, and the property you need
to access depends on whether you're using the Web API under IIS
(webhosted) or self-hosted. The code below shows how this can be done.
private string GetClientIp(HttpRequestMessage request)
{
if (request.Properties.ContainsKey("MS_HttpContext"))
{
return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
}
if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
{
RemoteEndpointMessageProperty prop;
prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name];
return prop.Address;
}
return null;
}
4、我有伺服器、固定外網IP,可以本地瀏覽,如何讓外網通過固定IP或者域名來訪問。我的是wamp環境
先確認你的IP是不是外網(公網)IP,如果是就一定能訪問(除非你的IP被封了,國內不存在此問題),如果你的是內網就要做埠映射了(如果可以的話)
5、獲取本機外網實際ip
如果你使用了路由器,那麼直接在路由器的管理頁面中就能看到IP,Wan口的IP地址就是你的出口IP
如果Wan口IP是一個私有IP地址(10.X.X.X或192.168.X.X或172.16.X.X-172.31.X.X),說明你的WAN口仍處於區域網下,外網無法訪問本機(除非你與你的運營商聯系為你做埠映射,可能要額外收費),如果Wan口IP是公網地址(除上述幾個私有IP地址段外),你可以按以下步驟操作
進入路由器管理
找到設置DMZ區或虛擬伺服器的設置項(TP-link在轉發規則下)
設置DMZ區或虛擬伺服器,DMZ區的主機將直接暴漏在外網,外網可以通過你的公網IP直接訪問DMZ主機上任何開放的埠,而設置虛擬伺服器只將指定的內網機器的指定埠開放,外部只能訪問該埠的服務網(HTTP服務是80,ftp是21)
注意如果你的外網IP不是固定的,那麼每次別人都要訪問你當前的外網IP才可以,你可以使用動態DNS服務為你的IP動態綁定域名
開放DMZ或虛擬伺服器後,指定主機的IP地址(內網IP,如192.168.0.101這種)要固定,因為它是按IP開放的埠,如果你今天主機A用IPA,主機B用IPB,將IPA開放,則外網可訪問主機A的服務,而明天你又把主機A的IP改為IPC,那其他人訪問你的外網IP時路由器仍會將IPA對應的主機返回給外網,所以你可能需要Mac地址綁定
6、WebApi中,怎麼獲取介面調用者的外網ip地址
不是默認的 WSDL 都會給一個 transport 的地址么,那個 URL 中應該有地址,當然可能不回是 IP 而是伺服器域名答,當然也有可能人家沒有把 URL 直接寫在 WSDL 中,但會另外在文檔中告訴你 URL 地址。你為什麼需要知道 IP 地址而不直接用域名?
從分布式的松耦合設計中我們了解到,客戶端應該只看 WSDL 再加上額外提供的可選的 URL (如果 WSDL 中沒有提供這個 transport 配置的話)就應該可以完成與伺服器的數據交換,不再需要其它條件。
7、1個外網IP怎麼解決兩個域名上網
設置Apache虛擬主機通常有兩種方案
一、基於IP的虛擬主機
這種方式需要在機器上設置IP別名,象上面的例子,在一台機器的
網卡上綁定多個IP地址去服務多個虛擬主機。
若該機器的IP地址為192.168.11.2(account.yourdomain.com),首先
你要設置IP別名(假設用192.168.11.4作為其別名IP)。加下面的行到
/etc/rc.d/rc.local,確保每次啟動後自動運行。
192.168.11.255 up
然後你需要設置/etd/httpd/conf/httpd.conf文件:
《VirtualHost 192.168.11.4》*
ServerAdmin [email protected]
DocumentRoot /home/httpd/sales.yourdomain.com
ServerName sales.yourdomain.com
ErrorLog /var/log/httpd/sales.yourdomain.com/error_log
TransferLog /var/log/httpd/sales.yourdomain.com/access_log
《/VirtualHost》
然後分別創建目錄
/home/httpd/sales.yourdomain.com,
/var/log/httpd/sales.yourdomain.com
,放相應的網站內容到目錄/home/httpd/sales.yourdomain.com下即可,並確保
你內部的DNS指定sales.yourdomain.com的A記錄到IP地址192.168.11.4 。
註:這種基於IP的虛擬主機有一個缺點,就是你需要更多的IP地址去服務各自的
虛擬主機,如果你僅僅有一個IP地址,那麼你將可以考慮用基於名字的虛擬主機
方案。
二、基於名字的虛擬主機:
它的優勢就是不需要更多的IP地址,容易配置,不需要其它軟硬體,現代的
瀏覽器大多都支持這種方式。與基於IP的虛擬主機一樣,你需要編輯文件
/etc/httpd/conf/httpd.conf
NameVirtualHost 192.168.11.2
《VirtualHost 192.168.11.2》
ServerAdmin [email protected]
DocumentRoot /home/httpd/sales.yourdomain.com
ServerName sales.yourdomain.com
ErrorLog /var/log/httpd/sales.yourdomain.com/error_log
TransferLog /var/log/httpd/sales.yourdomain.com/access_log
《/VirtualHost》
《VirtualHost 192.168.11.2》
ServerAdmin [email protected]
DocumentRoot /home/httpd/hr.yourdomain.com
ServerName hr.yourdomain.com
ErrorLog /var/log/httpd/hr.yourdomain.com/error_log
TransferLog /var/log/hr.yourdomain.com/access_log
《/VirtualHost》
註: 你需要加NameVirtualHost 指示在最前面,下面依次為各個虛擬主機,
為了讓它工作,你需要把sales.yourdomain.com, hr.yourdomain.com的DNS
都指向IP地址192.168.11.2
上面的兩種都將工作,如果是在外部網段,在互聯網上提供WWW服務,你可能
沒有足夠的真實IP地址來支持多個虛擬主機,便可用基於名字的虛擬主機方案,
若是在內部網段上,你有較多的內部保留IP地址,將沒有太大的區別。
8、PHP如何獲取伺服器外網IP
1.關於外網IP變更問題,如果你手頭上有 IP資源,建議綁定。就是你申請的靜態IP。
2.如果自己沒有靜態IP,那麼如果你有域名,可以通過 花生殼這些軟體,綁定自己的伺服器。這樣就算IP怎樣變化,直接訪問域名就可以了。
2.1.花生殼帶有一些二級域名的,功能也差不多。
-----------------------------------
另外,可以寫一個功能cURL,讓你的伺服器定期訪問一個站點(私有站點,要許可權進入),這個站點你可以獲取訪問者的IP。
9、C#程序怎麼獲得外網IP和內網IP?
1、企業網內部的工作站通過出口路由器的NAT轉換能夠上Internet網。 2、企業網(目前來說大部分是教育網)內部有一些伺服器,如圖中的Server,本身具有私網IP地址10.0.0.3,而且需要被公網所訪問,所以需要在企業網的出口處對其做靜態NAT轉換,將其轉換為一個公網IP地址2.0.0.5。企業外部的公網用戶通過該伺服器公網IP或解析後的域名對其進行訪問,而企業內部的工作站如果使用公網上的一台DNS,那麼也將使用域名對該伺服器進行訪問。 3、企業網(目前來說大部分是教育網)內部還有一些伺服器,如圖中的Game-Server,它本身具有公網IP地址,它也既需要被私網用戶所訪問,也需要被公網用戶所訪問。三、解決方案 1、常規配置: 就按照拓撲圖中的配置方法,WorkStation應該是可以訪問到伺服器Server的,只不過需要公網路由器的參與。具體過程是WorkStation發出一個以Server的公網IP(2.0.0.5)為目標地址的數據包,源地址是10.0.0.2,這個數據包經過Router時,它會首先遵從路由表進行路由, 2.0.0.5這個地址雖然屬於運營商分給我們的一段公網IP的一部分,但由於該地址並不與任何介面同屬一個網段,所以路由器只會按照預設路由路由這個數據包到公網路由器,從物理埠向外發出時,NAT會起作用,這個數據包的源IP會被替換為2.0.0.1(地址池裡的第一個地址)。當公網路由器收到這個數據包時,它查目標地址所在網段,發現這個地址已經被分給該企業網,所以會遵從那條路由將該數據包發回到Router。此時這個數據包的源IP是2.0.0.1,目標IP為2.0.0.5,Router查NAT表發現2.0.0.5這個公網IP應按照配置了的靜態NAT表項轉換為10.0.0.3,所以當路由器把這個數據包發給Server時,數據包的目的IP就被轉換成了10.0.0.3,而源IP仍為2.0.0.1。當Server回復這個數據包時也按照對等的方式返回WorkStation。總結地說,就是這個過程是需要公網路由器參與完成的,而公網設備對我們來說是不可控的,所以當公網路由器因為某種原因拒絕參與這個過程時(比如出口鏈路斷),這種訪問方式將變為不可行。而且數據包要在企業網與公網的路由器之間走了一個環,浪費了帶寬及設備的性能資源。
採用這種方法時,我從WorkStation上用tracert命令數據包的行走路徑,更清晰地反應了這一過程: C:\Documents and Settings\bluephoenix>tracert 2.0.0.5 Tracing route to 2.0.0.5 over a maximum of 30 hops 1 <1 ms <1 ms <1 ms 10.0.0.1
2 <1 ms <1 ms <1 ms 1.1.1.2
3 * * * Request timed out.
4 3 ms 3 ms 3 ms 2.0.0.5 2、DNS解析 不論私網用戶和公網用戶他們訪問伺服器時實際上一般都是通過DNS來完成的。讓私網用戶將DNS指向私網內的一台可管理DNS也可以解決這個問題,即修改DNS中關於Server的解析記錄,讓其指向Server的私網IP即可,改過之後用戶就可以使用通常的域名對該伺服器進行訪問了,只不過該過程是透明的,用戶並不知道已經使用了私網IP在進行訪問。 這種方法對我們來說比較輕松,沒有給我們增加維護成本,請大家盡量說服用戶採用這樣的方法,但該方法應用場合有限,如果私網用戶非要使用公網IP地址而不是域名來對Server進行訪問,這種方法就行不通了,那就必須採取第三種方法。 3、loopback與策略路由法 Router的配置步驟為: (1) 建立loopback介面,隨便配置一個IP地址,並將其設為ip nat ouse (2) 建立Access-list,用來匹配私網客戶端訪問Server以及Server做回應的數據流 (3) 定義policy-route table,設置策略預設路由指向loopback介面,設置ip policy-route enable。 (4) 定義route-map,設定匹配Access-list的數據流都使用策略路由;並將這一route-map應用到介面。 (5) 建立一個null 0介面,並由ip nat pool所形成的路由指向null 0介面,以防止不能命中NAT規則的報文在企業網路由器和公網路由器之間震盪。(這一步不是必須的,但為了穩定起見,建議作這一步;另外只能在這種方法中使用指向null 0的路由,如果在第一種方法中使用了,那麼數據包將不會在企業網路由器和公網路由器之間環游一周,而直接被陷在企業網路由器中了,將導致第一種方法失敗。)