-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebserver.c
130 lines (105 loc) · 3.22 KB
/
webserver.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Author: Md Sadikul Amin Sadman
// Github: SdAm1n
// Basic Webserver in C programming language
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#define PORT 8080
#define BUFFER_SIZE 1024
// signal handler for CTRL-C
void signal_handler(int sig)
{
printf("\nCTRL-C pressed, Exiting Server...\n");
exit(sig);
}
int main()
{
char buffer[BUFFER_SIZE];
// hardcoding the response
char resp[] = "HTTP/1.0 200 OK\r\n"
"Server: webserver-c\r\n"
"Content-type: text/html\r\n\r\n"
"<html>Welcome to this world!</html>\r\n";
// Create a socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
perror("Socket Creation Failed");
return 1;
}
printf("Socket Created...\n");
// Create an address to bind the socket to that address
struct sockaddr_in host_addr;
int host_addrlen = sizeof(host_addr);
// set the address
host_addr.sin_family = AF_INET;
host_addr.sin_port = htons(PORT);
host_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// get client address
struct sockaddr_in client_addr;
int client_addrlen = sizeof(client_addr);
// Bind Socket to the address
if (bind(sockfd, (struct sockaddr *)&host_addr, host_addrlen) != 0)
{
perror("Socket Binding Failed");
return 1;
}
printf("Socket binded...\n");
// Listen for incoming connections
if (listen(sockfd, SOMAXCONN) != 0)
{
perror("Listen Failed");
return 1;
}
printf("Server listening...\n");
// register signal handler for CTRL-C
signal(SIGINT, signal_handler);
// For Accepting incoming connections
// loop to continue accepting connections
while (1)
{
// accept incoming connection
int newsockfd = accept(sockfd, (struct sockaddr *)&host_addr, (socklen_t *)&host_addrlen);
if (newsockfd < 0)
{
perror("Server Accept Failed");
continue;
}
printf("Server accepted the client...\n");
// Get client address
int sockn = getsockname(newsockfd, (struct sockaddr *)&client_addr, (socklen_t *)&client_addrlen);
if (sockn < 0)
{
perror("Server getsockname Failed");
continue;
}
// read from the socket
int valread = read(newsockfd, buffer, BUFFER_SIZE);
if (valread < 0)
{
perror("Server read Failed");
continue;
}
char method[BUFFER_SIZE], uri[BUFFER_SIZE], version[BUFFER_SIZE];
// print the full request
printf("Printing Client Request...\n");
printf("%s\n", buffer);
// parse the request
sscanf(buffer, "%s %s %s", method, uri, version);
printf("[%s:%u] %s %s %s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), method, version, uri);
// write to the socket
int valwrite = write(newsockfd, resp, strlen(resp));
if (valwrite < 0)
{
perror("Server write Failed");
continue;
}
close(newsockfd);
}
return 0;
}