有没有哪个API能获取外网IP的呢?

yjt258 2008-06-13 05:13:14
我看到好多取外网IP的都要借助一个外网服务器才能取到,问下各位高人除了借助外网服务器外还有没有更好的办法。多谢了!!!
...全文
356 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjt258 2008-06-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 myjian 的回复:]
哈哈.

都修炼了什么神功?

TO 楼主: 你还是老实用一个外部页吧,比如IP138.API的貌似不太适合你.
[/Quote]
没办法,平明在网上找些原码不可能都有VB版的,结果就找什么原码看什么原码,看来看去就好像都能看懂一点一点了。
多谢各位了,看来还是就用一个外部页面算了,结贴了。
嗷嗷叫的老马 2008-06-14
  • 打赏
  • 举报
回复
楼上貌似消失了一段时间.

刚回来地球?
嗷嗷叫的老马 2008-06-14
  • 打赏
  • 举报
回复
嗷嗷叫的老马 2008-06-14
  • 打赏
  • 举报
回复
哈哈.

都修炼了什么神功?

TO 楼主: 你还是老实用一个外部页吧,比如IP138.API的貌似不太适合你.
IORI915189 2008-06-14
  • 打赏
  • 举报
回复
TO 老马 恩 恩 小弟去火星闭关了一段时间 才回来。。。。 呵呵


TO 楼主 也许只有一楼你自己提到的方法才适合你。
yjt258 2008-06-14
  • 打赏
  • 举报
回复
哪位老大能不能再发个C++的代码看看,多看几个不一样的代码也许能明白点。多谢各位了!
IORI915189 2008-06-13
  • 打赏
  • 举报
回复
不识货。。。

嗷嗷叫的老马 2008-06-13
  • 打赏
  • 举报
回复
要是某个问题根本就无简单方案解决,是不是你就放弃了呢.
yjt258 2008-06-13
  • 打赏
  • 举报
回复
郁闷,感觉你这代码太深澳了没看懂,不知还有没有简单点的办法
happy_sea 2008-06-13
  • 打赏
  • 举报
回复
试试下面的代码:

Public Const WS_VERSION_REQD = &H101
Public Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF&
Public Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&
Public Const MIN_SOCKETS_REQD = 1
Public Const SOCKET_ERROR = -1
Public Const WSADescription_Len = 256
Public Const WSASYS_Status_Len = 128

Public Type HOSTENT
hName As Long
hAliases As Long
hAddrType As Integer
hLength As Integer
hAddrList As Long
End Type

Public 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

Public Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
Public Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired&, lpWSAData As WSADATA) As Long
Public Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
Public Declare Function gethostname Lib "WSOCK32.DLL" (ByVal hostname$, ByVal HostLen As Long) As Long
Public Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal hostname$) As Long
Public 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

Public Function CurrentIP(ReturnExternalIP As Boolean)
Dim hostname As String * 256
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
Dim IP As String

If gethostname(hostname, 256) = SOCKET_ERROR Then
MsgBox "Windows Socket Error " & Str(WSAGetLastError())
Exit Function
Else
hostname = Trim$(hostname)
End If
hostent_addr = gethostbyname(hostname)


If hostent_addr = 0 Then
MsgBox "Winsock.dll error."
Exit Function
End If
RtlMoveMemory host, hostent_addr, LenB(host)
RtlMoveMemory hostip_addr, host.hAddrList, 4

Do
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)

internal = TheIP ' Send ONLY the External IP to the CurrentIP Function
external = ip_address ' Send the External IP to the function parameter External
TheIP = ip_address ' Send LAN IP to the function para Internal

ip_address = ""
host.hAddrList = host.hAddrList + LenB(host.hAddrList)
RtlMoveMemory hostip_addr, host.hAddrList, 4
Loop While (hostip_addr <> 0)

CurrentIP = IIf(ReturnExternalIP, external, internal)
End Function

Sub SocketsCleanup()
Dim lReturn As Long
lReturn = WSACleanup()

If lReturn <> 0 Then
MsgBox "Socket Error " & Trim$(Str$(lReturn)) & " occurred In Cleanup "
End
End If
End Sub


使用方法:
Private Sub Command1_Click()
MsgBox CurrentIP(False)
MsgBox CurrentIP(True)
End Sub

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