diff options
author | sotech117 <michael_foiani@brown.edu> | 2023-09-20 04:04:22 +0000 |
---|---|---|
committer | sotech117 <michael_foiani@brown.edu> | 2023-09-20 04:04:22 +0000 |
commit | 1263cbdbb6cf3ebbb157286b2bb2e488e4b931c8 (patch) | |
tree | 0538cd930e5afd840f0edef42f448d1933b03b59 /snowcast_server.c | |
parent | 5eb24f6063515e86e3e87e6fb91e6672dc14de34 (diff) |
fix handshake protocol
Diffstat (limited to 'snowcast_server.c')
-rw-r--r-- | snowcast_server.c | 234 |
1 files changed, 0 insertions, 234 deletions
diff --git a/snowcast_server.c b/snowcast_server.c deleted file mode 100644 index 6043157..0000000 --- a/snowcast_server.c +++ /dev/null @@ -1,234 +0,0 @@ -/* -** server.c -- a stream socket server demo -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <netdb.h> -#include <arpa/inet.h> -#include <sys/wait.h> -#include <signal.h> - -#include "protocol.h" - -// get sockaddr, IPv4 or IPv6: -void *get_in_addr(struct sockaddr *sa) -{ - if (sa->sa_family == AF_INET) { - return &(((struct sockaddr_in*)sa)->sin_addr); - } - - return &(((struct sockaddr_in6*)sa)->sin6_addr); -} - -int main(int argc, char *argv[]) -{ - fd_set master; // master file descriptor list - fd_set read_fds; // temp file descriptor list for select() - int fdmax; // maximum file descriptor number - - int listener; // listening socket descriptor - int newfd; // newly accept()ed socket descriptor - struct sockaddr_storage remoteaddr; // client address - socklen_t addrlen; - - char buf[256]; // buffer for client data - int nbytes; - - char remoteIP[INET6_ADDRSTRLEN]; - - int yes=1; // for setsockopt() SO_REUSEADDR, below - int i, j, rv; - - struct addrinfo hints, *ai, *p; - - // check and assign arguments - if (argc < 3) { - fprintf(stderr,"usage: <listen port> <file0> [file 1] [file 2] ... \n"); - exit(1); - } - - const char* port = argv[1]; - - FD_ZERO(&master); // clear the master and temp sets - FD_ZERO(&read_fds); - - // LISTENER: get us a socket and bind it - memset(&hints, 0, sizeof hints); - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_PASSIVE; - if ((rv = getaddrinfo(NULL, port, &hints, &ai)) != 0) { - fprintf(stderr, "snowcast_server: %s\n", gai_strerror(rv)); - exit(1); - } - - for(p = ai; p != NULL; p = p->ai_next) { - listener = socket(p->ai_family, p->ai_socktype, p->ai_protocol); - if (listener < 0) { - continue; - } - - // lose the pesky "address already in use" error message - setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)); - - if (bind(listener, p->ai_addr, p->ai_addrlen) < 0) { - close(listener); - continue; - } - - break; - } - - // if we got here, it means we didn't get bound - if (p == NULL) { - fprintf(stderr, "snowcast_server: failed to bind\n"); - exit(2); - } - - freeaddrinfo(ai); // all done with this - - // listen - if (listen(listener, 10) == -1) { - perror("listen"); - exit(3); - } - - // add the listener to the master set - FD_SET(listener, &master); - - // keep track of the biggest file descriptor - fdmax = listener; // so far, it's this one - - // main loop - while(1==1) { - read_fds = master; // copy it - if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) { - perror("select"); - exit(4); - } - - // run through the existing connections looking for data to read - for(i = 0; i <= fdmax; i++) { - if (FD_ISSET(i, &read_fds)) { // we got one!! - if (i == listener) { - // handle new connections - addrlen = sizeof remoteaddr; - newfd = accept(listener, - (struct sockaddr *)&remoteaddr, - &addrlen); - - if (newfd == -1) { - perror("accept"); - } else { - FD_SET(newfd, &master); // add to master set - if (newfd > fdmax) { // keep track of the max - fdmax = newfd; - } - printf("selectserver: new connection from %s on " - "socket %d\n.", - inet_ntop(remoteaddr.ss_family, - get_in_addr((struct sockaddr*)&remoteaddr), - remoteIP, INET6_ADDRSTRLEN), - newfd); - - // send the welcome message to client - struct Welcome welcome; - welcome.replyType = 2; - welcome.numStations = htons(argc - 2); - if ((send(newfd, &welcome, sizeof(struct Welcome), 0)) == -1) - perror("send"); - } - } else { - // handle data from a client - struct Command command; - if ((nbytes = recv(i, (char*)&command, sizeof(struct Command), 0)) <= 0) { - // got error or connection closed by client - if (nbytes == 0) { - // connection closed - printf("selectserver: socket %d hung up\n", i); - } else { - perror("recv"); - } - close(i); // bye! - FD_CLR(i, &master); // remove from master set - } else { - // we got some data from a client - if (command.commandType == 0) { - // hello message with udpPort - printf("udpPort (from Hello) for new connection is %d.\n", ntohs(command.number)); - - // TALKER: get us a udp socket and bind it - struct addrinfo hintsUdp, *servinfoUdp, *pUdp; - int rvUdp, sockfdUdp, numbytesUdp; - memset(&hintsUdp, 0, sizeof hintsUdp); - hintsUdp.ai_family = AF_INET; // IPv4 - hintsUdp.ai_socktype = SOCK_DGRAM; // UDP - if ((rvUdp = getaddrinfo(argv[1], command.number, &hints, &servinfoUdp)) != 0) { - fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rvUdp)); - return 1; - } - - // loop through all the results and make a socket - for(p = servinfoUdp; p != NULL; p = p->ai_next) { - if ((sockfdUdp = socket(p->ai_family, p->ai_socktype, - p->ai_protocol)) == -1) { - perror("talker: socket"); - continue; - } - break; - } - - if (p == NULL) { - fprintf(stderr, "talker: failed to create socket\n"); - return 2; - } - - - if ((numbytesUdp = sendto(sockfdUdp, "test", strlen("test"), 0, - p->ai_addr, p->ai_addrlen)) == -1) { - perror("talker: sendto"); - exit(1); - } - - freeaddrinfo(servinfoUdp); - - printf("talker: sent %d bytes to %d\n", numbytesUdp, sockfdUdp); - // close(sockfdUdp); - } - if (command.commandType == 1) { - // setStation command for the user - printf("TODO: set station to %d\n", ntohs(command.number)); - } - else { - // send back in invalid command - struct InvalidCommand invalid; - invalid.replyType = 4; - invalid.replyStringSize = 21; - // make a string with the command.commmandType type in it - invalid.replyString = "Invalid command type"; - if ((send(i, &invalid, sizeof(struct InvalidCommand), 0)) == -1) - perror("send"); - - // drop connection upon invalid command - close(i); - FD_CLR(i, &master); - } - } - } // END handle data from client - } // END got new incoming connection - } // END looping through file descriptors - - // broadcast the new files over the udp socket list for each use - - } // END for(;;)--and you thought it would never end! - - return 0; -}
\ No newline at end of file |