summaryrefslogtreecommitdiffstats
path: root/iv/orodja/ldmitm/tcp_times_example.c
diff options
context:
space:
mode:
Diffstat (limited to 'iv/orodja/ldmitm/tcp_times_example.c')
-rw-r--r--iv/orodja/ldmitm/tcp_times_example.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/iv/orodja/ldmitm/tcp_times_example.c b/iv/orodja/ldmitm/tcp_times_example.c
new file mode 100644
index 0000000..707bfce
--- /dev/null
+++ b/iv/orodja/ldmitm/tcp_times_example.c
@@ -0,0 +1,80 @@
+/*
+Posluša na TCP vratih 6969, prejme eno povezavo, vsako sekundo nanjo izpiše LF in piše statistiko, dobljeno iz jedrnega modula tcp_times.
+*/
+#include <stdint.h>
+#include "tcp_times.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <signal.h>
+int samomor = 0;
+void handler (int sig __attribute__((unused))) {
+ samomor = 1;
+}
+int main (void) {
+ if (signal(SIGINT, handler) == SIG_ERR) {
+ perror("signal");
+ return 1;
+ }
+ if (signal(SIGHUP, handler) == SIG_ERR) {
+ perror("signal");
+ return 1;
+ }
+ if (signal(SIGTERM, handler) == SIG_ERR) {
+ perror("signal");
+ return 1;
+ }
+ int tcp_socket = socket(AF_INET6, SOCK_STREAM, 0);
+ if (tcp_socket == -1) {
+ perror("socket");
+ return 1;
+ }
+ struct sockaddr_in6 sa6 = {
+ .sin6_family = AF_INET6,
+ .sin6_port = htons(6969),
+ .sin6_addr = IN6ADDR_ANY_INIT,
+ };
+ if (bind(tcp_socket, (struct sockaddr *) &sa6, sizeof sa6) == -1) {
+ perror("bind");
+ return 1;
+ }
+ if (listen(tcp_socket, 1 /* only one client is handled*/) == -1) {
+ perror("listen");
+ goto die;
+ }
+ int flow = accept(tcp_socket, NULL, NULL);
+ if (flow == -1) {
+ perror("accept");
+ goto die;
+ }
+ int tcp_times = open("/proc/tcp_times", O_RDWR);
+ struct tcp_times tt = {
+ .fd = flow,
+ };
+ char buf = '\n';
+ while (true) {
+ if (ioctl(tcp_times, 0, &tt) == -1) {
+ perror("ioctl");
+ break;
+ }
+ printf(TCP_TIMES_PRINTF_FORMAT "\n", TCP_TIMES_PRINTF_VARIABLES(tt.));
+ if (send(flow, &buf, 1, MSG_NOSIGNAL) == -1) {
+ perror("write");
+ break;
+ }
+ if (samomor)
+ break;
+ sleep(1);
+ }
+die:
+ close(tcp_times);
+ close(flow);
+ close(tcp_socket);
+ return 1;
+}