rendered paste body
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#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 <zatim neco> <adresa serveru>", 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;
}