aboutsummaryrefslogtreecommitdiff
path: root/server.c
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2023-09-20 04:04:22 +0000
committersotech117 <michael_foiani@brown.edu>2023-09-20 04:04:22 +0000
commit1263cbdbb6cf3ebbb157286b2bb2e488e4b931c8 (patch)
tree0538cd930e5afd840f0edef42f448d1933b03b59 /server.c
parent5eb24f6063515e86e3e87e6fb91e6672dc14de34 (diff)
fix handshake protocol
Diffstat (limited to 'server.c')
-rw-r--r--server.c153
1 files changed, 0 insertions, 153 deletions
diff --git a/server.c b/server.c
deleted file mode 100644
index be9f603..0000000
--- a/server.c
+++ /dev/null
@@ -1,153 +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"
-
-#define BACKLOG 10 // how many pending connections queue will hold
-
-#define MAXDATASIZE 100 // max number of bytes we can get at once
-
-
-void sigchld_handler(int s)
-{
- // waitpid() might overwrite errno, so we save and restore it:
- int saved_errno = errno;
-
- while(waitpid(-1, NULL, WNOHANG) > 0);
-
- errno = saved_errno;
-}
-
-
-// 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[])
-{
- int sockfd, new_fd, numbytes, b; // listen on sock_fd, new connection on new_fd
- char buf[MAXDATASIZE];
- struct addrinfo hints, *servinfo, *p;
- struct sockaddr_storage their_addr; // connector's address information
- socklen_t sin_size;
- struct sigaction sa;
- int yes=1;
- char s[INET6_ADDRSTRLEN];
- int rv;
-
- if (argc < 3) {
- fprintf(stderr,"usage: <listen port> <file0> [file 1] [file 2] ... \n");
- exit(1);
- }
-
- memset(&hints, 0, sizeof hints);
- hints.ai_family = AF_INET; // only IPv4
- hints.ai_socktype = SOCK_STREAM; // TCP connection
- hints.ai_flags = AI_PASSIVE; // use my IP
-
- const char* port = argv[1]; // the port users will be connecting to
-
- if ((rv = getaddrinfo(NULL, port, &hints, &servinfo)) != 0) {
- fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
- return 1;
- }
-
- // loop through all the results and bind to the first we can
- for(p = servinfo; p != NULL; p = p->ai_next) {
- if ((sockfd = socket(p->ai_family, p->ai_socktype,
- p->ai_protocol)) == -1) {
- perror("server: socket");
- continue;
- }
-
- if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,
- sizeof(int)) == -1) {
- perror("setsockopt");
- exit(1);
- }
-
- if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
- close(sockfd);
- perror("server: bind");
- continue;
- }
-
- break;
- }
-
- freeaddrinfo(servinfo); // all done with this structure
-
- if (p == NULL) {
- fprintf(stderr, "server: failed to bind\n");
- exit(1);
- }
-
- if (listen(sockfd, BACKLOG) == -1) {
- perror("listen");
- exit(1);
- }
-
- sa.sa_handler = sigchld_handler; // reap all dead processes
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = SA_RESTART;
- if (sigaction(SIGCHLD, &sa, NULL) == -1) {
- perror("sigaction");
- exit(1);
- }
-
- printf("server: waiting for connections...\n");
-
-
-
- while(1) { // main accept() loop
- sin_size = sizeof their_addr;
- new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
- if (new_fd == -1) {
- perror("accept");
- continue;
- }
-
- inet_ntop(their_addr.ss_family,
- get_in_addr((struct sockaddr *)&their_addr),
- s, sizeof s);
- printf("server: got connection from %s\n", s);
-
- if (!fork()) { // this is the child process
-
- close(sockfd); // child doesn't need the listener
-
- // make a struct for the message, number is the number of stations
- struct Welcome welcome;
- welcome.replyType = 2;
- welcome.numStations = htons(argc - 2);
- if ((send(new_fd, &welcome, sizeof(struct Welcome), 0)) == -1)
- perror("send");
- close(new_fd);
- exit(0);
- }
- // close(new_fd); // parent doesn't need this
- }
-
- return 0;
-} \ No newline at end of file