想得到网卡对应的ip该怎么做[就是MAC和IP对应]?

DeadWolf 2004-06-07 11:17:29
网上看到有很多得到MAC和IP地址的文章

但是就是找不到,怎样根据MAC得到IP,或者根据IP得到MAC的
[通过ARP和RARP可以实现,我想有没有更直接一点的]
...全文
253 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
PiggyXP 2004-06-09
  • 打赏
  • 举报
回复
晕,楼上好几位都提到了鄙人实在愧不敢当

看了半天还是不知道楼主具体想要实现什么功能,说说看我明天答复你^_^
DeadWolf 2004-06-09
  • 打赏
  • 举报
回复
完成了 结贴
ZHENG017 2004-06-08
  • 打赏
  • 举报
回复
BOOL GetIpAddress(char *hostname)
{
WCHAR msg[128];
HOSTENT *lpHost=NULL;
struct sockaddr_in dest;

lpHost = gethostbyname(hostname);
if (lpHost == NULL)
{
wsprintf(msg, L"gethostbyname failed: %d", WSAGetLastError());
MessageBox(NULL, msg, NULL, MB_OK);
}
else
{
for(int i=0; lpHost->h_addr_list[i] != NULL ;i++)
{
memcpy(&(dest.sin_addr), lpHost->h_addr_list[i],
lpHost->h_length);
wsprintf(msg, L"IP address is: '%S'",
inet_ntoa(dest.sin_addr));
MessageBox(NULL, msg, L"IP Address", MB_OK);
}

}
return 0;
}
DeadWolf 2004-06-08
  • 打赏
  • 举报
回复
楼上的可能我没说清楚

我只要本机上多张网卡的mac以及对应的ip
sevencat 2004-06-08
  • 打赏
  • 举报
回复
我用的函数其实有老的函数相对应的,不过取得的信息不如这个多,所以呵呵呵,那个版本的找不着了。
DeadWolf 2004-06-08
  • 打赏
  • 举报
回复
GetAdapterInfo 看来确实是比较好的解决方案了

明天来结贴
DeadWolf 2004-06-08
  • 打赏
  • 举报
回复
ZHENG017() 好像只能得到IP列表,没有MAC

sevencat(七猫)
满足要求不过只能在xp下,确实伤脑筋

最好是98,2000,me,xp都能使用的


不过还是谢谢大家
sevencat 2004-06-08
  • 打赏
  • 举报
回复
ipv4,ipv6都能用的。不过好像要求是XP或XP以上。记不清了。我有2K的,不过是另外一种方法实现的。
sevencat 2004-06-08
  • 打赏
  • 举报
回复
#pragma once
#define WINVER 0x0400
#define WNNT 0x0400
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <winsock2.h>
#include <WS2tcpip.h>
#include <Iphlpapi.h>
#include <tchar.h>

#pragma comment(lib,"ws2_32")
#pragma comment(lib,"Iphlpapi")

#define DEFAULT_ADAPTER_NUM 32
#define DEFAULT_IPADDR_NUM 32

class Adapter
{
public:
Adapter(){_adapter=NULL;}
Adapter(IP_ADAPTER_ADDRESSES *ipadapter):_adapter(ipadapter){}
bool isValid(){return _adapter!=NULL;}
void getFrom(IP_ADAPTER_ADDRESSES *paddr){_adapter=paddr;}
const char *getName(){return _adapter->AdapterName;}
const WCHAR *getDnsSuffix(){return _adapter->DnsSuffix;}
const WCHAR *getDescription(){return _adapter->Description;}
const WCHAR *getFriendlyName(){return _adapter->FriendlyName;}
const BYTE *getPhysicalAddress(){return _adapter->PhysicalAddress;}
const int getPhysicalAddressLength(){return _adapter->PhysicalAddressLength;}
int getMtu(){return _adapter->Mtu;}
int getIfType(){return _adapter->IfType;}
IF_OPER_STATUS getOperStatus(){return _adapter->OperStatus;}
int getIpv6IfIndex(){return _adapter->Ipv6IfIndex;}
bool isDDnsEnabled(){return getFlags()|IP_ADAPTER_DDNS_ENABLED;}
bool isDhcpEnabled(){return getFlags()|IP_ADAPTER_DHCP_ENABLED;}
private:
int getFlags(){return _adapter->Flags;}
IP_ADAPTER_ADDRESSES *_adapter;
};

