Question: Hello everybody, Can somebody help me convert the following program to a daemon (to run in background) ? Thank you #include #include #include #include #include

Hello everybody,

Can somebody help me convert the following program to a daemon (to run in background) ? Thank you

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int host_port = 8080;

void usage()

{

printf("myhttpd, a simple webserver ");

printf("ver 1.0, 2014 ");

printf("Usage Summary: myhttpd -h -p portno -d ");

printf(" -h: display the summary ");

printf(" -p: change default port number for example: -p 8080 ");

}

void* httpHandler(void* socket)

{

char buffer[1024];

int buffer_len = 1024;

int bytecount;

int sock = *(int*)socket;

FILE* fp = fopen("Log.txt", "a");

time_t t = time(0);

struct tm * now = localtime( & t );

memset(buffer, 0, buffer_len);

if ((bytecount = recv(sock, buffer, buffer_len, 0))== -1)

{

fprintf(fp, "Error receiving data %d ", errno);

return 0;

}

fprintf(fp,"[REQUEST] Received at %d-%d-%d ", (now->tm_mon +1), (now->tm_mday), (now->tm_year + 1900));

fprintf(fp,"Received bytes %d Received string \"%s\" ", bytecount, buffer);

strcpy(buffer, "HTTP/1.1 200 OK Server: demo Content-Length: 37 Connection: close Content-Type: html Welcome to my first page!");

if ((bytecount = send(sock, buffer, strlen(buffer), 0))== -1)

{

fprintf(fp,"Error sending data %d ", errno);

return 0;

}

fprintf(fp,"Sent bytes %d ", bytecount);

//Close socket

close(sock);

//Clean-up logging

fflush(fp);

fclose(fp);

return 0;

}

int main(int argc, char *argv[])

{

struct sockaddr_in my_addr;

pid_t pid = 0;

pid_t sid = 0;

// Create child process

pid = fork();

if (pid < 0)

{

puts("[ERROR] Forking Failed! Exiting...");

exit(1);

}

// PARENT PROCESS. Need to kill it.

if (pid > 0)

{

printf("[SUCCESS] Process ID of child process is %d. Exiting main process. ", pid);

// return success in exit status

exit(0);

}

//set new session

sid = setsid();

if(sid < 0)

{

exit(1);

}

//No longer have a terminal, need to close these pipes

close(STDIN_FILENO);

close(STDOUT_FILENO);

close(STDERR_FILENO);

//Log for debuggin

FILE* fp = fopen ("Log.txt", "a");

fprintf(fp, " [DEBUG] *** SERVER STARTED *** [DEBUG] Logging Enabled. ");

fflush(fp);

fclose(fp);

int hsock;

int * p_int ;

int err;

int socketfd;

socklen_t addr_size = 0;

int* csock;

sockaddr_in sadr;

pthread_t thread_id=0;

int opt = 0;

opt = getopt( argc, argv,"dhl:p:r:t:n:s:" );

while (opt != -1)

{

switch (opt)

{

case 'h':

usage();

exit(0);

case 'p':

host_port = atoi(optarg);

break;

case 'r':

break;

}

opt = getopt( argc, argv, "dhl:p:r:t:n:s:" );

}

hsock = socket(AF_INET, SOCK_STREAM, 0);

if (hsock == -1)

{

printf("Error initializing socket %d ", errno);

exit(-1);

}

p_int = (int*)malloc(sizeof(int));

*p_int = 1;

if ((setsockopt(hsock, SOL_SOCKET, SO_REUSEADDR, (char*)p_int, sizeof(int)) == -1 )||

(setsockopt(hsock, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int, sizeof(int)) == -1 ) )

{

printf("Error setting options %d ", errno);

free(p_int);

exit(-1);

}

free(p_int);

my_addr.sin_family = AF_INET ;

my_addr.sin_port = htons(host_port);

memset(&(my_addr.sin_zero), 0, 8);

my_addr.sin_addr.s_addr = INADDR_ANY ;

if (bind(hsock, (sockaddr*)&my_addr, sizeof(my_addr)) == -1 )

{

fprintf(stderr,"Error binding to socket, make sure nothing else is listening on this port %d ",errno);

exit(-1);

}

if (listen(hsock, 10) == -1 )

{

fprintf(stderr, "Error listening %d ",errno);

exit(-1);

}

//Now lets do the server stuff

printf("myhttpd server listening on port %d ", host_port);

addr_size = sizeof(sockaddr_in);

pthread_t tid;

while (true)

{

printf("waiting for a connection ");

if ((socketfd = accept( hsock, (sockaddr*)&sadr, &addr_size))!= -1)

{

printf("Received connection from %s - %d ",inet_ntoa(sadr.sin_addr), socketfd);

//httpHandler(socketfd);

//This code is for threading

int error = pthread_create(&tid, NULL, httpHandler, (void*) &socketfd);

//Debug code for development

if(error)

puts("ERROR: Problem creating thread.");

else

puts("SUCCESS: Thread created");

}

else

{

fprintf(stderr, "Error accepting %d ", errno);

}

}

close(socketfd);

}

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!