Mercurial > public > hey
annotate src/main.c @ 6:e5e61ce70989
print server ip and listening port to console
author | Dennis <dennisconcepcionmartin@gmail.com> |
---|---|
date | Tue, 18 Jul 2023 18:11:26 +0100 |
parents | 45bac89a4da3 |
children | fd1be990f66f |
rev | line source |
---|---|
5
45bac89a4da3
fix 'address already in use' before bind()
Dennis <dennisconcepcionmartin@gmail.com>
parents:
4
diff
changeset
|
1 #include <asm-generic/socket.h> |
2
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
2 #include <signal.h> |
0 | 3 #include <stdio.h> |
1
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
4 #include <stdlib.h> |
4
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
5 #include <unistd.h> |
1
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
6 #include <string.h> |
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
7 #include <sys/types.h> |
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
8 #include <sys/socket.h> |
4
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
9 #include <netdb.h> |
1
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
10 #include <netinet/in.h> |
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
11 #include <arpa/inet.h> |
2
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
12 #include <time.h> |
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
13 |
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
14 |
6
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
15 int listenfd; |
2
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
16 |
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
17 void sig_handler(int sig_num) { |
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
18 if (sig_num == 2) { |
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
19 printf("\nClosing socket\n"); |
6
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
20 close(listenfd); |
2
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
21 exit(0); |
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
22 } |
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
23 } |
1
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
24 |
6
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
25 // Get IPv4 or IPv6 |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
26 struct IpPort { |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
27 char ipstr[INET6_ADDRSTRLEN]; |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
28 unsigned short port; |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
29 }; |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
30 |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
31 struct IpPort get_ipport(struct sockaddr *sa) { |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
32 struct IpPort ipport; |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
33 |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
34 if (sa->sa_family == AF_INET) { |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
35 struct sockaddr_in *ipv4 = (struct sockaddr_in *)sa; |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
36 inet_ntop(AF_INET, &(ipv4->sin_addr), ipport.ipstr, sizeof(ipport.ipstr)); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
37 ipport.port = ntohs(ipv4->sin_port); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
38 } else { |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
39 struct sockaddr_in *ipv6 = (struct sockaddr_in *)sa; |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
40 inet_ntop(AF_INET, &(ipv6->sin_addr), ipport.ipstr, sizeof(ipport.ipstr)); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
41 ipport.port = ntohs(ipv6->sin_port); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
42 } |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
43 |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
44 return ipport; |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
45 } |
0 | 46 |
47 int main() { | |
2
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
48 signal(SIGINT, sig_handler); |
4
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
49 |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
50 struct addrinfo hints; |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
51 struct addrinfo *servinfo; |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
52 |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
53 memset(&hints, 0, sizeof hints); // Make sure the struct is empty |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
54 hints.ai_family = AF_UNSPEC; // Don't care IPv4 or IPv6 |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
55 hints.ai_socktype = SOCK_STREAM; // TCP stream sockets |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
56 hints.ai_flags = AI_PASSIVE; // Fill in my IP for me |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
57 |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
58 if ((getaddrinfo(NULL, "5050", &hints, &servinfo)) != 0) { |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
59 perror("getaddrinfo: "); |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
60 exit(1); |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
61 } |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
62 |
6
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
63 listenfd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
64 if (listenfd == -1) { |
2
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
65 perror("socket: "); |
1
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
66 exit(1); |
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
67 } |
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
68 |
6
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
69 // Avoid "Address already in use" |
5
45bac89a4da3
fix 'address already in use' before bind()
Dennis <dennisconcepcionmartin@gmail.com>
parents:
4
diff
changeset
|
70 int yes = 1; |
6
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
71 if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) { |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
72 perror("setsockopt: \n"); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
73 } |
5
45bac89a4da3
fix 'address already in use' before bind()
Dennis <dennisconcepcionmartin@gmail.com>
parents:
4
diff
changeset
|
74 |
6
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
75 if (bind(listenfd, servinfo->ai_addr, servinfo->ai_addrlen) == -1) { |
2
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
76 perror("bind: "); |
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
77 exit(1); |
1
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
78 } |
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
79 |
4
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
80 freeaddrinfo(servinfo); |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
81 |
6
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
82 if (listen(listenfd, 10) == -1) { |
2
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
83 perror("listen: "); |
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
84 exit(1); |
1
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
85 } |
6
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
86 |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
87 struct IpPort ipport = get_ipport(servinfo->ai_addr); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
88 printf("Server IP: %s\n", ipport.ipstr); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
89 printf("Listening on port: %u\n", ipport.port); |
1
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
90 |
4
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
91 char send_buffer[100]; |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
92 struct sockaddr_storage clientinfo; |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
93 socklen_t clientinfo_size; |
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
94 |
2
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
95 printf("Waiting for connections...\n"); |
1
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
96 |
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
97 while (1) { |
6
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
98 int connfd = accept(listenfd, (struct sockaddr *)&clientinfo, &clientinfo_size); |
2
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
99 if (connfd == -1) { |
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
100 perror("accept: \n"); |
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
101 exit(1); |
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
102 } |
052cf5cf100a
handle server shutdown and print server time
Dennis <dennisconcepcionmartin@gmail.com>
parents:
1
diff
changeset
|
103 |
6
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
104 int pid = fork(); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
105 if (pid == 0) { |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
106 // This is child |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
107 close(listenfd); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
108 time_t now = time(NULL); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
109 snprintf(send_buffer, sizeof(send_buffer), "Server time: %s\n", ctime(&now)); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
110 |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
111 if (send(connfd, send_buffer, sizeof(send_buffer), 0) == -1) { |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
112 perror("send: \n"); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
113 } |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
114 |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
115 close(connfd); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
116 exit(0); |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
117 } |
e5e61ce70989
print server ip and listening port to console
Dennis <dennisconcepcionmartin@gmail.com>
parents:
5
diff
changeset
|
118 |
4
691358f944e8
remove hardcoded host info
Dennis <dennisconcepcionmartin@gmail.com>
parents:
2
diff
changeset
|
119 close(connfd); |
1
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
120 } |
58952f1fb8da
minimal socket example
Dennis <dennisconcepcionmartin@gmail.com>
parents:
0
diff
changeset
|
121 |
0 | 122 return 0; |
123 } |