这是一段通过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;

解决方案 »

  1.   

    getpeername第一个参数要求传入SOCKET 类型的变量。您用socket函数把 TCustomSocket* Socket中相应的内容传进去然后得到这个SOCKET的值传进去就好了。
    我建议您把这个函数第一个参数改成SOCKET
    因为MS定义的SOCKET如下:typedef UINT_PTR        SOCKET;
      

  2.   

    VC获取网卡MAC 源码 
    http://www.cnblogs.com/aoyihuashao/archive/2009/12/14/1623683.html
    我以前用过的。
      

  3.   

    我是想通过通信已经连接上后,在服务器端获取客户端的Mac地址。
      

  4.   

    额,这个是不是发错了,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); 
      

  5.   

    windows上用SendARP,但只能获取直接通信的物理地址.