通过建立好连接的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; 
}

时间: 2024-08-08 05:40:58

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

python获取本机mac地址和ip地址的方法

  这篇文章主要介绍了python获取本机mac地址和ip地址的方法,涉及Python获取系统相关信息的技巧,需要的朋友可以参考下 本文实例讲述了python获取本机mac地址和ip地址的方法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 import sys, socket def getipaddrs(hostname): result = socket.getaddrinfo(hostname,None,0,socket.SOCK_STREAM) retu

获取指定IP的终端的MAC地址

    因为业务需要,需要给公司部分终端进行登记,以保证授权终端能够登录业务系统,最好的方法就是记录下每台终端的MAC地址来进行验证是否有授权.     下面是采用调用API的方式获取指定IP的终端的MAC地址:   [DllImport("Iphlpapi.dll")]  public static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);  //dest为目标机器的IP;

Windows Mobile中如何建立GPRS连接以便Socket能正常通信

最近编写一个医疗项目的程序,需要用 Windows Mobile 来做通信处理,需要将手机端的数据通过GPRS传送至公网上的一个服务器上.数据传输我采用的是socket,用数据线+ActiveSync调试通过,数据传输正常,在准备将软件提交给质检部门的时候,用真正的GPRS来做通信测试时,问题出来了,连接始终建立不了,但用手机的IE浏览器却能正常打开网页,而且奇怪的是只要用IE浏览器成功访问过一次网页,我的 socket 就能正常进行数据通信,看来传说中的GPRS常连接被我误解了. 手机开通GP

通过IP或socket获取对方的MAC地址

1.通过已经连接的socket文件获取:   [cpp] view plaincopy   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,

获取客户端网卡MAC地址和IP地址实现JS代码_javascript技巧

在做B/S结构的系统时,我们常常需要获取客户端的一些信息,如IP和MAC,以结合身份验证.要获取服务器端的MAC很容易,但是要获取客户端的MAC的地址确要花费一翻心思,通常的做法是调用Win32API或直接调用nbtstat命令,这样做有很多问题,而另一种方法就是直接用客户端脚本,我们这里用Javascript,这样做的好处是不需要服务器端进行处理,有客户端自行获取,传递到服务器端,且速度和可靠性都比在服务器端获取好. 具体实现的html和javascript如下: 复制代码 代码如下: <HT

erlang-Erlang 建立TCP连接后,怎么样从返回的Socket获取客户端ip和端口?

问题描述 Erlang 建立TCP连接后,怎么样从返回的Socket获取客户端ip和端口? 代码如下,服务端在2345端口监听,accept到客户端连接后,返回{ok, Socket}. start() -> {ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4}, {reuseaddr, true}, {active, true}]), {ok, Socket} = gen_tcp:accept(Listen). 问题是在成功accep

pc与安卓互通-建立安卓手机与PC电脑的Socket链接,如何获取PC端本地IP

问题描述 建立安卓手机与PC电脑的Socket链接,如何获取PC端本地IP 本人写了一个安卓手机和PC电脑的Socket链接,PC端为服务器端,安卓机端为客户端,通过wifi精灵开了wifi实现了数据互通,想要获取PC端本地的IPv4的IP,但是网上查的仅仅能获得wifi精灵上的虚拟IP,无法获取PC机本地的真正IP,求大神神解决. 解决方案 获取方法: PC端必须是静态IP. 进入无线网络里设置IP地址为本地的IP地址. 安卓2.3:手机连接上wifi后,点击菜单键-高级-静态IP地址. 安卓

socket链接pc安卓-建立安卓手机与PC电脑的Socket链接,如何获取PC端本地IP

问题描述 建立安卓手机与PC电脑的Socket链接,如何获取PC端本地IP 本人写了一个安卓手机和PC电脑的Socket链接,PC端为服务器端,安卓机端为客户端,通过wifi精灵开了wifi实现了数据互通,想要获取PC端本地的IPv4的IP,但是网上查的仅仅能获得wifi精灵上的虚拟IP,无法获取PC机本地的真正IP,求大神神解决.

C# Socket编程如何获取连接的远程客户端的IP地址和端口

问题描述 最近做C#Socket编程时遇到了一个非常奇怪的问题,我在A市,用了一个第三方做端口映射的软件成功实现了跨局域网进行TCP通信的问题,也就是我的办公室的电脑作为服务器,我的内网IP为172.23.21.168,端口号为51888,并用第三方软件做了端口映射,将端口映射为31669,将客户端程序发给我一个在另一个城市B市的朋友(他也处在办公室的网络中)帮我测试,他用客户端程序已经成功连接到了我的服务器,并可以成功跟我进行通信(打字聊天信息双方都能接收和发送).现在问题来了,我用C#里的s