-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathServerDHCP.java
More file actions
215 lines (161 loc) · 7.92 KB
/
Copy pathServerDHCP.java
File metadata and controls
215 lines (161 loc) · 7.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
package server;
import java.io.*;
import java.net.*;
import java.util.*;
import java.lang.StringBuilder;
class ServerDHCP{
public static void main(String args[]) throws Exception{
int sportno = Integer.parseInt("1000"); /*UDP server port number */
DatagramSocket serverSocket = new DatagramSocket(sportno);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
System.out.print("\n--UDP Server on port: " + sportno);
String lifetime = "3600";
while(true){
/* Waiting for client's message */
System.out.println("\n******** Waiting For Next Client ********\n");
// <--
// DHCP Discover Received from Client
// <--
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
System.out.println("--[DCHP Discover] Received from Client");
String clientMsg= new String(receivePacket.getData());
//Print DHCP Discover
List<String> Client_Msg = Arrays.asList(clientMsg.split(","));
System.out.println("\tyiaddr: " + Client_Msg.get(0));
System.out.println("\tT_ID: " + Client_Msg.get(1) + "\n");
// --
// Prepping DHCP Offer
// --
//transaction ID string turned to double
double trans_id = Double.parseDouble(Client_Msg.get(1));
//stores final message created below
String final_DHCP_Offer = "";
String currentIP = "";
//if correct client init is received, grab IP address to send back
if(Client_Msg.get(0).equals("0.0.0.0")){
System.out.println("--Popping IP from IP file");
//////*************************************************
//Using custom method "popOneIP", defined below main
////pop ip address from file and saves it to variable currentIP
//////*************************************************
currentIP = popOneIP("IPaddress.txt"); //passing filename
//build a string out of the three pieces of information
StringBuilder DHCP_Offer = new StringBuilder();
DHCP_Offer.append(currentIP + ","); //yiaddr
DHCP_Offer.append(Client_Msg.get(1) + ","); //transaction id
DHCP_Offer.append(lifetime); //lifetime
//convert string builder to string
final_DHCP_Offer = DHCP_Offer.toString();
//print final message
//System.out.println("\n--Final DHCP Offer:\n" + final_DHCP_Offer );
/* Getting the IP address and port number of client */
InetAddress IPAddress = receivePacket.getAddress(); /*UDP client IP address */
int cportno = receivePacket.getPort(); /*UDP client port number */
// -->
//Sending DHCP Offer
// -->
System.out.println("--[DHCP Offer] Sent with " + currentIP + "\n");
//String serverMsg = final_DHCP_Offer;
//sendData = serverMsg.getBytes();
sendData = final_DHCP_Offer.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, cportno);
serverSocket.send(sendPacket);
}
// <--
//Receiving DHCP Request
// <--
DatagramPacket receiveRequestPacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receiveRequestPacket);
System.out.println("--[DCHP Request] Received from Client");
String DHCPRequest= new String(receivePacket.getData());
//split string into array
List<String> DHCP_Request = Arrays.asList(DHCPRequest.split(","));
//transaction ID string turned to double
double trans_request_id = Double.parseDouble(DHCP_Request.get(1));
trans_request_id = trans_request_id + 1;
String new_trans_request_id = Double.toString(trans_request_id);
//print
System.out.println("\tyiaddr: " + DHCP_Request.get(0));
System.out.println("\tT_ID: " + new_trans_request_id);
System.out.println("\tLifetime: " + lifetime + "\n");
//Prepping DHCP ACK
String final_DHCP_ACK = "";
//if the received IP isn't the default
if(!DHCP_Request.get(0).equals("0.0.0.0")){
//build a string out of the three pieces of information
StringBuilder DHCP_ACK = new StringBuilder();
DHCP_ACK.append(DHCP_Request.get(0) + ","); //yiaddr
DHCP_ACK.append(new_trans_request_id + ","); //transaction id
DHCP_ACK.append(lifetime); //lifetime
//convert string builder to string
final_DHCP_ACK = DHCP_ACK.toString();
//print final version of ACK message
//System.out.print("--Final Server Message:\n" + final_DHCP_ACK);
/* Getting the IP address and port number of client */
InetAddress IPAddress = receivePacket.getAddress(); /*UDP client IP address */
int cportno = receivePacket.getPort(); /*UDP client port number */
// -->
//Sending DHCP ACK
// -->
System.out.print("--[DHCP ACK] Sent to Client\n");
sendData = final_DHCP_ACK.getBytes();
DatagramPacket sendACKPacket = new DatagramPacket(sendData, sendData.length, IPAddress, cportno);
serverSocket.send(sendACKPacket);
}
//loop back waiting for more clients
}
}
//Loading the ips from the text file,
//returning one IP and removing it from the file.
public static String popOneIP(String fileName){
// This will reference one line at a time
String line = null;
Vector<String> IPs = new Vector();
String IP = "";
try {
// Prepare BufferedReader.
FileReader fileReader = new FileReader(fileName);
BufferedReader bufferedReader = new BufferedReader(fileReader);
while((line = bufferedReader.readLine()) != null) {
//System.out.println(line);
IPs.add(line);
}
//after insertion, print
//System.out.println(IPs.toString());
//System.out.println("Count: " + IPs.size());
//save the last element to var to be returned
IP = IPs.lastElement().toString();
//remove last element just used
IPs.removeElement(IPs.lastElement());
//IPs.trimToSize(); //trim capacity
//print to check
//System.out.println(IPs.toString());
System.out.println("IP Count: " + IPs.size() + " -> " + (IPs.size()-1) + " left\n");
//overwrite file with updated list
File newIPs = new File(fileName);
FileWriter IPWriter = new FileWriter(newIPs, false);// false to overwrite.
//loop through vector to write all IPS
for(int i = 0; i < IPs.size(); i++){
IPWriter.write(IPs.get(i) + "\n");
}
IPWriter.close();
// close files.
bufferedReader.close();
}
catch(FileNotFoundException ex) {
System.out.println(
"Unable to open file '" +
fileName + "'");
}
catch(IOException ex) {
System.out.println(
"Error reading file '"
+ fileName + "'");
// Or we could just do this:
// ex.printStackTrace();
}
return IP;
}
}