main(int ac, char **av) { int i; int on = 1; short port = -1; /* host order. */ int setFD = 0; struct sockaddr_in saddr; int acceptFD; clientHandle_t *clientHandle; int code; int addr_len; PROCESS pid; fd_set *rfds, *wfds, *efds; int sockFD; program = av[0]; if (ac < 2) Usage(); /* lwp_debug = 1; */ signal(SIGIO, sigIO); for (i = 1; i < ac; i++) { if (!strcmp("-fd", av[i])) { if (++i >= ac) { printf("Missing number for -fd option.\n"); Usage(); } setFD = atoi(av[i]); if (setFD <= 2) { printf("%d: file descriptor must be at least 3.\n", setFD); Usage(); } } else { if (port == -1) { port = atoi(av[i]); if (port <= 0) { printf("%s: port must be at least 1\n", av[i]); Usage(); } } else { printf("%s: Unknown argument.\n", av[i]); } } } if (port == -1) { printf("Missing port.\n"); Usage(); } if (!setFD) { setFD = 31; printf("Using default socket of %d.\n", setFD); } OpenFDs(setFD); IOMGR_Initialize(); /* Setup server processes */ for (i = 0; i < MAX_THREADS; i++) { if (LWP_CreateProcess (handleRequest, 32768, LWP_NORMAL_PRIORITY, (char *)&clientHandles[i], "HandleRequestThread", &pid) < 0) { printf("%s: Failed to start all LWP's\n", program); exit(1); } clientHandles[i].ch_pid = pid; } sockFD = socket(AF_INET, SOCK_STREAM, 0); if (sockFD < 0) { perror("socket"); exit(1); } Log("Using socket at file descriptor %d.\n", sockFD); if (setsockopt(sockFD, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) { perror("setsockopt: "); exit(1); } memset((void *)&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_port = ntohs(port); saddr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(sockFD, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { perror("bind: "); exit(1); } rfds = IOMGR_AllocFDSet(); wfds = IOMGR_AllocFDSet(); efds = IOMGR_AllocFDSet(); if (!rfds || !wfds || !efds) { printf("main: Could not alloc fd_set's.\n"); exit(1); } listen(sockFD, 100); while (1) { FD_ZERO(rfds); FD_ZERO(wfds); FD_ZERO(efds); FD_SET(sockFD, rfds); FD_SET(sockFD, efds); Log("Main - going to select.\n"); code = IOMGR_Select(sockFD + 1, rfds, wfds, efds, (struct timeval *)0); switch (code) { case 0: /* Timer, can't happen here. */ case -1: case -2: Log("Oops! select returns %d!\n", code); abort(); default: if (FD_ISSET(sockFD, efds)) { recvOOB(sockFD); assertNullFDSet(sockFD, rfds); assertNullFDSet(-1, wfds); assertNullFDSet(sockFD, efds); } if (FD_ISSET(sockFD, rfds)) { while (nThreads > MAX_THREADS) { IOMGR_Sleep(1); } clientHandle = getClientHandle(); addr_len = sizeof(clientHandle->ch_addr); clientHandle->ch_fd = accept(sockFD, (struct sockaddr *) &clientHandle->ch_addr, &addr_len); if (clientHandle->ch_fd < 0) { perror("accept: "); exit(1); } Log("Main - signalling LWP 0x%x\n", &clientHandle->ch_state); LWP_NoYieldSignal(&clientHandle->ch_state); assertNullFDSet(sockFD, rfds); assertNullFDSet(-1, wfds); assertNullFDSet(-1, efds); break; } Die(1, "(main) No data to read.\n"); } } }
main(int ac, char **av) { int i; int on = 1; char *hostname = 0; struct hostent *hostent; int host; /* net order. */ short port = -1; /* host order. */ int setFD = 0; int sockFD; struct sockaddr_in saddr; int reqOOB = 0; int putOOB = 0; int delay = 5; int doEnd = 0; int doWrite = 0; int writeSize = 0; program = av[0]; signal(SIGIO, sigIO); for (i = 1; i < ac; i++) { if (!strcmp("-fd", av[i])) { if (++i >= ac) { printf("Missing number for -fd option.\n"); Usage(); } setFD = atoi(av[i]); if (setFD <= 2) { printf("%s: %d: file descriptor must be at least 3.\n", program, setFD); Usage(); } } else if (!strcmp("-end", av[i])) { doEnd = 1; } else if (!strcmp("-delay", av[i])) { if (++i >= ac) { printf("%s: Missing time for -delay option.\n", program); Usage(); } delay = atoi(av[i]); if (delay < 0) { printf("%s: %s: delay must be at least 0 seconds.\n", program, av[i]); Usage(); } } else if (!strcmp("-write", av[i])) { doWrite = 1; if (++i >= ac) { printf("%s: Missing size for -write option.\n", program); Usage(); } writeSize = atoi(av[i]); if (writeSize < 1) { printf("%s: %s: Write size must be at least 1 byte.\n", program, av[i]); Usage(); } } else if (!strcmp("-oob", av[i])) { reqOOB = 1; } else if (!strcmp("-soob", av[i])) { putOOB = 1; } else { if (!hostname) { hostname = av[i]; } else if (port == -1) { port = atoi(av[i]); if (port <= 0) { printf("%s: %s: port must be at least 1\n", program, av[i]); Usage(); } } else { printf("%s: %s: Unknown argument.\n", program, av[i]); } } } if (!hostname) { printf("%s: Missing hostname and port.\n", program); Usage(); } if (port == -1) { printf("%s: Missing port.\n", program); Usage(); } if (writeSize == 0 && doEnd == 0 && putOOB == 0) { printf("%s: Missing action.\n", program); Usage(); } if (!setFD) { setFD = 31; printf("%s: Using default socket of %d.\n", program, setFD); } if (!(hostent = gethostbyname(hostname))) { printf("%s: Failed to find host entry for %s.\n", program, hostname); exit(1); } memcpy((void *)&host, (const void *)hostent->h_addr, sizeof(host)); OpenFDs(setFD); /* Connect to server. */ sockFD = socket(AF_INET, SOCK_STREAM, 0); if (sockFD < 0) { Die(0, "socket"); } printf("%s: Using socket at file descriptor %d.\n", program, sockFD); memset((void *)&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = host; /* already in network byte order. */ saddr.sin_port = htons(port); if (connect(sockFD, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { assert(0); } if (doEnd) { sendEnd(sockFD); } else if (putOOB) { Log("Will send OOB in 2 seconds.\n"); sleep(2); sendOOB(sockFD); Log("Sent OOB, sleeping for 5 seconds.\n"); sleep(5); Log("Sent OOB, exiting.\n"); } else { IOMGR_Initialize(); sendTest(sockFD, delay, reqOOB, writeSize); } close(sockFD); }