1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <kernel/OS.h> 4 #include <string.h> 5 #include <sys/time.h> 6 #include <errno.h> 7 8 #include "sys/socket.h" 9 #include "netinet/in.h" 10 #include "arpa/inet.h" 11 #include "sys/select.h" 12 13 #include "ufunc.h" 14 15 #define SOCKETS 15 16 17 int main(int argc, char **argv) 18 { 19 int * s; 20 int rv; 21 struct fd_set fdr, fdw, fde; 22 struct timeval tv; 23 int32 rtc; 24 int i, max = 0; 25 int nsock = SOCKETS; 26 27 test_banner("Big Select Test"); 28 29 if (argc >= 2) 30 nsock = atoi(argv[1]); 31 32 if (nsock < 1 || nsock > 50) { 33 printf("Unrealistic value of sockets given. Must be between 1 and 50\n"); 34 err(-1, "Parameters"); 35 } 36 37 s = (int *) malloc(nsock * sizeof(int)); 38 if (!s) 39 err(-1, "Not enought memory for sockets array"); 40 41 printf("\nTest will be run with %d sockets\n\n", nsock); 42 43 for (i=0;i<nsock;i++) { 44 s[i] = socket(AF_INET, SOCK_DGRAM, 0); 45 if (s[i] < 0) { 46 free(s); 47 err(errno, "Socket creation failed"); 48 } 49 } 50 51 FD_ZERO(&fdr); 52 for (i=0;i<nsock;i++) { 53 if (s[i] > max) 54 max = s[i]; 55 FD_SET(s[i], &fdr); 56 } 57 FD_ZERO(&fdw); 58 // FD_SET(s, &fdw); 59 FD_ZERO(&fde); 60 // FD_SET(s, &fde); 61 62 tv.tv_sec = 5; 63 tv.tv_usec = 0; 64 65 printf("Trying with timeval (5 secs)...\n"); 66 rtc = real_time_clock(); 67 rv = select(max + 1, &fdr, NULL, &fde, &tv); 68 rtc = real_time_clock() - rtc; 69 printf("select gave %d in %ld seconds\n", rv, rtc); 70 if (rv < 0) 71 printf("errno = %d [%s]\n", errno, strerror(errno)); 72 73 printf("resetting select fd's\n"); 74 FD_ZERO(&fdr); 75 for (i=0;i<nsock;i++) 76 FD_SET(s[i], &fdr); 77 FD_ZERO(&fdw); 78 for (i=0;i<nsock;i++) 79 FD_SET(s[i], &fdw); 80 FD_ZERO(&fde); 81 for (i=0;i<nsock;i++) 82 FD_SET(s[i], &fde); 83 84 printf("Trying without timeval (= NULL)\n"); 85 rv = select(max +1, &fdr, &fdw, &fde, NULL); 86 printf("select gave %d\n", rv); 87 88 if (rv > 0) { 89 if (FD_ISSET(s[0], &fdr)) 90 printf("Data to read\n"); 91 if (FD_ISSET(s[0], &fdw)) 92 printf("OK to write\n"); 93 if (FD_ISSET(s[0], &fde)) 94 printf("Exception!\n"); 95 } else if (rv < 0) 96 printf("error was %d [%s]\n", errno, strerror(errno)); 97 98 for (i=0;i<nsock;i++) 99 closesocket(s[i]); 100 101 free(s); 102 103 printf("Test complete.\n"); 104 105 return (0); 106 } 107 108