#include #include #include #include #include #include #include #include #include #include int server; void timespec_diff(const struct timespec *start, const struct timespec *stop, struct timespec *result) { if ((stop->tv_nsec - start->tv_nsec) < 0) { result->tv_sec = stop->tv_sec - start->tv_sec - 1; result->tv_nsec = stop->tv_nsec - start->tv_nsec + 1000000000L; } else { result->tv_sec = stop->tv_sec - start->tv_sec; result->tv_nsec = stop->tv_nsec - start->tv_nsec; } } double timespec_conv(const struct timespec *ts) { return ts->tv_sec + (double) ts->tv_nsec / 1000000000L; } void recieve(int sock) { struct timespec start, stop, result; char buffer[1024 * 10]; ssize_t bc; int bytes; bc = recv(sock, &bytes, sizeof(int), 0); if (bc <= 0) { printf("Failed to receive file size\n"); close(sock); return; } printf("File size: %i\n", bytes); bc = send(sock, buffer, sizeof(char), 0); if (bc <= 0) { printf("Failed to send ack\n"); close(sock); return; } int count = 0; FILE *fp = fopen("/tmp/TEST", "w"); timespec_get(&start, TIME_UTC); while (count < bytes) { int temp = 0; gtrecv: bc = recv(sock, buffer, sizeof(buffer), 0); if (bc <= 0) { printf("Failed to receive file\n"); close(sock); return; } temp += (int) bc; fwrite(buffer, sizeof(char), bc, fp); printf("Received: %zi bytes, total: %i\n", bc, count); if (temp < 512) goto gtrecv; count += temp; bc = send(sock, buffer, sizeof(char), 0); if (bc <= 0) { printf("Failed to send ack\n"); close(sock); return; } } timespec_get(&stop, TIME_UTC); timespec_diff(&start, &stop, &result); printf("time: %g\n", timespec_conv(&result)); printf("speed: %g\n", (count / timespec_conv(&result)) / (1024 * 1024 / 8)); fclose(fp); close(sock); } void cli() { int conn; struct sockaddr_in server_addr, cl; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(5005); server = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (server == -1) { printf("Failed creating socket\n"); close(server); return; } int err; int opt = 1; err = setsockopt(server, IPPROTO_TCP, TCP_QUICKACK, (void *) &opt, sizeof(opt)); if (err == -1) { printf("Failed to set socket to TCP_QUICKACK\n"); close(server); return; } int opt2 = 1; err = setsockopt(server, IPPROTO_TCP, TCP_NODELAY, (void *) &opt2, sizeof(opt2)); if (err == -1) { printf("Failed to set socket to TCP_NODELAY\n"); close(server); return; } if ((bind(server, (struct sockaddr *) &server_addr, sizeof(server_addr))) != 0) { printf("Failed binding socket\n"); close(server); return; } if ((listen(server, 5)) != 0) { printf("Failed to start listening socket\n"); close(server); return; } socklen_t len = sizeof(cl); conn = accept(server, (struct sockaddr *) &cl, &len); if (conn <= 0) { printf("Failed to accept client\n"); close(server); return; } recieve(conn); close(server); } void handler(int c) { close(server); exit(EXIT_SUCCESS); } int main(void) { struct sigaction act; act.sa_handler = handler; sigaction(SIGINT, &act, NULL); sigaction(SIGTERM, &act, NULL); cli(); handler(0); return 0; }