All pastes #260646 Raw Edit

Someone

public text v1 · immutable
#260646 ·published 2006-11-28 15:53 UTC
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;
}