#include #include #include #include #include #include #include #define PORT 8081 #define BUFFER_SIZE 4096 int main() { int server_fd, new_socket; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[BUFFER_SIZE] = {0}; if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } printf("TCP Performance Server listening on port %d...\n", PORT); if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } printf("Client connected. Receiving data...\n"); long long total_bytes = 0; int valread; struct timespec start, end; clock_gettime(CLOCK_MONOTONIC, &start); while ((valread = read(new_socket, buffer, BUFFER_SIZE)) > 0) { total_bytes += valread; } clock_gettime(CLOCK_MONOTONIC, &end); double time_taken = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1e9; double mb = total_bytes / (1024.0 * 1024.0); double throughput = mb / time_taken; printf("Received %.2f MB in %.2f seconds.\n", mb, time_taken); printf("Throughput: %.2f MB/s\n", throughput); close(new_socket); close(server_fd); return 0; }