Last active
February 14, 2017 05:11
-
-
Save SergiyOsadchyy/cf77c25572e8a6bbc099c7c2b4eae517 to your computer and use it in GitHub Desktop.
Linux_Lab_43
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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