diff options
-rw-r--r-- | main.c | 68 |
1 files changed, 68 insertions, 0 deletions
@@ -0,0 +1,68 @@ | |||
1 | #include <netinet/in.h> | ||
2 | #include <stdio.h> | ||
3 | #include <stdlib.h> | ||
4 | #include <string.h> | ||
5 | #include <sys/socket.h> | ||
6 | #include <unistd.h> | ||
7 | |||
8 | #include <err.h> | ||
9 | #include <errno.h> | ||
10 | |||
11 | #include <pthread.h> | ||
12 | |||
13 | void * next_customer(int new_socket) | ||
14 | { | ||
15 | char *hello = "Hello from server"; | ||
16 | char buffer[1024] = {0}; | ||
17 | int valread = read(new_socket, buffer, 1024); | ||
18 | printf("%s %d\n", buffer, valread); | ||
19 | |||
20 | send(new_socket, hello, strlen(hello), 0); | ||
21 | |||
22 | printf("Hello message sent\n"); | ||
23 | return NULL; | ||
24 | } | ||
25 | |||
26 | void serve(int server_fd) | ||
27 | { | ||
28 | struct sockaddr_in address; | ||
29 | int addrlen = sizeof(address); | ||
30 | warn("waiting for connections on %d", server_fd); | ||
31 | |||
32 | for(int new_socket = 0 | ||
33 | ; 1 ; new_socket=accept(server_fd, (struct sockaddr*) &address, (socklen_t*) &addrlen)) | ||
34 | { | ||
35 | warn("next: %d", new_socket); | ||
36 | // next_customer(new_socket); | ||
37 | pthread_t thread_id; | ||
38 | pthread_create(&thread_id, NULL, next_customer, new_socket); | ||
39 | pthread_join(thread_id, NULL); | ||
40 | } | ||
41 | } | ||
42 | |||
43 | #define PORT 8080 | ||
44 | int main(int argc, char const *argv[]) | ||
45 | { | ||
46 | int server_fd; | ||
47 | int opt = 1; | ||
48 | |||
49 | struct sockaddr_in address; | ||
50 | address.sin_family = AF_INET; | ||
51 | address.sin_addr.s_addr = INADDR_ANY; | ||
52 | address.sin_port = htons(PORT); | ||
53 | |||
54 | 0 == (server_fd = socket(AF_INET, SOCK_STREAM, 0)) | ||
55 | ? err(EXIT_FAILURE, NULL) | ||
56 | : setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)) | ||
57 | ? err(EXIT_FAILURE, "setsockopt failed on socket with fileno %d", server_fd) | ||
58 | : bind(server_fd, (struct sockaddr*) &address, sizeof(address)) | ||
59 | ? err(EXIT_FAILURE, NULL) | ||
60 | : listen(server_fd, 3) | ||
61 | ? err(EXIT_FAILURE, NULL) | ||
62 | : serve(server_fd); | ||
63 | |||
64 | |||
65 | return 0; | ||
66 | } | ||
67 | |||
68 | // vim: shiftwidth=2 tabstop=2 number | ||