All pastes #810492 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-12-10 00:14 UTC
rendered paste body
// Student: Steve Fiorelli
// Professor: Victor Ralevich
// Due: Friday December 7th, 2007
// Unix Systems Programming course


// Run server then run client code
/* server process */

#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <time.h>

#define SIZE sizeof(struct sockaddr_in)
	
void catcher(int sig);
int newsockfd;

main()
{
	int sockfd;
	char c;
	struct sockaddr_in server = {AF_INET, 7000, INADDR_ANY};
	static struct sigaction act;
		
	act.sa_handler = catcher;
	sigfillset(&(act.sa_mask));
	sigaction(SIGPIPE, &act, NULL);
	
	/* set up the transport end point */
	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
	{
		perror("socket call failed");
		exit(1);
	}
		
	/* bind an address to the end point */
	if (bind(sockfd, (struct sockaddr *) &server, SIZE) == -1)
	{
		perror("bind call failed");
		exit(1);
	}
		
	/* start listening for incoming connections */
	if (listen(sockfd, 5) == -1)
	{
		perror("listen call failed");
		exit(1);
	}

	// set alarm so that server doesn't sit waiting forever
	alarm(15);
	for(;;)
	{
		printf("Loop started.\n");
		
		/*accept a connection */   // keeps sitting till connection
		if ((newsockfd = accept(sockfd, NULL, NULL)) == -1)
		{
			perror("accept call failed");
			continue;
		}
	
		/* spawn a child to deal with the connection */
		if (fork() == 0)
		{
			// Client connections get 10 seconds before expiry
			alarm(10);
			while (recv(newsockfd, &c, 1, 0) > 0)
			{
				c = toupper(c);
				send(newsockfd, &c, 1, 0);
				
				// When passing data client connection gets more time
				alarm(10);
			}
		
			/* when client is no longer sending information the socked
			can be closed and the child process terminated */
			close(newsockfd);
			exit(0);
		}
		//added in
		else
		{
			// 15 second time added to parent once connection made
			alarm(15);
		}
		
		/* parent doesn't need the newsockfd */
		close(newsockfd);	
	}
	
}

void catcher (int sig)
{
	close (newsockfd);
	exit(0);
}