Path: blob/master/concurrency-webserver/src/io_helper.c
909 views
#include "io_helper.h"12ssize_t readline(int fd, void *buf, size_t maxlen) {3char c;4char *bufp = buf;5int n;6for (n = 0; n < maxlen - 1; n++) { // leave room at end for '\0'7int rc;8if ((rc = read_or_die(fd, &c, 1)) == 1) {9*bufp++ = c;10if (c == '\n')11break;12} else if (rc == 0) {13if (n == 1)14return 0; /* EOF, no data read */15else16break; /* EOF, some data was read */17} else18return -1; /* error */19}20*bufp = '\0';21return n;22}232425int open_client_fd(char *hostname, int port) {26int client_fd;27struct hostent *hp;28struct sockaddr_in server_addr;2930if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)31return -1;3233// Fill in the server's IP address and port34if ((hp = gethostbyname(hostname)) == NULL)35return -2; // check h_errno for cause of error36bzero((char *) &server_addr, sizeof(server_addr));37server_addr.sin_family = AF_INET;38bcopy((char *) hp->h_addr,39(char *) &server_addr.sin_addr.s_addr, hp->h_length);40server_addr.sin_port = htons(port);4142// Establish a connection with the server43if (connect(client_fd, (sockaddr_t *) &server_addr, sizeof(server_addr)) < 0)44return -1;45return client_fd;46}4748int open_listen_fd(int port) {49// Create a socket descriptor50int listen_fd;51if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {52fprintf(stderr, "socket() failed\n");53return -1;54}5556// Eliminates "Address already in use" error from bind57int optval = 1;58if (setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, (const void *) &optval, sizeof(int)) < 0) {59fprintf(stderr, "setsockopt() failed\n");60return -1;61}6263// Listen_fd will be an endpoint for all requests to port on any IP address for this host64struct sockaddr_in server_addr;65bzero((char *) &server_addr, sizeof(server_addr));66server_addr.sin_family = AF_INET;67server_addr.sin_addr.s_addr = htonl(INADDR_ANY);68server_addr.sin_port = htons((unsigned short) port);69if (bind(listen_fd, (sockaddr_t *) &server_addr, sizeof(server_addr)) < 0) {70fprintf(stderr, "bind() failed\n");71return -1;72}7374// Make it a listening socket ready to accept connection requests75if (listen(listen_fd, 1024) < 0) {76fprintf(stderr, "listen() failed\n");77return -1;78}79return listen_fd;80}8182838485