实现代码:

#include

#include

#include

#include

#include

#include

#include

#include "inet_sockets.h"

//

//根据连接的套接字文件描述符获取客户端信息

//

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 )

printf("getpeername()");

else

{

printf("client ip:%s\n",inet_ntoa(dstadd_in.sin_addr));

memcpy( &arpreq.arp_pa, &dstadd_in, sizeof( struct sockaddr_in ));

strcpy(arpreq.arp_dev, "eth0");

arpreq.arp_pa.sa_family = AF_INET;

arpreq.arp_ha.sa_family = AF_UNSPEC;

if(ioctl(sockfd,SIOCGARP, &arpreq )

perror("arp:--");

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

}

}

printf("%s\n",buf);

return ret;

}

/**

ARP高速缓存操作,包含IP地址和硬件地址的映射表

操作ARP高速缓存的命令字 SIOCDARP,SIOCGARP,SIOCSARP分别是删除ARP高速缓存的一条记录,获得ARP高速缓存的一条记录和修改ARP高速缓存的一条记录

struct arpreq

{

struct sockaddr arp_pa; //协议地址

struct sockaddr arp_ha;//硬件地址

int arp_flags;//标记

struct sockaddr arp_netmask;//协议地址的子网掩码

char arp_dev[16];//查询网络接口的名称

}

**/

//根据IP地址获取MAC,操作ARP缓存

int getpeermac_by_ip(char *ipaddr)

{

int s;

int err;

struct arpreq arpreq;

struct sockaddr_in *addr=(struct sockaddr_in*)&arpreq.arp_pa; //IP地址

s=socket(AF_INET,SOCK_STREAM,0);

if(s<0)

{

perror("socket error");

}

addr->sin_family=AF_INET;      //协议族

addr->sin_addr.s_addr=inet_addr(ipaddr); //IP地址

if(addr->sin_addr.s_addr==INADDR_NONE)

{

printf("IP地址格式错误\n");

}

strcpy(arpreq.arp_dev,"eth0"); //网卡名字

err=ioctl(s,SIOCGARP,&arpreq);

if(err==-1)

{

perror("arp");

return;

}

unsigned char* hw=(unsigned char*)&arpreq.arp_ha.sa_data; //硬件地址

printf("%s\n",ipaddr);

printf("%02x:%02x:%02x:%02x:%02x:%02x\n",hw[0],hw[1],hw[2],hw[3],hw[4],hw[5]);

close(s);

return 0;

}

//获取本地MAC

int get_mac(char* mac)

{

struct ifreq tmp;

int sock_mac;

char mac_addr[30];

sock_mac = socket(AF_INET, SOCK_STREAM, 0);

if( sock_mac == -1){

perror("create socket fail\n");

return -1;

}

memset(&tmp,0,sizeof(tmp));

strncpy(tmp.ifr_name,"eth0",sizeof(tmp.ifr_name)-1 );

if( (ioctl(sock_mac,SIOCGIFHWADDR, &tmp))

printf("mac ioctl error\n");

return -1;

}

sprintf(mac_addr, "%02x%02x%02x%02x%02x%02x",

(unsigned char)tmp.ifr_hwaddr.sa_data[0],

(unsigned char)tmp.ifr_hwaddr.sa_data[1],

(unsigned char)tmp.ifr_hwaddr.sa_data[2],

(unsigned char)tmp.ifr_hwaddr.sa_data[3],

(unsigned char)tmp.ifr_hwaddr.sa_data[4],

(unsigned char)tmp.ifr_hwaddr.sa_data[5]

);

printf("local mac:%s\n", mac_addr);

close(sock_mac);

memcpy(mac,mac_addr,strlen(mac_addr));

return 1;

}

int main(int argc,char *argv[]){

int fd;

char buff[2014];

fd=inetListen("8080",SOCK_STREAM, NULL);

printf("server waiting: \n");

int afd=inetAccept(fd,"8080",NULL);

if(afd>0){

getpeermac(afd,buff);

int size=read(afd,buff,1024);

if(size >0){

printf("%s",buff);

}

}

while(1){}

return 0;

}

