#include #include #include #include #include #include #include #include void handle_client(int client_sock) { char client_message[2000]; int read_size; // Send a message to the client char *message = "Hello Client...\n"; write(client_sock, message, strlen(message)); // Receive messages from client while ((read_size = recv(client_sock, client_message, 2000, 0)) > 0) { // End of string marker client_message[read_size] = '\0'; // Print the received message printf("Client: %s\n", client_message); // Send the message back to client write(client_sock, client_message, strlen(client_message)); // Clear the message buffer memset(client_message, 0, 2000); if (strncmp(client_message, "exit", 4) == 0) { break; } } if (read_size == 0) { puts("Client disconnected"); } else if (read_size == -1) { perror("recv failed"); } close(client_sock); } int main(int argc, char *argv[]) { int socket_desc, client_sock, c, *new_sock; struct sockaddr_in server, client; pid_t child_pid; if (argc < 2) { printf("Usage: %s \n", argv[0]); return 1; } // Create socket socket_desc = socket(AF_INET, SOCK_STREAM, 0); if (socket_desc == -1) { printf("Could not create socket"); return 1; } puts("Socket created"); // Prepare the sockaddr_in structure server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; int port = atoi(argv[1]); server.sin_port = htons(port); // Bind if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) { perror("bind failed. Error"); return 1; } puts("bind done"); // Listen listen(socket_desc, 3); // Accept an incoming connection puts("Waiting for incoming connections..."); c = sizeof(struct sockaddr_in); while ((client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c))) { puts("Connection accepted"); child_pid = fork(); if (child_pid == 0) { // Child process // In the child process, handle the client handle_client(client_sock); exit(0); // Exit the child process when done } else if (child_pid < 0) { perror("could not fork"); return 1; } // Parent process closes the client socket close(client_sock); } if (client_sock < 0) { perror("accept failed"); return 1; } return 0; }