2011-11-11 3 views
0

Я работаю над программным обеспечением ethernet в c. У меня есть два файла клиента и сервера, которые работают на localhost. Я использую свой собственный номер протокола для связи в socket().Raw Ethernet PF_PACKET проблема на localhost

На стороне клиента я follwing код

s = socket(PF_PACKET, SOCK_RAW, 61187); 
    unsigned char dest_mac[6]= {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 
    struct sockaddr_ll socket_address; 

     socket_address.sll_family = PF_PACKET; 
     socket_address.sll_protocol = 61187; 
     socket_address.sll_ifindex = ifindex; 
     socket_address.sll_hatype = ARPHRD_ETHER; 
     socket_address.sll_pkttype = PACKET_BROADCAST; 
     socket_address.sll_halen = ETH_ALEN; 
     socket_address.sll_addr[0] = dest_mac[0]; 
     socket_address.sll_addr[1] = dest_mac[1]; 
     socket_address.sll_addr[2] = dest_mac[2]; 
     socket_address.sll_addr[3] = dest_mac[3]; 
     socket_address.sll_addr[4] = dest_mac[4]; 
     socket_address.sll_addr[5] = dest_mac[5]; 
     socket_address.sll_addr[6] = 0x00; 
     socket_address.sll_addr[7] = 0x00; 

, а затем я отправить некоторые данные следующим

sent = sendto(s, buffer, ETH_HEADER_LEN, 0, (struct sockaddr*)&socket_address, sizeof(socket_address)); 

На стороне сервера я сделать создание сокета, как в клиенте и я делаю recvfrom следующим образом

length = recvfrom(s, buffer, BUF_SIZE, 0, NULL, NULL); 

Но я не получаю пакет на стороне сервера. Может ли кто-нибудь сообщить мне, в чем проблема?

ответ

0

Трудно сказать из вашего неполного примера, но я подозреваю, что вы используете SOCK_RAW, где вы хотите использовать SOCK_DGRAM. В вашем SOCK_RAW предполагается, что заголовок Ethernet является частью указанного вами buffer, т. Е. Ваш адрес назначения не имеет отношения к содержимому пакета. С SOCK_DGRAM содержимое buffer формирует полезную нагрузку созданного кадра Ethernet, а заголовок поступает из вашего поля адреса.

Этот процесс довольно легко отлаживается, когда вы даете tcpdump -neX (или что-то подобное с Wireshark или tshark) во время тестирования - вы точно увидите, какой пакет вы генерируете.