#include #include #include #include #include #include #include #include #include #include #include #define DHCP_send_port 67 #define DHCP_receive_port 68 #define DHCP_packet_lenght 245 #define BOOTREQUEST 1 #define BUFF_LEN 1024 struct addr { unsigned char b1; unsigned char b2; unsigned char b3; unsigned char b4; }; struct haddr { unsigned char b1; unsigned char b2; unsigned char b3; unsigned char b4; unsigned char b5; unsigned char b6; }; unsigned char *create_DHCPINFORM_message(struct addr ciaddr, struct haddr chaddr); int main(int argc, char *argv[]) { int dhcp_send_socket, dhcp_recv_socket; struct sockaddr_in server, my_addr; struct hostent *hostent; char cli_name[256]; int cli_namelen=256; unsigned char * DHCPINFORM_packet; struct addr caddr; struct haddr chaddr; char buff[BUFF_LEN]; socklen_t addrlen; // Nastaveni moji IP adresy caddr.b1 = 147; caddr.b2 = 229; caddr.b3 = 210; caddr.b4 = 37; // Nastaveni pozadovane harware address00:11:2f:63:ec:79 00:0B:6A:6A:08:ED chaddr.b1 = 0x00; chaddr.b2 = 0x0B; chaddr.b3 = 0x6A; chaddr.b4 = 0x6A; chaddr.b5 = 0x08; chaddr.b6 = 0xED; // Zpracovani paramtru prikazove radky if (argc != 3){ printf("Usage: %s ", argv[0]); exit(1); } char *DHCP_server = argv[2]; printf("server: %s\n", DHCP_server); // Vytvoreni socketu memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; if(gethostname(cli_name, cli_namelen)== -1) err(1, "gethostname(): %s", hstrerror(h_errno)); printf("%s\n", cli_name); if((hostent = gethostbyname(DHCP_server)) == NULL) // Nastaveni jmena serveru. err(1, "gethostbyname(): %s", hstrerror(h_errno)); memcpy(&server.sin_addr, hostent->h_addr, hostent->h_length); printf("%s\n", hostent->h_addr); server.sin_port = htons(DHCP_send_port); // Nastaveni cisla portu 67. //inet_aton(DHCP_server, server.sin_addr); printf("socket(...)\n"); if((dhcp_send_socket = socket(AF_INET, SOCK_DGRAM, 0)) == -1) err(1, "socket()"); /*if((hostent = gethostbyname("147.229.210.37")) == NULL) // Nastaveni adresy meho pocitace. err(1, "gethostbyname(): %s", hstrerror(h_errno)); memcpy(&my_addr.sin_addr, hostent->h_addr, hostent->h_length);*/ printf("Oteviram druhy socket\n"); if((dhcp_recv_socket = socket(AF_INET, SOCK_DGRAM, 0)) == -1) err(1, "socket()"); my_addr.sin_addr.s_addr = htonl(INADDR_ANY); my_addr.sin_family = AF_INET; // Nastavi rodinu protokolu na Internet my_addr.sin_port = htons(DHCP_receive_port); // Nastavi cislo portu 68. addrlen = (socklen_t) sizeof(my_addr); printf("Binduju...\n"); //Bind if (bind(dhcp_recv_socket, (struct sockaddr *)&my_addr, (socklen_t)addrlen) < 0 ){ printf("Chyba bind"); exit(0); } // Vytvoreni zpravy DHCPINFORM DHCPINFORM_packet = create_DHCPINFORM_message(caddr, chaddr); printf("Posilan packet\n"); //Posleme packet sendto(dhcp_send_socket, DHCPINFORM_packet, DHCP_packet_lenght, 0,(struct sockaddr *) &server, sizeof(server)); //server.sin_port = htons(DHCP_receive_port); // Nastaveni cisla portu 68. printf("Prijmam ...\n"); // Prijmame packet int n; if( (n= recvfrom(dhcp_recv_socket, buff, BUFF_LEN, 0, (struct sockaddr *)&my_addr, (socklen_t *)&addrlen)) == -1){ printf("Chyba cteni...\n"); exit(0); } for(int i= 0; i< n; i++){ if(i%32 == 0) printf("\n"); printf("%c ", buff[i]); } printf("Zaviram prvni socket\n"); close(dhcp_send_socket); printf("Zaviram druhy socket\n"); close(dhcp_recv_socket); free(DHCPINFORM_packet); return 0; } unsigned char *create_DHCPINFORM_message(struct addr ciaddr, struct haddr chaddr){ unsigned char *packet; // Alloc one dhcp_packet if( (packet = (unsigned char *) malloc(245*sizeof(unsigned char))) == NULL){ printf("No memory available"); exit(1); } // Fills in DHCP_packet /* OP: */ packet[0] = BOOTREQUEST; /* HTYPE (Ethernet): */ packet[1] = 1; /* HLEN: */ packet[2] = 6; /* HOPS: */ packet[3] = 0; /* XID: */ packet[4] = 0xa0; packet[5] = 0x28; packet[6] = 0x21; packet[7] = 0xaa; /* SECS: */ packet[8] = 0; packet[9] = 0; /* FLAGS: */ packet[10] = 0; packet[11] = 0; /* CIADDR: */ packet[12] = ciaddr.b1; packet[13] = ciaddr.b2; packet[14] = ciaddr.b3; packet[15] = ciaddr.b4; /* YIADDR: */ packet[16] = 0; packet[17] = 0; packet[18] = 0; packet[19] = 0; /* SIADDR: */ packet[20] = 0; packet[21] = 0; packet[22] = 0; packet[23] = 0; /* GIADDR: */ packet[24] = 0; packet[25] = 0; packet[26] = 0; packet[27] = 0; /* CHADDR: */packet[28] = chaddr.b1; packet[29] = chaddr.b2; packet[30] = chaddr.b3; packet[31] = chaddr.b4; packet[32] = chaddr.b5; packet[33] = chaddr.b6; packet[34] = 0; packet[35] = 0; packet[36] = 0; packet[37] = 0; packet[38] = 0; packet[39] = 0; packet[40] = 0; packet[41] = 0; packet[42] = 0; packet[43] = 0; /* SNAME: */ for(int i= 44; i < 108; i++) packet[i] = 0; /* FNAME: */ for(int i= 108; i < 236; i++) packet[i] = 0; /* OPTIONS:*/ /* Magic cookie: */ packet[236] = 0x63; packet[237] = 0x82; packet[238] = 0x53; packet[239] = 0x63; /* Option: */ packet[240] = 0x35; packet[241] = 0x01; packet[242]= 0x03; /* End option: */ packet[243] = 0xff; packet[244] = 0xff; // Returns created DHCP_packet return packet; }