5 #include <sys/socket.h>
6 #include <netinet/in.h>
18 int ac_sockfd[AC_NUM];
21 unsigned received, last_received;
29 for (i = 0 ; i < AC_NUM; i++)
30 close(ac_sockfd[AC_NUM]);
35 int create_ac_socket(unsigned int ac)
37 struct sockaddr_in my_addr;
39 unsigned int yes=1, tos;
42 if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
44 perror("Socket nelze otevrit");
48 if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
49 perror("Chyba v nastaveni soketu");
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);
59 if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)) == -1) {
60 perror("Chyba v bind");
65 //tos = ((AC_NUM - ac) *2 - 1)*32;
67 if (setsockopt(sockfd, SOL_IP, IP_TOS, &tos, sizeof(tos))) {
68 perror("Unable to set TOS");
76 void* qhandler(void* queue)
79 struct sockaddr_in rem_addr;
81 unsigned int ac, rem_addr_length;
84 printf("AC= %d\n",ac);
85 rem_addr_length=sizeof(rem_addr);
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");
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");
114 int main(int argc, char *argv[])
120 pthread_attr_init(&attr);
122 if (signal(SIGTERM, stopper) == SIG_ERR) {
123 perror("Signal handler registration error");
127 if (signal(SIGINT, stopper) == SIG_ERR) {
128 perror("Signal handler registration error");
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);
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);