1。通过已经连接的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), *