// server1 - server program for demonstrating data transfer over TCP/IP // This program complies with the GNU Coding Standards found here: // https://www.gnu.org/prep/standards/html_node/index.html #include #include #include #include #include #include #include #include #include #include #include #include #define BUFFERT 512 #define BACKLOG 1 int create_server_socket (int port); struct sockaddr_in sock_serv,sock_clt; 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]; char dst[INET_ADDRSTRLEN]; time_t intps; struct tm* tmi; /* (A) repalce the following line with suitable getopt() functionality */ if(argc!=2) {perror("Usage ./a.out \n");exit(3);} int l; int yes=1; /* The following function call should use; Internet version 4 protocols with a sequenced, reliable, two-way connection based byte streams */ sfd = socket( /* Q) What goes here? */ , /* Q) What goes here? */ , 0); /* See; man socket */ if (sfd == -1) {perror("socket fail");return EXIT_SUCCESS;} if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR,&yes,sizeof(int)) == -1 ) {perror("setsockopt erreur");exit(5);} l = sizeof(struct sockaddr_in); bzero(&sock_serv,l); /* The following assignment should use; Internet version 4 protocols constant */ sock_serv.sin_family=/* Q) What goes here? */; /* See; man socket */ 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) {perror("bind fail"); exit(EXIT_FAILURE);} bzero(buffer,BUFFERT); listen(sfd,BACKLOG); /* 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 */ if (nsid == -1) {perror("accept fail"); return EXIT_FAILURE;} else { if(inet_ntop(AF_INET,&sock_clt.sin_addr,dst,INET_ADDRSTRLEN)==NULL) {perror("erreur socket");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=count+m; bzero(buffer,BUFFERT); n=recv(nsid,buffer,BUFFERT,0); } close(sfd); close(fd); } close(nsid); printf("End of transmission with %s.%d\n",dst,clt_port); /* Select the appropriate variable in the following function call argument */ printf("Number of octets received : %ld \n", /* Q) What goes here? */); return EXIT_SUCCESS; }