내 서버에 대한 모든 요청 인 클라이언트 MAC 주소를 캡처하고 싶습니다. 다음 프로그램을 사용하여 클라이언트의 MAC 주소를 얻지 만 "ioctl : Protocol Family Not Supported"를 표시합니다. 얻으려면 어떻게 MAC 주소? .. 당신은 로컬 서브넷의 MAC 주소를 얻을 수 ioctl(SIOCGARP)
와ioctl 함수를 사용하여 클라이언트의 MAC 주소를 얻는 방법은 무엇입니까?
#include<stdio.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netdb.h>
#include<errno.h>
#include<string.h>
#include<netinet/if_ether.h>
#include<net/if.h>
#include<linux/sockios.h>
int main()
{
int socket1, socket2;
socket1 = 0;
socket2 = 0;
struct sockaddr_in server, client;
int returnstatus = 0;
socket1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(socket1 == -1)
{
perror("socket()");
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8888);
returnstatus = bind(socket1, (struct sockaddr*)&server, sizeof(server));
if(returnstatus == -1)
{
perror("bind()");
}
returnstatus = listen(socket1, 5);
if(returnstatus == -1)
{
perror("listen()");
}
for(;;)
{
int buffr[4];
int addrlen, n;
addrlen = sizeof(client);
socket2 = accept(socket1, (struct sockaddr *)&client, &addrlen);
printf("%s\n",inet_ntoa(client.sin_addr));
printf("%d\n",(int) ntohs(client.sin_port));
struct arpreq arpreq_;
bzero(&arpreq_, sizeof(struct arpreq));
if((n = ioctl(socket2, SIOCGARP, &arpreq_)) < 0){
perror("ioctl");
}
unsigned char *ptr = &arpreq_.arp_ha.sa_data[0];
printf("MAC: %x:%x:%x:%x:%x:%x\n", *ptr, *(ptr+1), *(ptr+2), *(ptr+3),
*(ptr+4), *(ptr+5));
if (socket2 == -1)
{
perror("accept()");
}
returnstatus = read(socket2, buffr, sizeof(buffr));
if(returnstatus == -1)
{
perror("read()");
}
int c[2];
int *w;
c[0] = buffr[0] + buffr[1];
w = c;
returnstatus = write(socket2, w, sizeof(c));
if(returnstatus == -1)
{
perror("write()");
}
close(socket2);
}
close(socket1);
return 0;
}
int addition(int x, int y)
{
int z;
z = x + y;
return(z);
}
클라이언트가 다른 네트워크 또는 다른 서브넷에 있으면 어떻게됩니까? 그러면 닫는 라우터의 MAC 주소 만 가져올 수 있습니까? –
다른 네트워크에있는 클라이언트 MAC을 얻고 싶습니다. 아니면 어디서나 ... 어떻게 얻을 수 있습니까? ... – user1216216
정말, 할 수 없습니다. 유일한 확실한 방법은 사용 된 프로토콜이 서버의 쿼리를 포함하여 클라이언트에게 자체 MAC 주소를 제공하도록 요청하는 것입니다. –