#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <signal.h>
#define PORT 8888
#define BUFFER_SIZE 1024
void handleClient(int clientSocket) {
struct sockaddr_in clientAddress;
socklen_t clientLength = sizeof(clientAddress);
getpeername(clientSocket, (struct sockaddr *) &clientAddress, &clientLength);
char buffer[BUFFER_SIZE];
memset(buffer, 0, sizeof(buffer));
ssize_t bytesRead = recv(clientSocket, buffer, BUFFER_SIZE - 1, 0);
if (bytesRead < 0) {
perror("Error reading from socket");
close(clientSocket);
exit(1);
}
printf("Received from client: %s,%d\n", buffer, ntohs(clientAddress.sin_port));
time_t currentTime;
time(¤tTime);
char *timeString = ctime(¤tTime);
char replyBuffer[BUFFER_SIZE];
snprintf(replyBuffer, BUFFER_SIZE, "Server received: %s\nTime: %s", buffer, timeString);
ssize_t bytesSent = send(clientSocket, replyBuffer, strlen(replyBuffer), 0);
if (bytesSent < 0) {
perror("Error writing to socket");
close(clientSocket);
exit(1);
}
}
int main() {
int serverSocket, clientSocket;
struct sockaddr_in serverAddress, clientAddress;
socklen_t clientLength;
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) {
perror("Error creating socket");
exit(1);
}
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(PORT);
if (bind(serverSocket, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) {
perror("Error binding socket");
close(serverSocket);
exit(1);
}
if (listen(serverSocket, 5) < 0) {
perror("Error listening on socket");
close(serverSocket);
exit(1);
}
printf("Server listening on port %d\n", PORT);
signal(SIGCHLD, SIG_IGN);
while (1) {
clientLength = sizeof(clientAddress);
clientSocket = accept(serverSocket, (struct sockaddr *) &clientAddress, &clientLength);
if (clientSocket < 0) {
perror("Error accepting connection");
close(serverSocket);
exit(1);
}
printf("Client connected: %s:%d\n", inet_ntoa(clientAddress.sin_addr), ntohs(clientAddress.sin_port));
pid_t pid = fork();
if (pid < 0) {
perror("Error forking");
close(clientSocket);
close(serverSocket);
exit(1);
} else if (pid == 0) {
close(serverSocket);
while (1) {
handleClient(clientSocket);
}
exit(0);
} else {
close(clientSocket);
}
}
close(serverSocket);
return 0;
}