/** * Jade Cheng * ICS 451 * Assignment 1 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include "jadesocket.h" /** * This function loops and accepts socket connections on a specified port. The * function calls the "fn" function when a connection is made. If that function * returns a EXIT_FAILURE, this function returns. Otherwise, it loops forever. * * @param s The socket descriptor. * @param buffer The stream of data to send. * @param count The maximum length to send. * * @return EXIT_SUCCESS if successful; EXIT_FAILURE if not. */ int js_accept_all(JS_ACCEPT_ALL_PROC fn, short port, int backlog) { int passive; int session; struct sockaddr_in sin; struct sockaddr * sap; struct protoent * protocolentry; socklen_t adrsize; protocolentry = getprotobyname("tcp"); if (protocolentry == NULL) { perror("getprotobyname"); return EXIT_FAILURE; } passive = socket(PF_INET, SOCK_STREAM, protocolentry->p_proto); if (passive < 0) { perror("socket"); return EXIT_FAILURE; } memset(&sin, 0, sizeof (sin)); sin.sin_family = AF_INET; sin.sin_port = htons(port); sin.sin_addr.s_addr = INADDR_ANY; sap = (struct sockaddr *) &sin; if (bind(passive, sap, sizeof(sin)) != 0) { perror("bind"); close(passive); return EXIT_FAILURE; } if (listen(passive, backlog) < 0) { perror("listen"); close(passive); return EXIT_FAILURE; } adrsize = sizeof(sin); while ((session = accept(passive, sap, &adrsize)) >= 0) { if (EXIT_SUCCESS != fn(session)) { close(passive); return EXIT_FAILURE; } } close(passive); return EXIT_SUCCESS; } /** * This function sends data through the specified socket until the bytes sent * reaches the specified length. * * @param s The socket descriptor. * @param buffer The stream of data to send. * @param count The maximum length to send. * * @return EXIT_SUCCESS if successful; EXIT_FAILURE if not. */ int js_send(int s, const void * buffer, int count) { while (count > 0) { int actual; actual = send(s, buffer, count, 0); if (actual <= 0) { fprintf(stderr, "Error on line %d in %s\n", __LINE__, __FILE__); return EXIT_FAILURE; } count -= actual; } return EXIT_SUCCESS; }