Skip to content

Instantly share code, notes, and snippets.

@SergiyOsadchyy
Last active February 14, 2017 05:11
Show Gist options
  • Save SergiyOsadchyy/cf77c25572e8a6bbc099c7c2b4eae517 to your computer and use it in GitHub Desktop.
Save SergiyOsadchyy/cf77c25572e8a6bbc099c7c2b4eae517 to your computer and use it in GitHub Desktop.
Linux_Lab_43
// Linux_Lab_43
//
// Created by Sergiy on 12.02.17.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <signal.h>
void my_signal_handler(int mySignal);
int main(int argc, const char * argv[])
{
struct sockaddr_in server_adr;
struct sockaddr_in client_adr;
socklen_t sin_len = sizeof(client_adr);
int fileDescriptor_server;
int fileDescriptor_client;
char buf[2048];
int on = 1;
int fileDescriptor_writer;
char buf_time[32];
struct tm *mytm;
time_t myTime;
char buf_time_writer[32];
struct tm *mytm_writer;
time_t myTime_writer;
char newLine[1] = "\n";
fileDescriptor_server = socket(AF_INET, SOCK_STREAM, 0);
if (fileDescriptor_server < 0)
{
perror("socket");
exit(1);
}
setsockopt(fileDescriptor_server, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(int));
server_adr.sin_family = AF_INET;
server_adr.sin_addr.s_addr = INADDR_ANY;
server_adr.sin_port = htons(8080);
if(bind(fileDescriptor_server, (struct sockaddr *)&server_adr, sizeof(server_adr)) == -1)
{
perror("bind");
close(fileDescriptor_server);
exit(1);
}
if (listen(fileDescriptor_server, 10) == -1)
{
perror("listen");
close(fileDescriptor_server);
exit(1);
}
while (1)
{
fileDescriptor_client = accept(fileDescriptor_server, (struct sockaddr *)&client_adr, &sin_len);
if (fileDescriptor_client == -1)
{
perror("Connection failed...\n");
continue;
}
printf("\nGot client connection...\n");
//-------
// Get info for webpage text -START-
char *client_IP = inet_ntoa(client_adr.sin_addr);
int client_port = (int) ntohs(client_adr.sin_port);
myTime = time(NULL);
mytm = localtime(&myTime);
memset(buf_time, 0, sizeof(buf_time));
strftime(buf_time, sizeof(buf_time)-1, "%Y-%m-%d %H:%M:%S", mytm);
// Get info for webpage text -END-
//-------
// Fill webpage -START-
char webpageStart[] =
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/html; charset=UTF-8\r\n\r\n"
"<!DOCTYPE html>\r\n"
"<html><head><title>Linux_Lab_43</title>\r\n"
"<style>body { background-color: #FFFF00 }</style></head>"
"<body><center><h1>";
char webpageText[3000];
memset(webpageText, 0, sizeof(webpageText));
snprintf(webpageText, sizeof(webpageText), "IP: %s Port: %d Date&time: %s", client_IP, client_port, buf_time);
char webpageEnd[] =
"</h1><br>\r\n"
"</center></body></html>\r\n";
char webpage[3000];
memset(webpage, 0, sizeof(webpage));
snprintf(webpage, sizeof(webpage), "%s%s%s", webpageStart, webpageText, webpageEnd);
// Fill webpage -END-
//-------
// Open file for writing and write time -START-
fileDescriptor_writer = open("/Users/Sergiy/lab43_Writer.txt", O_CREAT | O_WRONLY, 0600);
if (fileDescriptor_writer == -1)
{
printf("Failed to create and open the file.\n");
exit(1);
}
myTime_writer = time(NULL);
mytm_writer = localtime(&myTime_writer);
memset(buf_time_writer, 0, sizeof(buf_time_writer));
strftime(buf_time_writer, sizeof(buf_time_writer)-1, "%Y-%m-%d %H:%M:%S", mytm_writer);
char text_writer_Start[3000];
memset(text_writer_Start, 0, sizeof(text_writer_Start));
snprintf(text_writer_Start, sizeof(text_writer_Start), "Start writing at %s\n", buf_time_writer);
write(fileDescriptor_writer, text_writer_Start, sizeof(text_writer_Start));
// Open file for writing and write time -END-
//---------
if(!fork())
{
/* child proccess */
close(fileDescriptor_server);
memset(buf, 0, 2048);
read(fileDescriptor_client, buf, 2047);
printf("The value of buf is: %s", buf);
//---
// write into writer
int fileDescriptor_writer_2 = open("/Users/Sergiy/lab43_Writer.txt", O_WRONLY | O_APPEND, 0600);
write(fileDescriptor_writer_2, newLine, sizeof(newLine));
write(fileDescriptor_writer_2, webpageText, sizeof(webpageText)-1);
//---
write(fileDescriptor_client, webpage, sizeof(webpage)-1);
close(fileDescriptor_client);
printf("closing client...\n");
exit(0);
}
/* parent proccess */
signal(SIGTERM, my_signal_handler);
close(fileDescriptor_client);
close(fileDescriptor_writer);
}
return 0;
}
void my_signal_handler(int mySignal)
{
printf("\nThere was signal SIGTERM...\n");
int fileDescriptor_writer = open("/Users/Sergiy/lab43_Writer.txt", O_WRONLY | O_APPEND, 0600);
if (fileDescriptor_writer == -1)
{
printf("Failed to create and open the file.\n");
exit(1);
}
char buf_time_writer_end[32];
struct tm *mytm_writer_end;
time_t myTime_writer_end;
myTime_writer_end = time(NULL);
mytm_writer_end = localtime(&myTime_writer_end);
memset(buf_time_writer_end, 0, sizeof(buf_time_writer_end));
strftime(buf_time_writer_end, sizeof(buf_time_writer_end)-1, "%Y-%m-%d %H:%M:%S", mytm_writer_end);
char text_writer_End[3000];
memset(text_writer_End, 0, sizeof(text_writer_End));
snprintf(text_writer_End, sizeof(text_writer_End), "\nFinish writing at %s\n", buf_time_writer_end);
write(fileDescriptor_writer, text_writer_End, sizeof(text_writer_End));
close(fileDescriptor_writer);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment