获取mac地址

虎滴小猪猪 2009-12-22 03:34:19
这是一段通过socket连接获取远程机器的Mac地址,第一个参数时int sockfd,我用的是TCustomSocket* Socket,请问怎么转换Socket然后作为参数传入此函数。

int getpeermac( int sockfd, char *buf )
{
int ret =0;
struct arpreq arpreq;
struct sockaddr_in dstadd_in;
socklen_t len = sizeof( struct sockaddr_in );
memset( &arpreq, 0, sizeof( struct arpreq ));
memset( &dstadd_in, 0, sizeof( struct sockaddr_in ));
if( getpeername( sockfd, (struct sockaddr*)&dstadd_in, &len ) < 0 )
err_err("getpeername()");
else
{
memcpy( &arpreq.arp_pa, &dstadd_in, sizeof( struct sockaddr_in ));
strcpy(arpreq.arp_dev, "eth1");
arpreq.arp_pa.sa_family = AF_INET;
arpreq.arp_ha.sa_family = AF_UNSPEC;
if( ioctl( sockfd, SIOCGARP, &arpreq ) < 0 )
err_err("ioctl SIOCGARP");
else
{
unsigned char* ptr = (unsigned char *)arpreq.arp_ha.sa_data;
ret = sprintf(buf, "%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));
}
}
return ret;
}
int getpeermac( int sockfd, char *buf )
{
int ret =0;
struct arpreq arpreq;
struct sockaddr_in dstadd_in;
socklen_t len = sizeof( struct sockaddr_in );
memset( &arpreq, 0, sizeof( struct arpreq ));
memset( &dstadd_in, 0, sizeof( struct sockaddr_in ));
if( getpeername( sockfd, (struct sockaddr*)&dstadd_in, &len ) < 0 )
err_err("getpeername()");
else
{
memcpy( &arpreq.arp_pa, &dstadd_in, sizeof( struct sockaddr_in ));
strcpy(arpreq.arp_dev, "eth1");
arpreq.arp_pa.sa_family = AF_INET;
arpreq.arp_ha.sa_family = AF_UNSPEC;
if( ioctl( sockfd, SIOCGARP, &arpreq ) < 0 )
err_err("ioctl SIOCGARP");
else
{
unsigned char* ptr = (unsigned char *)arpreq.arp_ha.sa_data;
ret = sprintf(buf, "%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));
}
}
return ret;
}
...全文
597 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyq5945 2009-12-22
  • 打赏
  • 举报
回复
windows上用SendARP,但只能获取直接通信的物理地址.
zyq5945 2009-12-22
  • 打赏
  • 举报
回复
额,这个是不是发错了,ioctl是linux的函数,你该到C/C++区去问.
//我就知道本地MAC是这样获取的.
int sock;
struct ifreq ifr;
unsigned char macaddr[6];
iostl(sock, SIOCGIFHWADDR, &ifr);
memcpy(macaddr, ifr.ifr_hwaddr.sa_data,6);
danxuezx 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ljfwyh 的回复:]
我是想通过通信已经连接上后,在服务器端获取客户端的Mac地址。
[/Quote]
那现在有什么问题?
MoXiaoRab 2009-12-22
  • 打赏
  • 举报
回复
虎滴小猪猪 2009-12-22
  • 打赏
  • 举报
回复
我是想通过通信已经连接上后,在服务器端获取客户端的Mac地址。
aoyihuashao 2009-12-22
  • 打赏
  • 举报
回复
VC获取网卡MAC 源码
http://www.cnblogs.com/aoyihuashao/archive/2009/12/14/1623683.html
我以前用过的。
danxuezx 2009-12-22
  • 打赏
  • 举报
回复
getpeername第一个参数要求传入SOCKET 类型的变量。

您用socket函数把 TCustomSocket* Socket中相应的内容传进去然后得到这个SOCKET的值传进去就好了。
我建议您把这个函数第一个参数改成SOCKET
因为MS定义的SOCKET如下:typedef UINT_PTR SOCKET;
jyh_baoding 2009-12-22
  • 打赏
  • 举报
回复
查一下有关的书籍,比如网络编程之类

18,356

社区成员

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

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