2014-02-26 5 views
-1

내 친구에게 데이터를 보내려고합니다. 나는 그의 IP 주소를 모른다. 하지만 나는 그의 MAC 주소를 안다. 그래서 이더넷 프레임을 사용하여 데이터를 보내야합니다.이더넷 프레임을 전송하는 방법은 무엇입니까?

프로그램을 작성했지만 작동하지 않습니다. 문제가 어디 있는지 이해하지 못했습니까? 나는 어디에서 실수를 했는가?

클라이언트 측 프레임 전송 :

main() 
{ 
    int size ; 
    char req[10]; 
    printf("enter to send\n"); 
    gets(req); 
    int fd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP)); 
    if (fd==-1) 
    { 
    perror("socket"); 
    } 

    struct ifreq ifr; 
    char if_name[5]="eth0"; 
    int if_name_len=strlen(if_name); 
    if (if_name_len<sizeof(ifr.ifr_name)) 
    { 
    memcpy(ifr.ifr_name,if_name,if_name_len); 
    ifr.ifr_name[if_name_len]=0; 
    } 
    else 
    { 
    printf("interface name is too long"); 
    } 

    if (ioctl(fd,SIOCGIFINDEX,&ifr)==-1) 
    { 
    perror("ioctl"); 
    } 
    int ifindex=ifr.ifr_ifindex; 
    printf("ethernet interface id:%x\n",ifindex); 

    const unsigned char ether_broadcast_addr[]={0x00,0x1d,0x09,0x7a,0xDf,0x5e}; 

    struct sockaddr_ll addr={0}; 

    addr.sll_family=PF_PACKET; 
    addr.sll_ifindex=ifindex; 
    addr.sll_halen=ETHER_ADDR_LEN; 
    //addr.sll_protocol=htons(ETH_P_IP); 
    memcpy(&addr.sll_addr,ether_broadcast_addr,ETHER_ADDR_LEN); 
    addr.sll_hatype=772; 
    addr.sll_pkttype=PACKET_OUTGOING; 

    printf("size=%d\n",size); 
    if (size=sendto(fd,req,sizeof(req),0,(struct sockaddr*)&addr,sizeof(addr))==-1) 
    { 
    perror("sendto"); 
    } 
    printf("send size=%d\n",size); 

} 

프레임

는 서버 측에서 코드가 나타납니다 프로그램이 네트워크에 데이터 프레임을 전송에서 작동 할 수있는 동안

main() 
{ 

    int size; 
    char req[20]; 
    int fd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL)); 
    if (fd==-1) 
    { 
    perror("socket"); 
    } 

    struct ifreq ifr; 
    char if_name[5]="eth0"; 
    int if_name_len=strlen(if_name); 
    if (if_name_len<sizeof(ifr.ifr_name)) 
    { 
    memcpy(ifr.ifr_name,if_name,if_name_len); 
    ifr.ifr_name[if_name_len]=0; 
    } 
    else 
    { 
    printf("interface name is too long"); 
    } 

    if (ioctl(fd,SIOCGIFINDEX,&ifr)==-1) 
    { 
    perror("ioctl"); 
    } 
    int ifindex=ifr.ifr_ifindex; 
    printf("ethernet interface id:%x\n",ifindex); 

    const unsigned char ether_broadcast_addr[]={0x00,0x1d,0x09,0x7a,0xDf,0x5e}; 

    struct sockaddr_ll addr={0}; 

    addr.sll_family=PF_PACKET; 
    addr.sll_ifindex=ifindex; 
    addr.sll_halen=ETHER_ADDR_LEN; 
    addr.sll_protocol=htons(ETH_P_ALL); 
    memcpy(&addr.sll_addr,ether_broadcast_addr,ETHER_ADDR_LEN); 

    addr.sll_pkttype=PACKET_OUTGOING; 
    addr.sll_hatype=772; 

    bind (fd, (struct sockaddr*)&addr, sizeof(addr)); 

    printf("size=%d\n",size); 
    socklen_t a=sizeof(addr); 
    size=recvfrom(fd,req,sizeof(req),0,(struct sockaddr*)&addr,&a); 
    if(size==-1) 
    { 
    perror("recvfrom"); 
    } 
    printf("size=%d\n",size); 
    printf("recv msg=%s\n",req); 
} 
+4

'작동하지 않음'이 도움이되지 않습니다. 그 일은 일어나지 않아야합니까? 그런 일이 일어나지 않을까요? 직접 디버깅하는 동안 무엇을 발견 했습니까? Wireshark와 같은 네트워크 분석기로 라인을 점검하면 어떻게됩니까? –

+0

IP 주소를 알아내는 것이 더 빠릅니까? –

답변

0

거기에서 어디받지 않습니다 .MAC 주소는 비 계층 적입니다. 즉, 주소 공간이 일정하다는 것을 의미합니다. MAC 주소를 알면 그 주소에 도달하는 방법에 관해 알려주지 않습니다.

누군가의 MAC 주소를 갖는 것은 누군가의 이름을 갖는 것과 같습니다. 당신은 그들의 이름을 알고 있을지 모르지만 그들의 전화 번호로 그들을 부를 수는 없습니다. 이제 자신의 이름이 있으면 전화 번호를 찾을 수 있습니다. 네트워킹도 비슷합니다.

컴퓨터에서 네트워크 데이터 (패킷)가 ISP에 연결되는 DSL 또는 케이블 모뎀 인 기본 게이트웨이로 전송됩니다. 패킷을 수신하면 IP 주소를보고 보낼 곳을 결정합니다. 프레임 (IP 주소가없는 데이터는 프레임이라고 함)에는 IP 주소가 없으므로 게이트웨이는 IP 주소를 삭제합니다. 목적지 또는 소스 IP 주소가 없으므로 게이트웨이에 실제로 도달하지 않으므로보다 정확하게 말하십시오. 그것은 네트워크에서 전송되며 아무 것도 그것을 수행하지 않습니다.

관련 문제