devo convertire un nodo ip con protocollo arp in un rarp; in particolare devo rilevare il mio indirizzo ip effettuando la rispettiva richiesta al server.
il problema riscontrato è il seguente :
a volte non mi spedisce il pacchetto, a volte lo riceve con parametri errati. vi posto il programma da me svolto ( ho semplicemente modificato il nodo ip arp) :
i nomi corrispondono ancora al protocollo arp ma ho cambiato le caratteristiche per il protocollo rarpcodice:struct arp_packet{ unsigned short htype; unsigned short ptype; unsigned char hlen; unsigned char plen; unsigned short op; unsigned char mac_sorg[6]; unsigned char ip_sorg[4]; unsigned char mac_dest[6]; unsigned char ip_dest[4]; }; void crea_arp_req(unsigned char * buffer, unsigned char * mac_sorg) { int i; struct arp_packet * arp; arp = (struct arp_packet *) buffer; arp->htype= htons(1); arp->ptype= htons(0x8035); arp->hlen = 6; arp->plen = 4; arp->op = htons(3); copiabytes(arp->mac_sorg,mac_sorg,6); copiabytes(arp->ip_sorg,ip_sorg,4); for(i=0;i<6;i++) { arp->ip_sorg[i]=0; arp->ip_dest[i]=0; } copiabytes(arp->mac_dest, mac_sorg,6); } int sonouguali(char *b1, char *b2, int len){ int i; for(i=0;i<len;i++) if(b1[i]!=b2[i]) return 0; return 1; } void trova_mac(unsigned char * mac_sorg, unsigned char *incognita_ip) { char buffer[1600]; int tmp; struct ether_frame * e; struct arp_packet *a; unsigned char * eth; crea_arp_req(buffer+500,mac_sorg); eth=crea_eth(buffer+500,broadcast_mac,0x0806); stampa_bytes(eth,sizeof(struct ether_frame)+sizeof(struct arp_packet)); tmp = invia_frame(eth,sizeof(struct ether_frame)+sizeof(struct arp_packet)); if(tmp!=0){ printf("Programma Abortito\n"); exit(1); } e = (struct ether_frame *) buffer ; a = (struct arp_packet *) (buffer + sizeof(struct ether_frame)); while(1){ tmp=ricevi_frame(buffer,1600); if(tmp==-1){ printf("Programma Abortito\n"); exit(1); } if (e->type == htons(0x0800)){ if (a->op == htons(4)){ if(sonouguali(a->mac_dest,mac_sorg,6)){ printf("Ricevuto:\n"); stampa_bytes(buffer,tmp); copiabytes(incognita_ip,a->ip_dest,4); return ; } } } } }

Rispondi quotando