Advertisement
Guest User

Peter

a guest
Jan 31st, 2015
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.34 KB | None | 0 0
  1. #include <sys/uio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <arpa/inet.h>
  5. #include <stdio.h>
  6. #include <netinet/in.h>
  7. #include <unistd.h>
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. #include <sys/time.h>
  11. #include <fcntl.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <errno.h>
  15. #include <bool.h>
  16. //#include <cam_udp.h>
  17. typedef union uns_short_int {
  18.     unsigned short int us;
  19.     unsigned char ch[2];
  20. } uns_short_int;
  21. int main()
  22. {
  23.     struct timeval tv1, tv2;
  24.     unsigned long long int nt1;
  25.     uns_short_int usi;
  26.     socklen_t lenf;
  27.     int i, j, m1, n, ncyc, nfdc, nj, nfds, nfd, nr, len, lencp, lenj;
  28.     bool b;
  29.     char buf[192];
  30.     unsigned char bufr[1024];
  31.     unsigned short int uvp = 50616, ucp = 50700;    //ucp=COMMAND_PORT;
  32.     unsigned int usc = 62;
  33.     struct sockaddr_in addrcs, addrcc, addrvs;
  34.     FILE *fin, *fout;
  35. llen:// метки лучше делать без отступа, ибо прыгнуть на них можно откуда угодно
  36.         len = sizeof(struct sockaddr_in);
  37.         if (len == 0)   goto llen;// ВНЕЗАПНО
  38.     fin = fopen("imit_cam_cyc.in", "r");
  39.     if (fin != NULL)
  40.     {// тут нужна функция, которая грузит структуру из file stream
  41.         // и эти переменные тоже надо в структуру обернуть
  42.         n = fscanf(fin, "%hu%[^\n]", &uvp, buf);
  43.         n = fscanf(fin, "%u%[^\n]", &usc, buf);
  44.         n = fscanf(fin, "%d%[^\n]", &ncyc, buf);
  45.         n = fscanf(fin, "%s%[^\n]", buf, buf + 20);
  46.         fclose(fin);
  47.     }
  48.     else
  49.     {// а вот здесь нужна инициализация uvp, usc и ncyc
  50.         strcpy(buf, "127.0.0.1");
  51.         ncyc = 0;
  52.     }
  53.     usi.us = 0;
  54.     b = true;// откуда в сишке bool?
  55.     usc *= 1000;
  56.     fout = fopen("imit_cam_cyc.out", "w");
  57.     lencp = 32;            //lencp=sizeof(CONTROL_PACKET);
  58.     fprintf(fout, "input: %d %d  %u %hu %d\n", len, lencp, usc, uvp, ncyc);
  59.     fflush(fout);
  60.     bzero((void *) &addrcs, len);// 20 лет пишу на C, впервые вижу эту функцию. memset(3) чем не угодила?
  61.     bzero((void *) &addrcc, len);// и да, каст в (void*) лишний.
  62.     bzero((void *) &addrvs, len);// да и вообще тут надо поля задавать, потому что в общем случа NULL не равен 0.
  63.     // и тоже внутри специальной функции, например void clear(struct sockaddr_in*){}
  64.     addrcs.sin_addr.s_addr = INADDR_ANY;
  65.     addrcs.sin_family = AF_INET;
  66.     addrcs.sin_port = htons(ucp);
  67.     nfdc = socket(AF_INET, SOCK_DGRAM, 0);
  68.     n = bind(nfdc, (struct sockaddr *) &addrcs, len);// тут-то каст на кой ляд?!
  69.     if (n < 0)
  70.     {
  71.         strcpy(buf, strerror(errno));
  72.         fprintf(fout, "bind: %d %s\n", errno, buf);
  73.         // а где abort(3) ?!
  74.     }
  75.  
  76.     while (b)
  77.     {
  78.         n = recvfrom(nfdc, bufr, lencp, MSG_WAITALL,// у вас n это универсальная переменная, да? Ну дык назовите её exit_status
  79.                  (struct sockaddr *) &addrcc, &lenf);// опять каст
  80.         if (n < 0)
  81.         {
  82.             strcpy(buf, strerror(errno));
  83.             fprintf(fout, "recvrom: %d %s\n", errno, buf);
  84.             fflush(fout);
  85.             return 0;// тут надо n вернуть, а не ноль
  86.         }
  87.         if (n == lencp)
  88.         {// О! ВНЕЗАПНО n это не exit_status, а какая-то длинна хрен знает чего
  89.             fprintf(fout, "request: %d %d\n", n, nfdc);
  90.             fflush(fout);
  91.             n = sendto(nfdc, bufr, lencp, MSG_DONTROUTE,
  92.                (struct sockaddr *) &addrcc, len);// не тяжело каст выписывать?
  93.             fprintf(fout, "answer: %d\n", n);// почему не в stdout?
  94.             fflush(fout);// сложно было сделать функцию? Ну вы, я погляжу, не ленитесь
  95.             if (n != lencp)
  96.             {
  97.                 strcpy(buf, strerror(errno));
  98.                 fprintf(fout, "sendto: %d %s\n", errno, buf);
  99.                 fflush(fout);
  100.                 return 0;
  101.             }
  102.             b = 0;// кто там кричал про "простоту кода" и "лишние проверки"? Здесь нужно break написать!
  103.             // и while(1) в начале, если вы хотите такой цикл сделать,
  104.             // тогда сразу будет понятно, что это бесконечный цикл с выходом откуда-то из середины
  105.             // а у вас весь мозг поломаешь, пока поймёшь сокральный смысл «b»
  106.             // если уж так хочется сделать ТАКОЙ цикл, то делайте так:
  107.             // for(b=true; b;)
  108.             // тут хотя-бы понятно, что к чему.
  109.         }
  110.     }
  111.     addrvs = addrcc;
  112.     addrvs.sin_port = htons(uvp);
  113.     nfds = socket(AF_INET, SOCK_DGRAM, 0);
  114.     strcpy(buf + 20, "/home/operator1/work/jpg300/jpg_udp_000");
  115.     nj = 20 + strlen(buf + 20);
  116.  
  117.     while (1)
  118.     {
  119.         for (j = 0; j < ncyc; j++)
  120.         {
  121.             sprintf(buf + nj - 3, "%03d", j);
  122.             nfd = open(buf + 20, O_RDONLY);
  123.             if (nfd < 0)
  124.             {
  125.                 strcpy(buf, strerror(errno));
  126.                 fprintf(fout, "open: %d %s\n", errno, buf);
  127.                 fflush(fout);
  128.                 return 0;
  129.             }
  130.             lenj = lseek(nfd, 0, SEEK_END);
  131.             n = lseek(nfd, 0, SEEK_SET);
  132.             nr = lenj / 1024;
  133.             if (nr * 1024 != lenj)
  134.             {
  135.                 fprintf(fout, "lenj: %d %d %s\n", j, lenj, buf + 20);
  136.                 fflush(fout);
  137.             }
  138.             gettimeofday(&tv1, NULL);
  139.             for (i = 0; i < nr; i++)
  140.             {
  141.                 n = read(nfd, bufr, 1024);
  142.                 bufr[2] = usi.ch[1];
  143.                 bufr[3] = usi.ch[0];
  144.                 n = sendto(nfds, bufr, 1024, MSG_DONTROUTE,
  145.                    (struct sockaddr *) &addrvs, len);
  146.                 if (n < 0)
  147.                 {
  148.                     strcpy(buf, strerror(errno));
  149.                     fprintf(fout, "sendto: %d %d %s\n", i, errno, buf);
  150.                     fflush(fout);
  151.                     // abort(3) опять забыли
  152.                 }
  153.                 usi.us++;// это нужно было в заголовке цикла сделать:
  154.                 // for (i = 0; i < nr; i++, usi.us++)
  155.             }
  156.             close(nfd);
  157.             gettimeofday(&tv2, NULL);
  158.             nt1 =
  159.                 (tv2.tv_sec - tv1.tv_sec) * 1000000 + tv2.tv_usec - tv1.tv_usec;
  160.             m1 = nt1;
  161.             n = usleep(usc - m1);
  162.             if (n < 0)
  163.             {
  164.                 strcpy(buf, strerror(errno));
  165.                 fprintf(fout, "usleep: %d %d %s\n", i, errno, buf);
  166.                 fflush(fout);
  167.                 // abort?
  168.             }
  169.         }
  170.     }// к чему эта скобка? (я читер, у меня VIM знает чит-код «%»)
  171.     fclose(fout);// по уму надо выше в куче мест это сделать
  172.     return 0;
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement