]> rtime.felk.cvut.cz Git - frescor/fwp.git/blob - wme_test/wserver.c
Merge branch 'master' of rtime:/var/git/frescor
[frescor/fwp.git] / wme_test / wserver.c
1 #include <stdlib.h>
2 #include <errno.h>
3
4 #include <sys/types.h>
5 #include <sys/socket.h>
6 #include <netinet/in.h>
7
8 #include <signal.h>
9 #include <sys/wait.h>
10 #include <stdio.h>
11 #include <unistd.h>
12 #include <fcntl.h>
13 #include <time.h>
14 #include <string.h>
15 #include <pthread.h>
16 #include "common.h"
17
18 int ac_sockfd[AC_NUM];
19
20 struct receiver {
21         unsigned received, last_received;
22 } receivers[AC_NUM];
23
24
25 void stopper()
26 {
27         int i;
28
29         for (i = 0 ; i < AC_NUM; i++) 
30                 close(ac_sockfd[AC_NUM]);
31
32         exit(0);
33 }
34
35 int create_ac_socket(unsigned int ac) 
36 {
37         struct sockaddr_in my_addr;
38         int sockfd;
39         unsigned int yes=1, tos;
40
41
42         if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
43         {
44                 perror("Socket nelze otevrit");
45                 return -1;
46         }
47         
48         if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
49                 perror("Chyba v nastaveni soketu");
50                 return -1;
51         }
52
53    //   bzero(&my_addr, sizeof(my_addr));
54         memset(&my_addr,0, sizeof(my_addr));
55         my_addr.sin_family = AF_INET;
56         my_addr.sin_addr.s_addr = INADDR_ANY;
57         my_addr.sin_port = htons(BASE_PORT + ac);
58         
59         if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)) == -1) {
60                 perror("Chyba v bind");
61                 close(sockfd);
62                 return -1;
63         }
64         
65         //tos = ((AC_NUM - ac) *2 - 1)*32;
66         tos = ac_to_tos[ac];
67         if (setsockopt(sockfd, SOL_IP, IP_TOS, &tos, sizeof(tos))) {
68                 perror("Unable to set TOS");
69                 close(sockfd);
70                 return -1;
71         }
72
73         return sockfd;
74 }
75
76 void* qhandler(void* queue)
77 {
78         union msg_buff buff;
79         struct  sockaddr_in rem_addr;
80         int     mlen;
81         unsigned int ac, rem_addr_length; 
82         
83         ac = (int) queue;
84         printf("AC= %d\n",ac);
85         rem_addr_length=sizeof(rem_addr);
86
87         block_signals();
88         set_rt_prio(90-ac);
89
90         while (1) {
91                 while ((mlen = recvfrom(ac_sockfd[ac], &buff, sizeof(buff) , 0, \
92                         (struct sockaddr*)&rem_addr, &rem_addr_length)) < 0) {
93                             if (errno == EINTR) continue;
94                             perror("Chyba pri prijimani pozadavku");
95                             return NULL;
96                 }
97
98 #ifdef DEBUG
99                 printf("%d",ac);
100                 fflush(stdout);
101 #endif
102                 receivers[ac].received++;
103                 clock_gettime(CLOCK_MONOTONIC, &buff.msg.sendback_timestamp);
104                 while (sendto(ac_sockfd[ac], &buff, mlen,0 ,(struct sockaddr*)&rem_addr, \
105                         sizeof(rem_addr)) < 0){
106                             if (errno == EINTR) continue;
107                             perror("Chyba pri zapisu");
108                             return NULL;
109                 }
110         }
111 }
112
113
114 int main(int argc, char *argv[])
115 {
116         int ac,rc;
117         pthread_attr_t attr;
118         pthread_t thread;
119
120         pthread_attr_init(&attr);
121
122         if (signal(SIGTERM, stopper) == SIG_ERR) {
123                 perror("Signal handler registration error");
124                 exit(1);
125         }
126                 
127         if (signal(SIGINT, stopper) == SIG_ERR) {
128                 perror("Signal handler registration error");
129                 exit(1);
130         }
131
132         for (ac = 0; ac < AC_NUM; ac++) {
133                 ac_sockfd[ac] = create_ac_socket(ac);
134                 rc = pthread_create(&thread, &attr, qhandler, (void*) ac); 
135
136         }
137         
138         while (1) {
139                 printf("\r");
140                 for (ac = 0; ac < AC_NUM; ac++) {
141                         int delta = receivers[ac].received - receivers[ac].last_received;
142                         receivers[ac].last_received = receivers[ac].received;
143                         fprintf(stderr, "%s %5d %4d/s ", ac_to_text[ac], receivers[ac].received, delta);
144                 }
145                 fflush(stdout);
146                 sleep(1);
147         }
148         printf("\n");
149
150         return 0;
151
152 }