`

通过建立好连接的socket或者IP获取对端MAC地址

 
阅读更多

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <net/if_arp.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>

int getPeerMacbySocketFd( int sockfd, char *buf, char* localethname )
{
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 )
{
perror( "get peer name wrong, %s/n", strerror(errno) );
return -1;
}
else
{
memcpy( ( struct sockaddr_in * )&arpreq.arp_pa, ( struct sockaddr_in * )&dstadd_in, sizeof( struct sockaddr_in ));
strcpy(arpreq.arp_dev, localethname);
arpreq.arp_pa.sa_family = AF_INET;
arpreq.arp_ha.sa_family = AF_UNSPEC;
if( ioctl( sockfd, SIOCGARP, &arpreq ) < 0 )
{
perror( "ioctl SIOCGARP wrong, %s/n", strerror(errno) );
return -1;
}
else
{
unsigned char* ptr = (unsigned char *)arpreq.arp_ha.sa_data;
sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));
}
}
return ret;
}

int gahGetPeerMacbyIp(char *ipaddr, char* buf, char* localethname)
{
int sockfd;
unsigned char *ptr;
struct arpreq arpreq;
struct sockaddr_in *sin;
struct sockaddr_storage ss;
char addr[INET_ADDRSTRLEN+1];

memset(addr, 0, INET_ADDRSTRLEN+1);
memset(&ss, 0, sizeof(ss));

sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
trace(3, "socket error");
return -1;
}
sin = (struct sockaddr_in *) &ss;
sin->sin_family = AF_INET;
if (inet_pton(AF_INET, ipaddr, &(sin->sin_addr)) <= 0) {
trace(3, "inet_pton error");
return -1;
}
sin = (struct sockaddr_in *) &arpreq.arp_pa;
memcpy(sin, &ss, sizeof(struct sockaddr_in));
strcpy(arpreq.arp_dev, localethname);
arpreq.arp_ha.sa_family = AF_UNSPEC;
if (ioctl(sockfd, SIOCGARP, &arpreq) < 0) {
trace(3, "ioctl SIOCGARP: ");
return -1;
}
ptr = (unsigned char *)arpreq.arp_ha.sa_data;
sprintf(buf,"%02x:%02x:%02x:%02x:%02x:%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));
return 0;
}

分享到:
评论

相关推荐

    iptoaddress ip获取

    例如,Python的`socket`库可以用于DNS解析,`arp`命令或第三方库如`psutil`可以用来获取MAC地址。这些工具使得开发者能够轻松地处理网络通信中的地址转换问题。 总的来说,“iptoaddress ip获取”这个主题涵盖了...

    java利用socket套接字实现客服端和服务器实现TCP通信

    首先,我们要理解TCP通信的基本过程,它包括三次握手建立连接、数据传输以及四次挥手断开连接。在Java中,我们通过`java.net.Socket`类来创建客户端,通过`java.net.ServerSocket`类来创建服务器端。 1. **TCP...

    获得主机域名及其IP和Port端口

    例如,在Python中,我们可以使用`socket`库来获取本地主机名和IP,使用`socket.gethostbyname()`来解析域名,使用`socket.socket().connect()`建立连接并获取远程服务的端口。 了解如何获取主机域名、IP和Port,...

    Java CP/IP Socket编程

    除了IP地址外,还存在其他类型的地址,如MAC地址,它用于标识网络适配器的物理地址。 ##### 1.3 关于名字 为了方便用户记忆和使用,通常会采用域名系统(DNS)将人类可读的名字(如www.example.com)映射到IP地址...

    SocketTool.zip

    - 建立连接(TCP):对于TCP Socket,需要调用`connect()`函数连接到服务器的特定端口。 - 绑定与监听(服务器端):服务器端使用`bind()`函数绑定Socket到特定IP和端口,然后调用`listen()`开始监听连接请求。 -...

    ios socket

    1. 创建连接Socket:使用`CFStreamCreatePairWithSocketToHost`,指定服务器的IP地址和端口号。 2. 设置Socket属性:与服务器端类似,设置相应的Socket参数。 3. 连接服务器:调用`connect`函数发起连接请求。 4. ...

    基于Socket实现Telnet的交换机远程管理程序.pdf

    3. 远程管理:远程管理是指通过网络从远端服务器或设备获取管理权限,从而进行配置、监控、维护和故障排除等操作。网络设备如交换机通常支持远程管理功能,使得管理员无需亲自到现场即可对设备进行管理。 4. 交换机...

    Socket ssl 加密

    连接建立后,可以通过getInputStream和getOutputStream方法获取加密的输入/输出流,进行数据的加密传输。 6. **安全性考虑**: 虽然SSL/TLS提供了强大的安全保障,但还需要注意一些安全最佳实践,如定期更新密钥和...

    TMS320F2812的ip协议实现dsp的网络连接,实现以太网底层的协议

    通过TCP/IP协议,上位机可以与TMS320F2812建立连接,实现数据交换。这通常涉及socket编程,包括创建socket、绑定端口、监听连接请求、发送/接收数据等步骤。 总结,TMS320F2812的网络连接涉及多个层次,从硬件配置...

    Socket C++ 编程

    客户端同样需要创建套接字,并通过`connect()`函数与服务器建立连接。 **TCP State Diagram** TCP状态图展示了TCP连接建立和终止过程中各状态之间的转换关系。 **Connection Termination** TCP连接可以通过发送...

    UDP.rar_ udp dns_UDP mac_dns _udp dns_udp获取mac

    在“udp dns_udp获取mac”这部分,可能是在实现一个功能,通过UDP协议向DNS服务器发送查询请求,并解析返回的响应来获取域名对应的IP地址,同时可能会尝试获取发送请求的本地网络接口的MAC地址。 压缩包内的UDP.txt...

    tcp.rar_STM32 tcp_TCP/IP_stm32 tcp ip_tcp/ip上位机_tcp上位机

    通过DHCP,STM32可以从网络中的DHCP服务器自动获取IP地址,或者在没有DHCP服务的情况下,可以手动设置固定IP地址。 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,常用于需要稳定数据...

    TMS320F2812的ip协议实现dsp的网络连接,实现以太网底层的协议_rezip.zip

    通过TCP/IP协议,上位机可以与TMS320F2812建立连接,实现数据交换。这通常涉及socket编程,包括创建socket、绑定端口、监听连接请求、发送/接收数据等步骤。 总结,TMS320F2812的网络连接涉及多个层次,从硬件配置...

    TMS320F2812的ip协议实现dsp的网络连接,实现以太网底层的协议_rezip1.zip

    通过TCP/IP协议,上位机可以与TMS320F2812建立连接,实现数据交换。这通常涉及socket编程,包括创建socket、绑定端口、监听连接请求、发送/接收数据等步骤。 总结,TMS320F2812的网络连接涉及多个层次,从硬件配置...

    Net.rar_ARP java_arp欺骗_ip地址_net

    首先,程序可能会使用`InetAddress`类获取本地IP和广播IP,然后通过`Socket`类尝试与局域网内的所有IP地址建立连接,以此判断哪些地址是可达的。同时,程序可能监听网络流量,分析ARP请求和响应包,检查是否存在异常...

    第3章+ARP协议获得局域网内活动主机物理地code2

    ARP协议是基于无连接的通信协议,它在发送数据前不需要建立连接,而是直接通过广播方式寻找目标主机的MAC地址。当主机需要向其他主机发送数据时,如果只知道目标主机的IP地址,就需要通过ARP协议查询到对应的MAC地址...

    行业分类-设备装置-在至少两台计算设备间建立连接时的地址和端口号提取.zip

    当两台设备想要建立连接时,发送方会指定接收方的IP地址和端口号,这样数据就可以定向到正确的接收者。例如,在Web浏览器访问网站时,浏览器会向目标服务器的IP地址和HTTP默认端口80(对于HTTPS则是443)发送请求。...

    13-网络芯片CH395Q学习开发-模块使用Socket0作为MAC RAW - 杨奉武 - 博客园1

    通过CH395Q的网络连接检测功能,可以判断网络是否通畅,例如通过ping命令或者DHCP自动获取IP地址来检查网络连通性。 4. **TCP客户端与服务器通信**: 使用Socket0作为TCP客户端,可以与远程TCP服务器进行通信,...

    Java网络编程获取主机信息

    此外,通过`Socket`类,我们不仅可以与远程主机建立连接,还可以获取其套接字信息,如端口号等。 在实际应用中,为了实现用户友好的界面操作,可以使用Java的Swing或JavaFX库创建图形用户界面(GUI)。例如,可以...

    Python-SEUWLAN下的开机启动脚本包括Python3下的seuwlan的自动登陆和通过邮件发送本机IP地址

    在这个特定的项目中,开发者可能使用了Python的`socket`库来获取本机的IP地址,`smtplib`和`email`库来发送邮件,以及可能的`os`库来执行系统命令,比如连接到WLAN网络。 开机启动脚本的实现通常涉及将脚本添加到...

Global site tag (gtag.js) - Google Analytics