SendARP的问题

daydayup234 2006-11-29 10:41:16
__published:
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private:
typedef unsigned long(__import __stdcall Fun_2ul2ulPtrTOul)(unsigned long,unsigned long,unsigned long*,unsigned long*);
Fun_2ul2ulPtrTOul *Func1;
bool fromIPtoMAC(String&);
public:
__fastcall Tmain_(TComponent* Owner);
###################################################################
bool Tmain_::fromIPtoMAC(String& S)
{ HINSTANCE hIphlpapiDll;
hIphlpapiDll=LoadLibrary("iphlpapi.dll");
if(hIphlpapiDll==NULL)
{
FreeLibrary(hIphlpapiDll);
S="好像没有找到iphlpapi.dll";
return false;
}

unsigned long Rt,L_id,*L_MAC,L_phyAddrLen;
Rt=-1;
L_id=inet_addr(S.c_str());// inet_appr #include <winsock2.h>
if(L_id==INADDR_NONE)
{
FreeLibrary(hIphlpapiDll);
S="无效IP地址--"+S;
return false;
}
__int64 x=0;
L_MAC=reinterpret_cast<unsigned long*>(&x);
L_phyAddrLen=6;

(FARPROC &)Func1=GetProcAddress (hIphlpapiDll,"SendARP");
Rt=Func1(L_id,0,L_MAC,&L_phyAddrLen);
if(Rt!=0)
{
FreeLibrary(hIphlpapiDll);
S="没找到机器--"+S;
return false;
}

String Str_MAC;
Str_MAC=IntToHex(x,8).SubString(1,12);
Str_MAC=Str_MAC.Length()<12?"0"+Str_MAC:Str_MAC;
S=S+" "+Str_MAC;

FreeLibrary(hIphlpapiDll);
return true;
}
############################################################
void __fastcall Tmain_::Button1Click(TObject *Sender)
{
String s;
s="124.168.1.66" ;
fromIPtoMAC(s);
ShowMessage(s);
}
#############################################################
问题是如果
尝试我同网关上机子,通过

124.168.1.66不在我网关上就不行

运行\\124.168.1.66打开好好的啊

why

...全文
515 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
truelove7283159 2006-12-07
  • 打赏
  • 举报
回复
up
constantine 2006-12-07
  • 打赏
  • 举报
回复
有,
印象中控制台都有一个命令可以得到,你也可以发送那个命令,然后读取结果
命令我不记得了,你自己查一下
daydayup234 2006-12-07
  • 打赏
  • 举报
回复
我去试试安吉儿的办法,成功了加分

User Datagram Protocol 用户数据报协议UDP据说也可以

不知道默认的xp系统这个协议装着不
huzhangyou 2006-12-07
  • 打赏
  • 举报
回复
很多工具软件都可以有这个功能
我想方法肯定还是有的
constantine 2006-12-06
  • 打赏
  • 举报
回复
#include "winsock.h"
#include <nb30.h>
#include <iostream.h>

LPCSTR __fastcall GetMacAddress(AnsiString str)
{
WSAData GInitData;
if (WSAStartup(MAKEWORD(2,1),&GInitData) != 0)
{
return "初始化SOCKET函数失败!";
}
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuf[30];
}ASTAT,* PASTAT;
ASTAT Adapter;
NCB ncb;
UCHAR uRetCode;
memset(&ncb,0,sizeof(ncb));
ncb.ncb_command=NCBRESET;
ncb.ncb_lana_num=0;
uRetCode=Netbios(&ncb);
memset(&ncb,0,sizeof(ncb));
ncb.ncb_command=NCBASTAT;
ncb.ncb_lana_num=0;
strcpy((char *)ncb.ncb_callname,str.c_str());
ncb.ncb_buffer=(unsigned char *)&Adapter;
ncb.ncb_length=sizeof(Adapter);
uRetCode=Netbios(&ncb);
if(uRetCode==0)
{
char mac[15], * lpmac;
sprintf(mac,"%02X-%02X-%02X-%02X-%02X-%02X",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5]);
lpmac=mac;
WSACleanup();
return lpmac;
}
else
{
WSACleanup();
return "无法解释MAC地址";
}
}

试试看这个能不能跨网段吧,我没有试过,这边没有环境
constantine 2006-12-06
  • 打赏
  • 举报
回复
SendARP 是有极限的,do2008说的对,
你们的子网掩码不一样!!所以不行

CruelYoung123 2006-12-04
  • 打赏
  • 举报
回复
关注学习...
daydayup234 2006-12-04
  • 打赏
  • 举报
回复
跨网段如何得到MAC地址阿
哪位能给个思路不

那个“优化大师”可是可以,不知道如何实现
i_love_pc 2006-11-29
  • 打赏
  • 举报
回复
内行看门道,
外行看热闹.
daydayup234 2006-11-29
  • 打赏
  • 举报
回复
运行\\124.168.1.66打开机器正常
刚才还拷了它个文件哩
ping 当然也正常
124.168.1.66可是内网地址阿

怎么算跨网段阿,不是一个网关 ?
ccrun.com 2006-11-29
  • 打赏
  • 举报
回复
正如do2008所说,ARP包不能跨网段。
do2008 2006-11-29
  • 打赏
  • 举报
回复
Address Resolution Protocol(ARP)地址解析协议,是低层协议,并不能跨路由
daydayup234 2006-11-29
  • 打赏
  • 举报
回复
但是1月前用静态加载iphlpapi.dll
iphlpapi.lib加入工程

好像找到过124.168.1.66,获得了他的MAC地址阿
do2008 2006-11-29
  • 打赏
  • 举报
回复
好像是ARP包不能跨网段发送

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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