private const int PORT_TO_SEND_TO_RELAY = 0x43; // EDITED:: valore 67 (porta del server) /// <summary> /// Raw DHCP packet /// </summary> internal DhcpRequest(byte[] data, DatagramSocket socket, Dhcp server) { dhcpServer = server; BinaryReader rdr; MemoryStream stm = new MemoryStream(data, 0, data.Length); rdr = new BinaryReader(stm); // Reading data requestData.op = rdr.ReadByte(); requestData.htype = rdr.ReadByte(); requestData.hlen = rdr.ReadByte(); requestData.hops = rdr.ReadByte(); requestData.xid = rdr.ReadBytes(4); requestData.secs = rdr.ReadBytes(2); requestData.flags = rdr.ReadBytes(2); requestData.ciaddr = rdr.ReadBytes(4); requestData.yiaddr = rdr.ReadBytes(4); requestData.siaddr = rdr.ReadBytes(4); requestData.giaddr = rdr.ReadBytes(4); requestData.chaddr = rdr.ReadBytes(16); requestData.sname = rdr.ReadBytes(64); requestData.file = rdr.ReadBytes(128); requestData.mcookie = rdr.ReadBytes(4); requestData.options = rdr.ReadBytes(data.Length - OPTION_OFFSET); requestSocket = socket; }
private const ushort DELAY = 0x1388; // 5 s public void Run(IPAddress iPAddress, string dns, string subnetMask, string serverIdentifier, string routerIP) { UpdateStatus($"IP address:\t{iPAddress}"); UpdateStatus($"DNS:\t{dns}"); UpdateStatus($"SUBMASK:\t{subnetMask}"); UpdateStatus($"SERVER IDENTIFIER:\t{serverIdentifier}"); UpdateStatus($"ROUTER IP:\t{routerIP}"); var server = new Dhcp(iPAddress); UpdateStatus("SETTATO L'IP DEL SERVER"); server.ServerName = dns; UpdateStatus("SETTATO IL DNS DEL SERVER"); server.BroadcastAddress = IPAddress.Broadcast.ToString(); UpdateStatus("SETTATO IN BROADCAST IL SERVER"); server.OnDataReceived += (sender, dhcpRequest) => { UpdateStatus("GENERATO NUOVO EVENTO NEL SERVER"); try { var type = dhcpRequest.GetMsgType(); UpdateStatus($"TIPO DI RICHIESTA RICEVUTA DAL SERVER:\t{type}"); var ip = iPAddress; var replyOptions = new DhcpReplyOptions(); UpdateStatus("SETTAGGIO DELLA RISPOSTA DAL SERVER IN CORSO..."); replyOptions.SubnetMask = IPAddress.Parse(subnetMask); UpdateStatus($"SUBNETMASK:\t{replyOptions.SubnetMask}"); replyOptions.DomainName = server.ServerName; UpdateStatus($"DOMAIN NAME:\t{replyOptions.DomainName}"); replyOptions.ServerIdentifier = IPAddress.Parse(serverIdentifier); UpdateStatus($"SERVER IDENTIFIER:\t{replyOptions.ServerIdentifier}"); replyOptions.RouterIP = IPAddress.Parse(routerIP); UpdateStatus($"IP ROUTER:\t{replyOptions.RouterIP}"); replyOptions.DomainNameServers = new IPAddress[] { IPAddress.Parse("8.8.8.8"), IPAddress.Parse("8.8.4.4") }; UpdateStatus("CONFIGURAZIONE DEL DOMINIO DEL SERVER"); if (type == DhcpMsgType.DHCPDISCOVER) { UpdateStatus($"RISPOSTA\t->\tTIPO MESSAGGIO:{DhcpMsgType.DHCPOFFER}"); UpdateStatus($"RISPOSTA\t->\tIP:{ip}"); dhcpRequest.SendDHCPReply(DhcpMsgType.DHCPOFFER, ip, replyOptions); } if (type == DhcpMsgType.DHCPREQUEST) { UpdateStatus($"RISPOSTA\t->\tTIPO MESSAGGIO:{DhcpMsgType.DHCPACK}"); UpdateStatus($"RISPOSTA\t->\tIP:{ip}"); dhcpRequest.SendDHCPReply(DhcpMsgType.DHCPACK, ip, replyOptions); } } catch (Exception e) { UpdateStatus($"EXCEPTION IN SERVER:\t{e.Message}"); } }; UpdateStatus("ESECUZIONE DEL SERVER DHCP IN CORSO..."); server.Start(); }