class AdapterList
{
public:
bool enumAdapters4(){ return enumAdapters(AF_INET);}

bool enumAdapters6(){ return enumAdapters(AF_INET6);}

int getAdapterNums(){return _nums;}

IP_ADAPTER_ADDRESSES *getAdapter(int index)
{
if(index<0) return NULL;
if(index>=_nums) return NULL;
return _pipadapters[index];
}
private:
bool enumAdapters(int family)
{
_nums=0;
DWORD byteret=sizeof(IP_ADAPTER_ADDRESSES)*DEFAULT_ADAPTER_NUM;
int iret=GetAdaptersAddresses(family,0,NULL,(PIP_ADAPTER_ADDRESSES)_buf,&byteret);
if(iret!=ERROR_SUCCESS) return false;
PIP_ADAPTER_ADDRESSES paddr=(PIP_ADAPTER_ADDRESSES)_buf;
while(paddr)
{
_pipadapters[_nums]=paddr;
paddr=paddr->Next;
if(paddr) _nums++;
}
return true;
}
char _buf[sizeof(IP_ADAPTER_ADDRESSES)*DEFAULT_ADAPTER_NUM];
PIP_ADAPTER_ADDRESSES _pipadapters[DEFAULT_ADAPTER_NUM];
int _nums;
};


class IpAddrList
{
public:
int getIpAddrNums(){return ((LPSOCKET_ADDRESS_LIST)_buf)->iAddressCount;}
protected:
bool enum4(){ return enumIpAddr(AF_INET);}
bool enum6(){ return enumIpAddr(AF_INET6);}

sockaddr *getSockAddr(int index)
{
LPSOCKET_ADDRESS_LIST paddrlist=(LPSOCKET_ADDRESS_LIST)_buf;
if(index<0) return NULL;
if(index>=paddrlist->iAddressCount) return NULL;
return paddrlist->Address[index].lpSockaddr;
}
private:
bool enumIpAddr(int family)
{
WSADATA m_data;
WSAStartup(MAKEWORD(2,2),&m_data);
SOCKET fd=socket(family,SOCK_DGRAM,0);
LPSOCKET_ADDRESS_LIST paddrlist=(LPSOCKET_ADDRESS_LIST)_buf;
unsigned long nBytesReturned=sizeof(SOCKET_ADDRESS_LIST)*DEFAULT_IPADDR_NUM;
int iret=WSAIoctl(fd,SIO_ADDRESS_LIST_QUERY,0, 0, paddrlist,nBytesReturned, &nBytesReturned, 0, 0);
closesocket(fd);
WSACleanup();
if(SOCKET_ERROR==iret) return false;
}
char _buf[sizeof(SOCKET_ADDRESS_LIST)*DEFAULT_IPADDR_NUM];
};

class Ip4AddrList: public IpAddrList
{
public:
bool enumAddr(){return enum4();}
in_addr getAddr(int index)
{
sockaddr_in *psa=(sockaddr_in*)getSockAddr(index);
if(psa)
return psa->sin_addr;
else
{
//complier will o it.
in_addr temp;
temp.S_un.S_addr=INADDR_NONE;
return temp;
}
}
};

class Ip6AddrList: public IpAddrList
{
public:
bool enumAddr(){return enum6();}
in_addr6 getAddr(int index)
{
sockaddr_in6 *psa6=(sockaddr_in6*)getSockAddr(index);
if(psa6)
return psa6->sin6_addr;
else
{
static in_addr6 temp={0,0,0,0,0,0,0,0};
return temp;
}
}
};
sevencat 2004-06-07
  • 打赏
  • 举报
回复
只能是同一个网内的比较有用,不在同一个网内就不可能了。
DeadWolf 2004-06-07
  • 打赏
  • 举报
回复
谢谢

我试试

有结果就来结贴,欢迎继续提供建议
halk 2004-06-07
  • 打赏
  • 举报
回复
同意楼上,GetAdapterInfo是我常用的方法,我觉得这样比netbios方法简单。

PiggyXP擅长使用netbios来获取mac和ip的对应关系,你可以发信息请教它 :)
Eearbird 2004-06-07
  • 打赏
  • 举报
回复
在msdn中查找函数:
GetAdaptersInfo
这一组函数可以遍历网卡信息
自由的风 2004-06-07
  • 打赏
  • 举报
回复
关于这个 PiggyXP 非常了解,可以向他要,他好象有例子

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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