Comment envoyer des données sur un raw connecteur ethernet à l'aide de sendto sans l'aide de sockaddr_ll?

Je suis en train de travailler sur un projet dans lequel nous utilisons Enea OSE qui est un temps réel système d'exploitation embarqué. Je suppose que beaucoup d'entre vous ne sont pas familiers avec cet OS, mais je pense que vous pourriez répondre à ma question de toute façon. Je veux envoyer un raw de trame ethernet entre les 2 cartes en utilisant l'interface "eth1", qui sont directement connectés à oneanother par un câble ethernet (pas d'interrupteur ou de quoi que ce soit). Le "eth1" interface n'est pas attribué une adresse ip.

Je peux simplement déclarer un socket à l'aide de

int s = socket(AF_INET, RAW_SOCKET, ...)

J'ai peut alors se lier à la prise de l'appareil à l'aide de l'interface:

setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, "eth1", 4);

Ce que mon plan était de le faire, afin d'envoyer des données à partir d'une carte à l'autre, était de manuellement remplir un ethernet tableau tampon avec la source et la destination des adresses MAC. Puis envoyer les données à l'aide de sendto(....)

Cependant la sendto routine nécessite également un sockaddr struct avec de l'information:

  sendto(int sockfd, const void *buf, size_t len, int flags,
           const struct sockaddr *dest_addr, socklen_t addrlen);

Dans les exemples que j'ai trouvé sur internet utilise sockaddr_in lorsque l'adresse ip est connue et sockaddr_ll pour les images brutes. Cependant OSE ne pas fournir le sockaddr_ll struct. Toutefois, il fournit le sockaddr que je ne sais pas si je peux l'utiliser pour les matières premières trames ethernet?

struct sockaddr {
    unsigned short    sa_family;    //address family, AF_xxx
    char              sa_data[14];  //14 bytes of protocol address
};

J'ai aussi essayé d'utiliser la valeur NULL, pour la structure sockaddr champ lors de l'appel de sendto(), l'envoyer échoue. Ce qui m'amène à mes questions(s). Puis-je utiliser le simple struct sockaddr de remplir le MAC de destination-adresse sans l'aide de toute la propriété intellectuelle? Comment regarder? (Je n'ai pas seeen code montrant ce). Pourquoi avons-nous même de fournir un sockaddr struct? Ne pas l'ethernet de la mémoire de données contiennent déjà cette information? Enfin, est-ce que je suis en train d'accomplir encore possible sans l'assignation d'adresses ip pour les périphériques réseau?

Je suis conscient de ce que je suis en train de faire semble étrange, mais il y a une raison pour ça 🙂 je serais vraiment heureux si vous me montrer comment faire cela sans avoir à utiliser le sockaddr_ll struct.

InformationsquelleAutor Euklides | 2014-01-28