#include #include #include #include #include #include #include #include #include #include #include #include #include #include void printError(char msg[128]); void transmit(int port, int protocol, int requests, int buffersize); struct sockaddr_in remote_addr; struct ifreq ifreq; socklen_t s_size; FILE* logfile; int main(int argc, char* argv[]) { pid_t pid; int i, port, clients, requests, buffersize, protocol; if (argc < 7) printError("usage: testcli \n"); logfile = fopen("log.txt","w"); if (inet_addr(argv[1]) == -1) printError("invalid ip address\n"); if ((port = atoi(argv[2])) < 1) printError("port < 1\n"); if ((clients = atoi(argv[4])) < 1) printError("clients < 1\n"); if ((requests = atoi(argv[5])) < 1) printError("requests < 1\n"); if ((buffersize = atoi(argv[6])) < 1 || buffersize > 8192) printError("bytes parameter must be between 1 and 8192\n"); if (!strcmp(argv[3],"UDP")) protocol = SOCK_DGRAM; else if (!strcmp(argv[3],"TCP")) protocol = SOCK_STREAM; else printError("invalid protocol specified"); remote_addr.sin_family = AF_INET; remote_addr.sin_port = htons(port); inet_pton(AF_INET, argv[1], &remote_addr.sin_addr.s_addr); strcpy (ifreq.ifr_name, "eth0"); s_size = sizeof(remote_addr); if (getpid() == getppid()) { fprintf(logfile,"LOG: %i bytes\n", buffersize); fprintf(logfile,"LOG: %i clients\n", clients); fprintf(logfile,"-------------------\n"); } for (i = 0; i < clients; i++) { pid = fork(); switch(pid) { case -1: printError("Fork error\n"); case 0: { transmit(port, protocol, requests, buffersize); break; } } } for (i = 0; i < clients; i++) wait(0); fclose(logfile); return 0; } void transmit(int port, int protocol, int requests, int buffersize) { int i, sock, msec; char buffer[buffersize], rbuffer[buffersize]; for (i = 0; i < buffersize; i++) { buffer[i] = (char)(rand() % 92 + 70); } struct timeval start, finish; gettimeofday (&start, NULL); switch (protocol) { case SOCK_STREAM:{ if ((sock = socket(AF_INET, protocol, 0)) == -1) printError("Can't create socket\n"); if (connect(sock, (struct sockaddr *)&remote_addr, s_size) == -1) printError("Can't connect\n"); printf("Forked TCP process (pid: %i) connected\n", getpid()); for (i = 0; i < requests; i++) { if (send(sock, buffer, buffersize, 0) == -1) printf("Forked process, Send error (pid: %i)\n", getpid()); if (recv(sock, rbuffer, buffersize, 0) == -1) printf("Forked process, Recv error (pid: %i)\n", getpid()); else printf("Forked process %i sent: %s\n received: %s\n", getpid(), buffer, rbuffer); } close(sock); gettimeofday (&finish, NULL); msec = finish.tv_sec * 1000 + finish.tv_usec / 1000; msec -= start.tv_sec * 1000 + start.tv_usec / 1000; printf("Forked process (pid: %i) killed\n", getpid()); fprintf(logfile," - Duration: %5.3fs\n", (double)msec/1000); exit(0); break; } case SOCK_DGRAM:{ if ((sock = socket(AF_INET, protocol, 0)) == -1) printError("Can't create socket\n"); printf("Forked UDP process (pid: %i) created\n", getpid()); for (i = 0; i < requests; i++) { if (sendto(sock, buffer, buffersize, 0, (struct sockaddr*)&remote_addr, s_size) == -1) printf("Forked process, Sendto error (pid: %i)\n", getpid()); if (recvfrom(sock, rbuffer, buffersize, 0, (struct sockaddr*)&remote_addr, &s_size) == -1) printf("Forked process, Recvfrom error (pid: %i)\n", getpid()); else printf("Forked process %i sent: %s\n received: %s\n", getpid(), buffer, rbuffer); } close(sock); gettimeofday (&finish, NULL); msec = finish.tv_sec * 1000 + finish.tv_usec / 1000; msec -= start.tv_sec * 1000 + start.tv_usec / 1000; printf("Forked process (pid: %i) killed\n", getpid()); fprintf(logfile," - Duration: %5.3fs\n", (double)msec/1000); exit(0); break; } } } void printError(char msg[128]) { printf(msg); exit(1); }