Question: Convert to C: import java.io.*; import java.net.*; import java.sql.Timestamp; import java.util.*; public class UdpServer { private final static int PACKET_SIZE = 1024; private final static

Convert to C:

import java.io.*; import java.net.*; import java.sql.Timestamp; import java.util.*; public class UdpServer { private final static int PACKET_SIZE = 1024; private final static int GROUP_PORT = 5555;// reserved for broadcasting private final static String GROUP_IP = "239.255.255.255"; private int serverPort; // server port number private DatagramSocket serverSocket; private ArrayList clients; // table of clients private HashMap> offlineMsgs; public UdpServer(int p) { serverPort = p; try { serverSocket = new DatagramSocket(serverPort); // Create the client-table // Ip address, port number, nickname, and online status // Initially empty clients = new ArrayList(); offlineMsgs = new HashMap>(); InetAddress ip = InetAddress.getLocalHost(); System.out.println("[Server is ready...]"); System.out.println("[Server ip: " + ip.getHostAddress().toString() + "]"); } catch (IOException e) { e.printStackTrace(); } } public void run() throws IOException { // Communication loop byte[] buffer = new byte[PACKET_SIZE]; DatagramPacket incoming = new DatagramPacket(buffer, buffer.length); String register = "Registration Request."; String deregister = "Logout."; String save = "Save Message."; String delims = "[.]+"; for (;;) { serverSocket.receive(incoming); byte[] data = incoming.getData(); String msg = new String(data, 0, incoming.getLength()); // Receiving registration request if (msg.contains(register)) { String[] tokens = msg.split(delims); String nickname = tokens[1]; int port = incoming.getPort(); InetAddress ip = incoming.getAddress(); boolean isUnique = true; int k = 0; int index = -1; while (isUnique && k < clients.size()) { if (clients.get(k).getNickname().equals(nickname)) { if (clients.get(k).getStatus()) { // Nickname already exists and active // Send ack byte[] ack = "Login Error.".getBytes(); DatagramPacket reply = new DatagramPacket(ack, ack.length, ip, port); serverSocket.send(reply); isUnique = false; } index = k; break; } k++; } if (isUnique) { // Register or login if (index > -1) { // Nickname already exists; login clients.get(index).setStatus(true); } else { // New user; register User newUser = new User(ip, nickname, port, true); clients.add(newUser); } // Send ack byte[] ack = "Reg OK.".getBytes(); DatagramPacket reply = new DatagramPacket(ack, ack.length, ip, port); serverSocket.send(reply); // Broadcast the updated table to all active users String table = new String(); for (int i = 0; i < clients.size(); i++) { table = table + clients.get(i).getIp() + ";" + clients.get(i).getNickname() + ";" + clients.get(i).getPort() + ";" + clients.get(i).getStatus() + "/"; } byte[] tdata = table.getBytes(); InetAddress group = InetAddress.getByName(GROUP_IP); DatagramPacket broadcast = new DatagramPacket(tdata, tdata.length, group, GROUP_PORT); serverSocket.send(broadcast); // Send off-line messages if there's any String acks = "Offline "; if (offlineMsgs.get(nickname) == null) { acks = "NULL."; } else { // Load off-line messages ArrayList list = offlineMsgs.get(nickname); for (int i = 0; i < list.size(); i++) { acks = acks + list.get(i).getSender() + ";" + list.get(i).getTime() + ";" + list.get(i).getMessage() + "/"; } } // Send ack byte[] ack2 = acks.getBytes(); DatagramPacket reply2 = new DatagramPacket(ack2, ack2.length, ip, port); serverSocket.send(reply2); } } // Receiving save request if (msg.contains(save)) { // "Save Message.... String[] tokens = msg.split(delims); String sender = tokens[1]; String receiver = tokens[2]; String status = tokens[3]; String message = msg.substring(msg.indexOf(tokens[4])); int port = incoming.getPort(); InetAddress ip = incoming.getAddress(); // Check if the receiver is online boolean isOnline = false; for (int i = 0; i < clients.size(); i++) { if (clients.get(i).getNickname().equals(receiver) && clients.get(i).getStatus()) { isOnline = true; } } if (isOnline) { // Error: the receiver is online // Send ack byte[] ack = "Save Error.".getBytes(); DatagramPacket reply = new DatagramPacket(ack, ack.length, ip, port); serverSocket.send(reply); if (status.equals("offline")) { // Broadcast the correct table String table = new String(); for (int i = 0; i < clients.size(); i++) { table = table + clients.get(i).getIp() + "-" + clients.get(i).getNickname() + "-" + clients.get(i).getPort() + "-" + clients.get(i).getStatus() + "/"; } byte[] tdata = table.getBytes(); InetAddress group = InetAddress.getByName(GROUP_IP); DatagramPacket broadcast = new DatagramPacket(tdata, tdata.length, group, GROUP_PORT); serverSocket.send(broadcast); } } else { // Save the message Date date = new Date(); Timestamp t = new Timestamp(date.getTime()); Message m = new Message(sender, t, message); if (!offlineMsgs.containsKey(receiver)) { // First off-line message being saved ArrayList list = new ArrayList(); list.add(m); offlineMsgs.put(receiver, list); } else { ArrayList list = offlineMsgs.get(receiver); list.add(m); offlineMsgs.put(receiver, list); } // Send ack byte[] ack = "Save OK.".getBytes(); DatagramPacket reply = new DatagramPacket(ack, ack.length, ip, port); serverSocket.send(reply); if (status.equals("online")) { // Broadcast the table String table = new String(); for (int i = 0; i < clients.size(); i++) { table = table + clients.get(i).getIp() + ";" + clients.get(i).getNickname() + ";" + clients.get(i).getPort() + ";" + clients.get(i).getStatus() + "/"; } byte[] tdata = table.getBytes(); InetAddress group = InetAddress.getByName(GROUP_IP); DatagramPacket broadcast = new DatagramPacket(tdata, tdata.length, group, GROUP_PORT); serverSocket.send(broadcast); } } } // Receiving de-registratoin request if (msg.contains(deregister)) { String[] tokens = msg.split(delims); String nickname = tokens[1]; int port = incoming.getPort(); InetAddress ip = incoming.getAddress(); boolean done = false; int k = 0; while (!done && k < clients.size()) { if (clients.get(k).getNickname().equals(nickname)) { clients.get(k).setStatus(false); done = true; } k++; } if (done) { // Send ack byte[] ack = "Logout OK.".getBytes(); DatagramPacket reply = new DatagramPacket(ack, ack.length, ip, port); serverSocket.send(reply); // Broadcast the updated table to all active users String table = new String(); for (int i = 0; i < clients.size(); i++) { table = table + clients.get(i).getIp() + ";" + clients.get(i).getNickname() + ";" + clients.get(i).getPort() + ";" + clients.get(i).getStatus() + "/"; } byte[] tdata = table.getBytes(); InetAddress group = InetAddress.getByName(GROUP_IP); DatagramPacket broadcast = new DatagramPacket(tdata, tdata.length, group, GROUP_PORT); serverSocket.send(broadcast); } else { // Send ack byte[] ack = "Logout Error.".getBytes(); DatagramPacket reply = new DatagramPacket(ack, ack.length, ip, port); serverSocket.send(reply); } } int count = 0; for (int k = 0; k < clients.size(); k++) { if (!clients.get(k).getStatus()) { count++; } } if (count == clients.size()) { // All clients are offline break; } } serverSocket.close(); } } 

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!