关于获得本机IP(分数只加给第一个正确解答者)
在win2k下,一台机器可以同时建立多个连接,每个连接都有一个自己的IP地址。我用什么办法可以获得所有的这些IP?希望得到源程序。 问题点数:20、回复次数:24Top
1 楼pp616(坏蛋)回复于 2001-06-27 20:56:19 得分 0
ip地址是相同的。不同的是端口。Top
2 楼fanzai(帆仔)回复于 2001-06-27 21:20:34 得分 0
不是的,IP地址也是不同的。比如说,我在用电话线上Internet的同时还和自家的另一台机器通过串口连接。这样可以在右下角的两个连接图标中,分别获得两个连接的各自的IP地址。一个IP地址只能在Internet上使用,而另一个IP地址则只能在和自家机器通讯时使用。
(win9x不支持同时建立两个连接,我只在win2k上遇到过这样的麻烦。)Top
3 楼game_boy(gamesboy)回复于 2001-06-27 21:22:32 得分 0
多個連接用相同的一個IP地址,不同的端口號.不過這些連接的對方--遠程主機,可能是不同的機器,所以可能有不同的IP地址,你是不是想的到對方的IP地址?
gethostbyname()Top
4 楼game_boy(gamesboy)回复于 2001-06-27 21:24:12 得分 0
通過穿口用的可不是TCP/IP協議,哪有IP地址阿Top
5 楼bucher(无人永生)回复于 2001-06-27 22:01:38 得分 0
try this
shell "start aa.bat"
aa.bat
netstat -a >myfile.txt
这个可是最方便的,什么API也不需要。Top
6 楼xianserver(我要学习,你有什么好东西我都要!)回复于 2001-06-27 23:38:55 得分 0
用NETXRAY看一下!分析后就差不多了Top
7 楼fanzai(帆仔)回复于 2001-06-28 20:28:37 得分 0
唉!上面的回复都不合我意。
1、我的机器确实可以同时拥有两个或者更多的IP。其实网吧的主机都是这个样子的,网吧的主机至少要有两个IP,一个供给上Internet时使用(一般是:61.*.*.*);另一个供给其他机器访问主机使用(一般是:192.*.*.*)。
2、我要的是在VB中能够查询IP的方法。如果借助其它软件,我自己已经会了,在右下角的两个连接图标中就可以获得,而且方便准确。
希望能够得到高手的帮助!Top
8 楼fanzai(帆仔)回复于 2001-06-28 20:49:33 得分 0
没人回答我吗?Top
9 楼hnxiaoma(随便叫个名字?!)回复于 2001-06-28 20:51:26 得分 0
如果你想得到本机的id,我觉得可以调用api函数来解决。
首先,调用gethostname得到本机名称,然后调用gethostbyname就可得到本机的所有ip.另外如果本机正在拨号,可以调用ras(远程调用)的api函数RasEnumConnections得到本机的所有链接,然后根据每个链接用函数RasGetProjectionInfo得到链接的服务器端ip和客户端ip。可否?Top
10 楼crazyfightboy(crazyfightboy)回复于 2001-06-28 20:51:58 得分 0
使用winsock控件Top
11 楼fanzai(帆仔)回复于 2001-06-28 20:56:21 得分 0
to crazyfightboy(crazyfightboy):
能详细一些吗?Top
12 楼fanzai(帆仔)回复于 2001-06-28 21:31:10 得分 0
真的没人帮我了?Top
13 楼huanggx(大侠)回复于 2001-06-28 21:36:24 得分 0
你说的是在VB中吗?如果是,请看代码:
1、启动一个新工程,添加一个窗体Form1
2、添加一个CommandButton和一个Command1
3、把下面代码放在Form1的声明中
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 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 gethostname Lib "WSOCK32.DLL" (ByVal hostname$,
HostLen&) 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
Sub 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 is not responding."
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 version " & sLowByte & "." & sHighByte
sMsg = sMsg & " is not supported by winsock.dll "
MsgBox sMsg
End
End If
If WSAD.iMaxSockets < MIN_SOCKETS_REQD Then
sMsg = "This application requires a minimum of "
sMsg = sMsg & Trim$(Str$(MIN_SOCKETS_REQD)) & " supported
sockets."
MsgBox sMsg
End
End If
End Sub
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
Sub Form_Load()
SocketsInitialize
End Sub
Private Sub Form_Unload(Cancel As Integer)
SocketsCleanup
End Sub
Private Sub Command1_click()
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
If gethostname(hostname, 256) = SOCKET_ERROR Then
MsgBox "Windows Sockets error " & Str(WSAGetLastError())
Exit Sub
Else
hostname = Trim$(hostname)
End If
hostent_addr = gethostbyname(hostname)
If hostent_addr = 0 Then
MsgBox "Winsock.dll is not responding."
Exit Sub
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)
MsgBox hostname
MsgBox ip_address
End Sub
4、按F5键运行你的工程.
5、单击Command1就获得了本机的IP等信息
其实这是MSDN中的例程,我也是借花献佛。:)
Top
14 楼hnxiaoma(随便叫个名字?!)回复于 2001-06-28 21:36:45 得分 0
帆仔:
我提供的方法绝对可以得到本机的ip.但不知你的目的是不是这个了。Top
15 楼fanzai(帆仔)回复于 2001-06-29 20:13:44 得分 0
我试过大侠的代码了,只能得到一个IP(61.158.77.2),而另一个IP(169.254.98.103)得不到。
小马说的第一种方法似乎和大侠的代码一样,我不知道如何可以利用这个方法得到两个IP。而第二个方法似乎很好,但我不会,我不知那里有关于winsock的详细教程,我对winsock了解实在甚少。希望小马能够再指点一下,最好能给出源代码(我连winsock的声明都不会,“API 浏览器”里没有)。
其他的高手如果有什么好的想法,还希望不惜赐教。我那小小的20分还没主呢!Top
16 楼fanzai(帆仔)回复于 2001-06-29 20:27:26 得分 0
我的这个问题真的这么难解决吗?
真的没有人能够帮我正确详细地解答?Top
17 楼NowCan(城市浪人)回复于 2001-06-29 20:34:09 得分 0
我用C完全可以,VB嘛,还没有试过,回去试试,下周一给你答复。Top
18 楼fanzai(帆仔)回复于 2001-06-29 20:44:00 得分 0
谢谢你,NowCan!
你也可以先把vc的程序告诉我,vc我可以看懂一点点。如果我看懂了,就不用麻烦你了。
当然如果你不怕浪费时间愿意帮我用vb再写一遍,那是再好不过的了!Top
19 楼hnxiaoma(随便叫个名字?!)回复于 2001-06-30 00:39:35 得分 0
fanzai:
我这里倒有VC的程序,但是如何给你呢?
Top
20 楼totodo(土豆仙)回复于 2001-06-30 00:52:33 得分 0
如果直接获得本机的mac地址可以么?
这是我在学Pb时候看到的vc代码,可能对你有些帮助吧。以下是c语言获取网卡mac地址的程序
#include <windows.h>
#include <wincon.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;
/*得到LANA编号*/
//lana返回的的LANA数组
//返回LANA数量
int __stdcall __declspec(dllexport) GetLanaID(int *lana)
{
NCB Ncb;
UCHAR uRetCode;
LANA_ENUM lenum;
int i;
memset( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBENUM;
Ncb.ncb_buffer = (UCHAR *)&lenum;
Ncb.ncb_length = sizeof(lenum);
uRetCode = Netbios( &Ncb );
if (uRetCode==NRC_GOODRET)
{
for (i=0; i < lenum.length ;i++)
lana[i] = lenum.lana[i];
}
return lenum.length;
}
/*得到MAC地址*/
//LANAID:LANA编号,输入参数
//addr:返回的MAC地址
//返回0表示成功,反之,失败
int __stdcall __declspec(dllexport) GetMACAddress(int LANAID,int *addr)
{
NCB Ncb;
UCHAR uRetCode;
char NetName[50];
ASTAT Adapter;
memset( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = LANAID;
uRetCode = Netbios( &Ncb );
memset( &Ncb, 0, sizeof (Ncb) );
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = LANAID;
strcpy( Ncb.ncb_callname, "* " );
Ncb.ncb_buffer = (char *) &Adapter;
Ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios( &Ncb );
if ( uRetCode == 0 )
{
addr[0]= Adapter.adapt.adapter_address[0];
addr[1]= Adapter.adapt.adapter_address[1];
addr[2]= Adapter.adapt.adapter_address[2];
addr[3]= Adapter.adapt.adapter_address[3];
addr[4]= Adapter.adapt.adapter_address[4];
addr[5]= Adapter.adapt.adapter_address[5];
}
return uRetCode;
}
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}Top
21 楼fanzai(帆仔)回复于 2001-06-30 14:33:10 得分 0
to hnxiaoma(小马):
我的伊妹儿:zhenfan@0451.com
希望能够加上主要原理的介绍。Top
22 楼hnxiaoma(随便叫个名字?!)回复于 2001-06-30 20:45:46 得分 0
我只能在明天才能给你发代码,不知是否来得及?Top
23 楼hnxiaoma(随便叫个名字?!)回复于 2001-06-30 21:33:08 得分 20
帆仔:
源程序已经给你发过去了。Top
24 楼fanzai(帆仔)回复于 2001-07-01 12:23:48 得分 0
谢谢hnxiaoma(小马),你的邮件我已收到。我大概看了看,有很多看不懂的地方,但感觉你的程序是完全符合我的需要的。我暂时没有很充足的时间来仔细研究,也许以后等我边学VC边看你的程序的时候我会有许多地方要问你。(我早就有要学VC的想法了)
如果你最近有闲余时间可以帮我用vb再写一遍,我会更感激你。
我先给你加分了!分数不多,仅表心意!Top




