Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/uio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <stdio.h>
- #include <netinet/in.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/time.h>
- #include <fcntl.h>
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
- #include <bool.h>
- //#include <cam_udp.h>
- typedef union uns_short_int {
- unsigned short int us;
- unsigned char ch[2];
- } uns_short_int;
- int main()
- {
- struct timeval tv1, tv2;
- unsigned long long int nt1;
- uns_short_int usi;
- socklen_t lenf;
- int i, j, m1, n, ncyc, nfdc, nj, nfds, nfd, nr, len, lencp, lenj;
- bool b;
- char buf[192];
- unsigned char bufr[1024];
- unsigned short int uvp = 50616, ucp = 50700; //ucp=COMMAND_PORT;
- unsigned int usc = 62;
- struct sockaddr_in addrcs, addrcc, addrvs;
- FILE *fin, *fout;
- llen:// метки лучше делать без отступа, ибо прыгнуть на них можно откуда угодно
- len = sizeof(struct sockaddr_in);
- if (len == 0) goto llen;// ВНЕЗАПНО
- fin = fopen("imit_cam_cyc.in", "r");
- if (fin != NULL)
- {// тут нужна функция, которая грузит структуру из file stream
- // и эти переменные тоже надо в структуру обернуть
- n = fscanf(fin, "%hu%[^\n]", &uvp, buf);
- n = fscanf(fin, "%u%[^\n]", &usc, buf);
- n = fscanf(fin, "%d%[^\n]", &ncyc, buf);
- n = fscanf(fin, "%s%[^\n]", buf, buf + 20);
- fclose(fin);
- }
- else
- {// а вот здесь нужна инициализация uvp, usc и ncyc
- strcpy(buf, "127.0.0.1");
- ncyc = 0;
- }
- usi.us = 0;
- b = true;// откуда в сишке bool?
- usc *= 1000;
- fout = fopen("imit_cam_cyc.out", "w");
- lencp = 32; //lencp=sizeof(CONTROL_PACKET);
- fprintf(fout, "input: %d %d %u %hu %d\n", len, lencp, usc, uvp, ncyc);
- fflush(fout);
- bzero((void *) &addrcs, len);// 20 лет пишу на C, впервые вижу эту функцию. memset(3) чем не угодила?
- bzero((void *) &addrcc, len);// и да, каст в (void*) лишний.
- bzero((void *) &addrvs, len);// да и вообще тут надо поля задавать, потому что в общем случа NULL не равен 0.
- // и тоже внутри специальной функции, например void clear(struct sockaddr_in*){}
- addrcs.sin_addr.s_addr = INADDR_ANY;
- addrcs.sin_family = AF_INET;
- addrcs.sin_port = htons(ucp);
- nfdc = socket(AF_INET, SOCK_DGRAM, 0);
- n = bind(nfdc, (struct sockaddr *) &addrcs, len);// тут-то каст на кой ляд?!
- if (n < 0)
- {
- strcpy(buf, strerror(errno));
- fprintf(fout, "bind: %d %s\n", errno, buf);
- // а где abort(3) ?!
- }
- while (b)
- {
- n = recvfrom(nfdc, bufr, lencp, MSG_WAITALL,// у вас n это универсальная переменная, да? Ну дык назовите её exit_status
- (struct sockaddr *) &addrcc, &lenf);// опять каст
- if (n < 0)
- {
- strcpy(buf, strerror(errno));
- fprintf(fout, "recvrom: %d %s\n", errno, buf);
- fflush(fout);
- return 0;// тут надо n вернуть, а не ноль
- }
- if (n == lencp)
- {// О! ВНЕЗАПНО n это не exit_status, а какая-то длинна хрен знает чего
- fprintf(fout, "request: %d %d\n", n, nfdc);
- fflush(fout);
- n = sendto(nfdc, bufr, lencp, MSG_DONTROUTE,
- (struct sockaddr *) &addrcc, len);// не тяжело каст выписывать?
- fprintf(fout, "answer: %d\n", n);// почему не в stdout?
- fflush(fout);// сложно было сделать функцию? Ну вы, я погляжу, не ленитесь
- if (n != lencp)
- {
- strcpy(buf, strerror(errno));
- fprintf(fout, "sendto: %d %s\n", errno, buf);
- fflush(fout);
- return 0;
- }
- b = 0;// кто там кричал про "простоту кода" и "лишние проверки"? Здесь нужно break написать!
- // и while(1) в начале, если вы хотите такой цикл сделать,
- // тогда сразу будет понятно, что это бесконечный цикл с выходом откуда-то из середины
- // а у вас весь мозг поломаешь, пока поймёшь сокральный смысл «b»
- // если уж так хочется сделать ТАКОЙ цикл, то делайте так:
- // for(b=true; b;)
- // тут хотя-бы понятно, что к чему.
- }
- }
- addrvs = addrcc;
- addrvs.sin_port = htons(uvp);
- nfds = socket(AF_INET, SOCK_DGRAM, 0);
- strcpy(buf + 20, "/home/operator1/work/jpg300/jpg_udp_000");
- nj = 20 + strlen(buf + 20);
- while (1)
- {
- for (j = 0; j < ncyc; j++)
- {
- sprintf(buf + nj - 3, "%03d", j);
- nfd = open(buf + 20, O_RDONLY);
- if (nfd < 0)
- {
- strcpy(buf, strerror(errno));
- fprintf(fout, "open: %d %s\n", errno, buf);
- fflush(fout);
- return 0;
- }
- lenj = lseek(nfd, 0, SEEK_END);
- n = lseek(nfd, 0, SEEK_SET);
- nr = lenj / 1024;
- if (nr * 1024 != lenj)
- {
- fprintf(fout, "lenj: %d %d %s\n", j, lenj, buf + 20);
- fflush(fout);
- }
- gettimeofday(&tv1, NULL);
- for (i = 0; i < nr; i++)
- {
- n = read(nfd, bufr, 1024);
- bufr[2] = usi.ch[1];
- bufr[3] = usi.ch[0];
- n = sendto(nfds, bufr, 1024, MSG_DONTROUTE,
- (struct sockaddr *) &addrvs, len);
- if (n < 0)
- {
- strcpy(buf, strerror(errno));
- fprintf(fout, "sendto: %d %d %s\n", i, errno, buf);
- fflush(fout);
- // abort(3) опять забыли
- }
- usi.us++;// это нужно было в заголовке цикла сделать:
- // for (i = 0; i < nr; i++, usi.us++)
- }
- close(nfd);
- gettimeofday(&tv2, NULL);
- nt1 =
- (tv2.tv_sec - tv1.tv_sec) * 1000000 + tv2.tv_usec - tv1.tv_usec;
- m1 = nt1;
- n = usleep(usc - m1);
- if (n < 0)
- {
- strcpy(buf, strerror(errno));
- fprintf(fout, "usleep: %d %d %s\n", i, errno, buf);
- fflush(fout);
- // abort?
- }
- }
- }// к чему эта скобка? (я читер, у меня VIM знает чит-код «%»)
- fclose(fout);// по уму надо выше в куче мест это сделать
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement