ethernet(arp) 패킷 전송 관련 질문입니다!
글쓴이: espoirnoa09 / 작성시간: 수, 2017/03/22 - 10:49오후
안녕하세요!
개발 환경은 칼리 리눅스이며, 제가 이더넷(arp) 패킷을 전송하고싶습니다.
제가 구현한 방법으로는
제가 보낼 packet에 해당하는 배열(u_int8_t packet[])을 그대로 전송 하고싶습니다.
이 패킷안에는 dest mac src mac 등 모든 패킷의 구성에 맞게 데이터가 저장되어 있는상태인데
이 패킷을 네트워크로 흘려보내기만 하면 되는데 어떻게 해야할 지 몰라 질문드립니다!
제가 생각한 방법으로는 send()함수를 이용하여 네트워크 패킷을 흘려 보내는 방법인데,
send함수를 쓰기위해선 socket()함수를 이용하여 디스크립터를 할당 받아야 합니다.
그곳의 인자중 domain에 해당하는 부분에 이더넷 패킷(arp)을 지칭하는 address family가 없는 것 같아 질문 드립니다!
위의 내용 중 제가 잘못생각한 것이 있다면 어떤 것인지, domain에 arp를 지칭하는 이름이 무엇인지가 궁금합니다!
Forums:
설명은 http://www.microhowto
설명은 http://www.microhowto.info/howto/send_an_arbitrary_ethernet_frame_using_an_af_packet_socket_in_c.html#idp51328
예제는 https://github.com/iputils/iputils/blob/cleanup/arping.c
답변감사드립니다.
sendto를 사용하려고 했으나 invalid argument 가 나오는데 어떻게 해야할까요??
int packetLen = sizeof(struct ether_header)+sizeof(ether_arp);
소켓은 int sock=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ARP));
struct sockaddr_ll dest;
memset(&dest,0,sizeof(dest));
dest.sll_family=htons(PF_PACKET);
dest.sll_protocol=htons(ETH_P_ARP);
dest.sll_halen=packetLen;
dest.sll_ifindex=htonl(if_nametoindex(device));
memcpy(dest.sll_addr,sender_Mac,6);
f(sendto(sock,arpReply,packetLen,0,(struct sockaddr*)&dest,sizeof(sockaddr))==-1)
cout<
이때 argument 오류가 납니다. arpReply는 실제 보낼 패킷의 내용이 들어가있고 구성은 ether_header + arp 로 되어있습니다.
arpReply는 packetlen길이의 u_int8_t입니다.
실제 각 구조체에서 arpReply배열로의 값 저장은
memcpy(arpReply,&ep,sizeof(struct ether_header));
memcpy(&arpReply[sizeof(struct ether_header)],&arp,sizeof(struct ether_arp));
이와같이 메모리 복사를 이용하였고 값에대한 출력결과는 실제 제가 보내야하는 패킷의 구성과 일치하였습니다.
이때 어떤 오류때문에 sendto의 명령어가 실패하는지 잘 모르겠습니다.
추가합니다.
개발환경은 칼리리눅스이며, 64비트 운영체제 입니다.
보내고자 하는 패킷은 ARP reply에 대한 패킷입니다.
댓글 달기