linux软件 mac地址,Linux MAC地址相关推荐

  1. linux 软件 名称 更新,linux软件版本管理命令update-alternatives使用详解

    linux软件版本管理命令update-alternatives使用详解 update-alternatives 命令用于处理linux系统中软件版本的切换,在各个linux发行版中均提供了该命令,命 ...

  2. 红旗linux软件下载,红旗linux操作系统下载

    红旗Linux桌面版是一款linux操作系统镜像文件.这个一个非常好用的系统,界面简洁干净,运行非常流畅,即使是老主机也可以轻松带动.同时稳定性也是非常不错.喜欢就来当易网下载吧! 红旗Linux操作 ...

  3. linux软件手机下载,linux软件下载

    手机评站网今天精心准备的是<linux软件下载>,下面是详解! linux怎么安装软件 希望能帮助我操作一下... 希望能帮助我操作一下 1.打开系统,可以看到桌面,找到软件中心,打开软件 ...

  4. FreeBSD可以安装Linux软件吗,在Linux服务器上面通过网络安装FreeBSD

    原文出自 http://www.daemonology.net/blog/2008-01-29-depenguinator-2.0.html,有修改. 有时候,出于某种需要,我们可能想把自己的主机重装 ...

  5. 嵌入式Linux 软件界面,嵌入式Linux下的图形用户界面系统设计

    为了满足嵌入式系统的界面设计需求,给出了一种图形用户界面系统SKY-GUI的设计思路和其在嵌入式Linux环境下的实现方法.SKY-GUI有四大组成部分:输入抽象层.显示抽象层.事件系统和窗口系统.其 ...

  6. linux 软件做raid,Linux用软件实现RAID 的方法

    数据的安全性是人们在使用计算机中最重要的问题之一.通常情况下,人们会在服务器环境中采用硬盘镜像技术,以达到数据的双重备份.同样在Linux环境下,我们可以采用这种技术.在Linux环境下,我们可以采用 ...

  7. linux 软件备份 主从,linux高可用(HA)keepalived 主从备份

    利用keepalived可以实现对linux服务器的高可用性,即主从备份,一台线上服务器出故障另外一台服务器顶替它,当出故障的服务器恢复时又自动转换成主服务器,顶替它的服务器再次转换为备胎,当主服务器 ...

  8. rtos与linux软件开发,实时Linux和RTOS的基本特性及技术进行比较

    描述 体系结构异同 对实时操作系统(RTOS)特性进行比较和分析.对于我们刚接触这个操作系统时一定要对他们要有一定的了解,我们先对实时操作系统来了解下,它就是指当外界事件或数据产生时,能够接受并以足够 ...

  9. linux 软件源 ppa,Linux 添加PPA源

    我们在使用Ubuntu安装程序时经常会遇到添加软件源的操作,最常见的是ppa软件源. 例如:sudo add-apt-repository ppa:rvm/smplayer 这就是添加smplayer ...

  10. veket linux软件下载,veket linux系统下载-veket操作系统 v20 最新版-极光下载站

    veket系统官方版是国内大神根据linux研发的全新电脑系统,这款系统体积非常小巧,运行稳定,并且自带丰富的办公娱乐功能,集成的各种工具能够很好的帮你完成各种事情. veket操作系统介绍 veke ...

最新文章

  1. 清华大学《大数据系统基础》项目征集说明(2021年秋季)
  2. golang中的base64
  3. webpack使用加载器来加载CSS样式
  4. 手撕 CNN 之 AlexNet(PyTorch 实战篇)
  5. 链路层 ---《TCP/IP协议》卷一
  6. MySQL子查询作为列_mysql 列子查询
  7. 恢复 linux系统密码
  8. 微软IT规划方法论解读
  9. Spring框架中XML配置特殊属性注入
  10. 是清单 Dog List的子类 Animal ? 为什么Java泛型不是隐式多态的?
  11. Xcode 8 Swift 类似插件方法
  12. python编程课第七课_Python 第7课 if的介绍和使用
  13. mongodb 什么比mysql快_MongoDB为什么比mysql效率高
  14. 从DDPM到DDIM:深入解读《Denoising Diffusion Implicit Models》
  15. 从十七年蝉谈起——hashtable的表格大小为什么要选择质数
  16. 理论+实操: MySQL索引与事务、视图、存储过程(软件开发用的多)、存储引擎MyISAM和InnoDB
  17. 【重识前端】闭包与模块
  18. 内蒙古自治区律师事务所排名情况
  19. 如何运用计算机辅助英语教学,谈英语计算机辅助教学 (中学英语教学论文)
  20. 《三峡好人》,《黄金甲》所折射的电影学意义

热门文章

  1. Unity记录3.1-地图-TileMap简单使用、鼠标拖动放置Tile
  2. mysql 查询不等于空的数据查询
  3. java 调用麦克风录音_Java 实现麦克风自动录音
  4. GFP:新一代多业务传输技术(转)
  5. oracle如何实现自增?----用序列sequence的方法来实现
  6. 特征空间之点检测(MATLAB)
  7. 【蓝桥杯嵌入式】【STM32】14_CT117E_EXA蓝桥杯嵌入式扩展板硬件资源一览及其驱动编写
  8. 代码创建完整数据库系统,创建数据库、创建模式、输入数据、注释全面,易懂
  9. Android Bluetooth蓝牙开发\蓝牙协议\蓝牙通信例子_Android支持蓝牙4.0版本_BLE开发
  10. 【Typora】 自定义背景颜色(护眼绿) 高亮颜色 选中内容颜色 高亮快捷键