// コンストラクタ(構築) public DhcpOption53(DhcpPacket.MessageType message_type) : this() { this._Code = 53; this.message_type_ = message_type; this._bytes = new byte[1] { (byte)message_type }; }
// コンストラクタ // 受信パケットの Parameter Request List ベース public DhcpOptions(DhcpPacket.MessageType message_type, PhysicalAddress chaddr, DhcpOption55 dhcpoption55, DhcpLeases dhcplease) : this() { if (message_type == DhcpPacket.MessageType.DHCPOFFER) { BuildDHCPOFFER(chaddr, dhcpoption55, dhcplease); } if (message_type == DhcpPacket.MessageType.DHCPACK) { BuildDHCPACK(chaddr, dhcpoption55, dhcplease); } }
// コンストラクタ // その他のパケットをベースに作成 public DhcpPacket(DhcpPacket basePacket, DhcpPacket.MessageType message_type, DhcpLeases dhcplease) : this() { if (message_type == MessageType.DHCPOFFER) { BuildDHCPOFFER(basePacket, dhcplease); } if (message_type == MessageType.DHCPACK) { BuildDHCPACK(basePacket, dhcplease); } }
// 解析 public override void Analyze() { this.message_type_ = (DhcpPacket.MessageType)(this._bytes[0]); if ( (DhcpPacket.MessageType.DHCPDISCOVER <= this.message_type_) && (this.message_type_ <= DhcpPacket.MessageType.DHCPINFORM) ) { // OK } else { this.message_type_ = DhcpPacket.MessageType.unknown; } }
// UDP送信 private void SendUDP(IPAddress sourceIPAddress, int sourcePort, IPAddress remoteIPAddress, int remotePort) { // 送信元 var localEP = new IPEndPoint(sourceIPAddress, sourcePort); // 送信先 var remoteEP = new IPEndPoint(remoteIPAddress, remotePort); // 送信データ DhcpPacket rcv_packet = new DhcpPacket(this.lastRcvBytes_); DhcpPacket.MessageType snd_message_type = (rcv_packet.message_type_ == DhcpPacket.MessageType.DHCPDISCOVER)? DhcpPacket.MessageType.DHCPOFFER: (rcv_packet.message_type_ == DhcpPacket.MessageType.DHCPREQUEST)? DhcpPacket.MessageType.DHCPACK: DhcpPacket.MessageType.unknown; if (snd_message_type == DhcpPacket.MessageType.unknown) { return; } DhcpPacket snd_packet = new DhcpPacket(rcv_packet, snd_message_type, this.dhcplease_); byte[] msg = snd_packet.GetPacketBytes(); //データを文字列に変換する string rcvMsg = "0x" + snd_packet.xid_.ToString("X4") + ", " + snd_packet.message_type_; //送信したデータの情報をRichTextBoxに表示する string displayMsg = string.Format("{0} [{1} ({2})] > {3}", DateTime.Now.ToString("HH:mm:ss.fff"), remoteEP.Address, remoteEP.Port, rcvMsg); textBoxRcvData.BeginInvoke( new Action <string>(ShowReceivedString), displayMsg); // 送信イベントデータ var ev = new SocketAsyncEventArgs(); ev.RemoteEndPoint = remoteEP; ev.SetBuffer(msg, 0, msg.Length); // UDP送信 var socket = new Socket(SocketType.Dgram, ProtocolType.Udp); socket.Bind(localEP); // bindしたIP、ポートと異なる送信元としたい(場合がある)のでudpClient_は使用しない socket.SendToAsync(ev); // 非同期で送信 socket.Shutdown(SocketShutdown.Both); socket.Close(); }