From 4c883e91ee001a603d1f2d9494084fc7aeb8deef Mon Sep 17 00:00:00 2001 From: Thomas Wade Date: Sun, 28 Feb 2021 12:00:26 +1030 Subject: [PATCH] Outstanding changes left since forever ago --- server1.c | 157 ++++++++++++++++++++++++++---------------------------- 1 file changed, 77 insertions(+), 80 deletions(-) diff --git a/server1.c b/server1.c index a5991a0..d9896c3 100644 --- a/server1.c +++ b/server1.c @@ -12,21 +12,20 @@ #include #include -#define BUFFERT 512 +#define BUFFER_LENGTH 512 #define BACKLOG 1 void usage(char* programName); int create_server_socket(int port); -struct sockaddr_in sock_serv, sock_clt; +struct sockaddr_in socket_server, socket_client; int main(int argc, char** argv) { int sfd, fd; - unsigned int length = sizeof(struct sockaddr_in); long int n, m, count = 0; unsigned int nsid; - ushort clt_port; - char buffer[BUFFERT], filename[256]; + ushort client_port; + char buffer[BUFFER_LENGTH], filename[256]; char dst[INET_ADDRSTRLEN]; time_t intps; struct tm* tmi; @@ -64,105 +63,103 @@ int main(int argc, char** argv) exit(EXIT_SUCCESS); } + // Set socket options int yes = 1; - if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1 ) + if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) { perror("setsockopt error"); exit(5); } - int l = sizeof(struct sockaddr_in); - bzero(&sock_serv, l); + // Clear out the server socket address struct + int sockaddr_size = sizeof(struct sockaddr_in); + bzero(&socket_server, sockaddr_size); - /* The following assignment should use; Internet version 4 protocols constant */ - sock_serv.sin_family =/* Q) What goes here? */; - /* See; man socket */ + // Define properties of server socket address + socket_server.sin_family = AF_INET; + socket_server.sin_port = htons(port); + socket_server.sin_addr.s_addr = htonl(0); // <-- 0.0.0.0, binds to all interfaces - sock_serv.sin_port = htons(atoi(argv[1])); - - /* Set the IP address to allow connections on any network interface on the server */ - sock_serv.sin_addr.s_addr = htonl(/* Q) What goes here? */); - /* See; man 4 ip */ - - if (bind(sfd, (struct sockaddr*) &sock_serv, l) == -1) + // Bind the socket to the address + if (bind(sfd, (struct sockaddr*) &socket_server, sockaddr_size) == -1) { perror("bind fail"); exit(EXIT_FAILURE); } - bzero(buffer,BUFFERT); - listen(sfd,BACKLOG); + // Clear message buffer + bzero(buffer, BUFFER_LENGTH); - /* accept() takes "struct sockaddr_in" and returns non-negative integer that is a descriptor for the accepted socket. - * The missing arguement in the line below will need to have the *address* of the variable required, as the value is updated when the socket is update. eg, &variable - */ - nsid = accept(sfd, (struct sockaddr*) &sock_clt, /* Q) What goes here? */); - /* See; man 2 accept */ + // Start listening for connections, allowing a maximum of BACKLOG waiting connections + listen(sfd, BACKLOG); + // Block and accept incoming connection + // TODO: Figure out what socklen actually is and why it's here + socklen_t socklen; + nsid = accept(sfd, (struct sockaddr*) &socket_client, &socklen); + // if (nsid == -1) { perror("accept fail"); - return EXIT_FAILURE; + exit(EXIT_FAILURE); } - else + + if(inet_ntop(AF_INET, &socket_client.sin_addr, dst, INET_ADDRSTRLEN) == NULL) { - if(inet_ntop(AF_INET, &sock_clt.sin_addr, dst, INET_ADDRSTRLEN) == NULL) - { - perror("socket error"); - exit (4); - } - - clt_port = ntohs(sock_clt.sin_port); - printf("connection : %s:%d\n", dst, clt_port); - - bzero(filename, 256); - - intps = time(NULL); - tmi = localtime(&intps); - - bzero(filename, 256); - - sprintf(filename, "saved-file.%d.%d.%d.%d.%d.%d", tmi->tm_mday, tmi->tm_mon+1, 1900+tmi->tm_year, tmi->tm_hour, tmi->tm_min, tmi->tm_sec); - printf("Creating the copied output file : %s\n", filename); - - if ((fd = open(filename, O_CREAT | O_WRONLY, 0600)) == -1) - { - perror("open fail"); - exit(3); - } - - bzero(buffer, BUFFERT); - - n = recv(nsid, buffer, BUFFERT, 0); - - while(n) - { - if (n==-1) - { - perror("recv fail"); - exit(5); - } - - if ((m=write(fd,buffer,n))==-1) - { - perror("write fail"); - exit(6); - } - - count += m; - - bzero(buffer, BUFFERT); - - n = recv(nsid, buffer, BUFFERT, 0); - } - - close(sfd); - close(fd); + perror("socket error"); + exit (4); } + client_port = ntohs(socket_client.sin_port); + printf("connection : %s:%d\n", dst, client_port); + + bzero(filename, 256); + + intps = time(NULL); + tmi = localtime(&intps); + + bzero(filename, 256); + + sprintf(filename, "saved-file.%d.%d.%d.%d.%d.%d", tmi->tm_mday, tmi->tm_mon+1, 1900+tmi->tm_year, tmi->tm_hour, tmi->tm_min, tmi->tm_sec); + printf("Creating the copied output file : %s\n", filename); + + if ((fd = open(filename, O_CREAT | O_WRONLY, 0600)) == -1) + { + perror("open fail"); + exit(3); + } + + bzero(buffer, BUFFER_LENGTH); + + n = recv(nsid, buffer, BUFFER_LENGTH, 0); + + while(n) + { + if (n==-1) + { + perror("recv fail"); + exit(5); + } + + if ((m=write(fd,buffer,n))==-1) + { + perror("write fail"); + exit(6); + } + + count += m; + + bzero(buffer, BUFFER_LENGTH); + + n = recv(nsid, buffer, BUFFER_LENGTH, 0); + } + + close(sfd); + close(fd); + close(nsid); - printf("End of transmission with %s.%d\n", dst, clt_port); + printf("End of transmission with %s.%d\n", dst, client_port); /* Select the appropriate variable in the following function call argument */ printf("Number of octets received : %ld \n", /* Q) What goes here? */);