On Tue, 23 Oct 2007 13:15:11 +0200, Steve Graegert wrote: > On 10/23/07, Mateus Interciso <p.zarnick@xxxxxxxxx> wrote: >> Hello, I'm currently on university, and for my graduation paper, I'll >> be implementing a routing algorythm, by hand, in C. The routing >> algorythm itself is not easy, but one of the starting parts of it, is >> to find a way of discovering the MAC that it is currently connected to, >> maybe is bether if I draw, since I'm not really that good in english: >> >> [PC with n NICs]-----(n cables)---->[n PCs] >> >> I have full control of the first PC, of course, since is the one I'm >> implementing the router, so I do know the MAC of it, but how to >> discover the MAC on the other end of the n lines, so I can start >> sending packets? > > Probably this is a starting point: (not tested) > > ___ BEGIN SOURCE ___ > > #include <iostream> > #include <stdio.h> > #include <netdb.h> > #include <netinet/if_ether.h> > > int read_mac(void) { > int sock, sockfd, n, cnt; > char buffer[2048]; > unsigned char *iphead, *ethhead; > struct ether_addr ether; > > if ((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) < 0) { > perror("socket"); > exit(1); > } > > while (1) { > if ((n = recvfrom(sock, buffer, 2048, 0, NULL, NULL)) == -1) { > perror("recvfrom"); > close(sock); > exit(1); > } > > ethhead = (unsigned char *)buffer; > > if (ethhead != NULL) { > iphead = (unsigned char *)(buffer + 14); // Skip Ethernet header > printf("Peer MAC: " > "%02x:%02x:%02x:%02x:%02x:%02x\n", > ethhead[0], ethhead[1], ethhead[2], > ethhead[3], ethhead[4], ethhead[5]); > printf("Source MAC: " > "%02x:%02x:%02x:%02x:%02x:%02x\n", > ethhead[6], ethhead[7], ethhead[8], > ethhead[9], ethhead[10], ethhead[11]); > > if (*iphead == 0x45) { // Check for IPv4, no options present > printf("Peer IP: %d.%d.%d.%d\n", > iphead[12], iphead[13], > iphead[14], iphead[15]); > printf("Source IP: %d.%d.%d.%d\n", > iphead[16], iphead[17], > iphead[18], iphead[19]); > printf("Protocol (UDP = 11): %02x Hex\n", iphead[9]); > } > } > } > > return 0; > } > > > int main(int argc, char **argv) { > read_mac(); > return EXIT_SUCCESS; > } > > ___ END SOURCE ___ > > Honestly, you should make yourself acquainted with low-level network > programming. Otherwise you'll be asking a lot of theses questions in > the future. Anyway, hope this helps. > > \Steve > > -- > > Steve Grägert > DigitalEther.de > - > To unsubscribe from this list: send the line "unsubscribe > linux-c-programming" in the body of a message to > majordomo@xxxxxxxxxxxxxxx More majordomo info at > http://vger.kernel.org/majordomo-info.html Thank you, this will help. Do you have any book/site where I can take a deep look into how to do that stuff? MAteus - To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html