Advertisement
Guest User

Untitled

a guest
Feb 16th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.97 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <string.h>
  7. #include <arpa/inet.h>
  8. #include <fcntl.h>
  9. #include <unistd.h>
  10. #include <ctype.h>
  11. #include <sys/ioctl.h>
  12. #include <sys/poll.h>
  13. #include <sys/time.h>
  14. #include <errno.h>
  15. #include <netdb.h>
  16. #include <time.h>
  17. #include <sys/timerfd.h>
  18.  
  19. void Raporting(char * buf, int raport, int count);
  20. char* CheckingParameters(int argc, char*argv[], int* t, char* adres, long* port);
  21. void nano(float od_czas);
  22. void error(char* fun, int fd);
  23. int CheckingRcv(int rc, int * clCon);
  24. char makeBuffer(int * data_size, char cc, char buf[], char* send_buf );
  25. void GettingTime( int raport);
  26. char Add_to_Buffer(int * data_size, char cc, char buf[], int* il_mat);
  27. int Take_from_Buffer(int * data_size, char buf[], char * send_buf);
  28. void Raport3(int raport, int data_size, int *il_mat, int *il_wydan, int nfds);
  29.  
  30.  
  31.  
  32. // BUFOR
  33.  
  34.  
  35. #define BUFSIZE 200 // rozmiar bufora
  36. #define GIVESIZE 3 // rozmiar bloku do wypelniania
  37. #define SENDSIZE 180 // rozmiar pobieranych danych
  38.  
  39. char buf[BUFSIZE];
  40. char *pIn, *pOut, *pEnd;
  41. char full;
  42.  
  43. void buf_init()
  44. {
  45. pIn = pOut = buf;
  46. pEnd = &buf[BUFSIZE];
  47. full = 0;
  48. }
  49.  
  50. int buf_put(char c)
  51. {
  52. if (pIn == pOut && full)
  53. return 0;
  54.  
  55. *pIn++ = c;
  56.  
  57. if (pIn >= pEnd)
  58. pIn = buf;
  59.  
  60. if (pIn == pOut)
  61. full = 1;
  62.  
  63. return 1;
  64. }
  65.  
  66.  
  67. int buf_get(char *pc)
  68. {
  69. if (pIn == pOut && !full)
  70. return 0;
  71.  
  72. *pc = *pOut++;
  73. *(pOut - 1) = 0;
  74. if (pOut >= pEnd)
  75. pOut = buf;
  76.  
  77. full = 0;
  78. return 1;
  79. }
  80.  
  81. //**************************************************
  82. // LISTA KONSUMENTOW
  83.  
  84. typedef struct
  85. {
  86. int nCurrent;
  87. int nMax;
  88. int nHead; //indeks pierwszego elementu w kolejce;
  89. int nTail; //indeks pierwszej wolnej pozycji na końcu kolejki;
  90. int *pTab;
  91. }Queue;
  92.  
  93.  
  94. int QEmpty(Queue* Q)
  95. {
  96. return !(Q->nCurrent);
  97. }
  98.  
  99. Queue* QCreate(int nSize)
  100. {
  101. Queue* Q = (Queue*)calloc(1, sizeof(Queue));
  102. if (!Q)
  103. {
  104. fprintf(stderr, "QCreate() : ERROR : Blad podczas tworzenia kolejki!\n\n");
  105. return NULL;
  106. }
  107. Q->pTab = (int*)calloc(1, sizeof(int)*nSize);
  108. if (!Q->pTab)
  109. {
  110. fprintf(stderr, "QCreate() : Blad!\n\n");
  111. return NULL;
  112. }
  113. Q->nMax = nSize;
  114. return Q;
  115. }
  116.  
  117. //=============================================================;
  118.  
  119. void QEnqueue(Queue* Q, int x)
  120. {
  121. if (Q->nCurrent == Q->nMax)
  122. {
  123. fprintf(stderr, "QEnqueue() : ERROR : Kolejka pelna!\n\n");
  124. return;
  125. }
  126. Q->pTab[Q->nTail] = x;
  127. Q->nCurrent++;
  128. Q->nTail = (Q->nTail + 1) % Q->nMax;
  129. }
  130.  
  131. //=============================================================;
  132.  
  133. int QDequeue(Queue* Q)
  134. {
  135. if (QEmpty(Q))
  136. {
  137. //perror("QDequeue : ERROR : Kolejka pusta!\n\n");
  138. return -1;
  139. }
  140. int x = Q->pTab[Q->nHead];
  141. Q->pTab[Q->nHead] = 0;
  142. Q->nCurrent--;
  143. Q->nHead = (Q->nHead + 1) % Q->nMax;
  144. return x;
  145. }
  146.  
  147. //=============================================================;
  148. /*
  149. void QDel(Queue** Q)
  150. {
  151. QClear(*Q);
  152. free((*Q)->pTab);
  153. free(*Q);
  154. *Q = NULL;
  155. }
  156. */
  157. //********************************************************
  158.  
  159. int main(int argc, char * argv[])
  160. {
  161. int t=0; // tempo wytwarzania materialu
  162. long port=0;
  163. char adres[100]="localhost";
  164. char* r_path = NULL;
  165. r_path = CheckingParameters(argc, argv, &t, adres, &port);
  166.  
  167. buf_init();
  168.  
  169. char c = 'A';
  170. int data_size = BUFSIZE;
  171. int il_mat;
  172. int il_wydan;
  173.  
  174. //*************************************
  175. // LISTA KONSUMENTOW
  176.  
  177. int nSize = 1000;
  178. Queue* Q = QCreate(nSize);
  179.  
  180. //**************************************
  181. // BUFOR
  182. char *send_buf = (char*) malloc (SENDSIZE * sizeof(char));
  183. if(send_buf == NULL)
  184. {
  185. printf("Could not allocate memory!");
  186. exit(1);
  187. }
  188.  
  189. //**************************************
  190.  
  191. char rec_buf[4];
  192. struct sockaddr_in addr;
  193. struct pollfd fds[1000];
  194. struct hostent * server;
  195. int clCon;
  196. int rc, on = 1;
  197. int list_sd = -1, new_connection = -1;
  198. int end = 0;
  199. int nfds = 1;
  200. int raport =0;
  201. int il_blocks =0;
  202. int change_size=0;
  203.  
  204. //**************************************
  205. // RAPORT
  206. raport = open( r_path, O_APPEND | O_WRONLY | O_CREAT , S_IRWXU | S_IRWXG | S_IRWXO );
  207. if( raport == -1)
  208. {
  209. fprintf(stderr, "Error in function open()\n");
  210. exit(1);
  211. }
  212. ///Take_Element(&L);
  213.  
  214. //*********************
  215.  
  216. list_sd = socket(AF_INET, SOCK_STREAM, 0);
  217. if (list_sd < 0)
  218. {
  219. fprintf(stderr, "Error in function socket()\n");
  220. exit(-1);
  221. }
  222.  
  223. server = gethostbyname(adres);
  224. if(server == NULL)
  225. {
  226. fprintf(stderr, "Wrong adress \n");
  227. exit(-1);
  228. }
  229.  
  230. rc = setsockopt(list_sd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
  231. if (rc < 0)
  232. error("setsockopt()", list_sd);
  233.  
  234. rc = ioctl(list_sd, FIONBIO, (char *)&on);
  235. if (rc < 0)
  236. error("ioctl()", list_sd);
  237.  
  238. //**************************
  239.  
  240. memset(&addr, 0, sizeof(addr));
  241. addr.sin_addr.s_addr = inet_addr(adres);
  242. addr.sin_family = AF_INET;
  243. bcopy((char*)server->h_addr, (char*)&addr.sin_addr.s_addr, server->h_length);
  244. addr.sin_port = htons(port);
  245.  
  246. rc = bind(list_sd, (struct sockaddr *)&addr, sizeof(addr));
  247. if (rc < 0)
  248. error("bind()", list_sd);
  249.  
  250. rc = listen(list_sd, 128);
  251. if (rc < 0)
  252. error("listen()", list_sd);
  253.  
  254. memset(fds, 0 , sizeof(fds));
  255. fds[0].fd = list_sd;
  256. fds[0].events = POLLIN;
  257.  
  258. // TIMERS
  259.  
  260. struct itimerspec amountP; // timer dla parametru
  261. int clock_p = timerfd_create(CLOCK_REALTIME, 0);
  262.  
  263. amountP.it_value.tv_sec = 0;
  264. amountP.it_value.tv_nsec = (t*60/96);
  265. amountP.it_interval.tv_sec = 0;
  266. amountP.it_interval.tv_nsec = (t*60/96);
  267. if(timerfd_settime(clock_p, 0, &amountP, NULL) == -1)
  268. {
  269. fprintf(stderr, "Error in function timerfd_settime\n");
  270. exit(1);
  271. }
  272.  
  273. struct itimerspec amountS; // timer co 5 sekund
  274. int clock_s = timerfd_create(CLOCK_REALTIME, 0);
  275.  
  276. amountS.it_value.tv_sec = 5;
  277. amountS.it_value.tv_nsec = 0;
  278. amountS.it_interval.tv_sec = 5;
  279. amountS.it_interval.tv_nsec = 0;
  280. if(timerfd_settime(clock_s, 0, &amountS, NULL) == -1)
  281. {
  282. fprintf(stderr, "Error in function timerfd_settime\n");
  283. exit(1);
  284. }
  285.  
  286. nfds = 3;
  287. fds[1].fd = clock_p;
  288. fds[1].events = POLLIN;
  289. fds[2].fd = clock_s;
  290. fds[2].events = POLLIN;
  291.  
  292.  
  293. //**********************
  294.  
  295. while (end == 0)
  296. {
  297. rc = poll(fds, nfds, 60000);
  298. if (rc < 0)
  299. {
  300. fprintf(stderr, "Error in function poll()\n");
  301. break;
  302. }
  303.  
  304. if (rc == 0)
  305. {
  306. fprintf(stderr, "Waiting too long (poll()). The end\n");
  307. break;
  308. }
  309.  
  310. for (int i = 0; i < nfds; i++)
  311. {
  312.  
  313. if(fds[i].revents == 0)
  314. continue;
  315.  
  316. if (fds[i].fd == list_sd)
  317. {
  318. do
  319. {
  320. new_connection = accept(list_sd, NULL, NULL);
  321. if (new_connection < 0)
  322. {
  323. if (errno != EWOULDBLOCK)
  324. {
  325. perror("Error in function accept()");
  326. end = 1;
  327. }
  328. break;
  329. }
  330.  
  331. //* RAPORT 1
  332. char * rap1 = "\n**************************************\n After connect: \n";
  333. Raporting(rap1, raport, strlen(rap1));
  334. GettingTime(raport);
  335. Raporting( inet_ntoa(addr.sin_addr), raport, sizeof(inet_ntoa(addr.sin_addr))+1);
  336. //***************
  337.  
  338. printf("******************** \nNew connection\n");
  339. fds[nfds].fd = new_connection;
  340. fds[nfds].events = POLLIN;
  341. nfds++;
  342.  
  343. } while(new_connection != -1);
  344. }
  345.  
  346. //ZEGAR 1
  347. else if(fds[i].fd == clock_p)
  348. {
  349. char clockp_buf[8];
  350. int r = read(clock_p, clockp_buf, 8);
  351. c = Add_to_Buffer( &data_size, c, buf, &il_mat);
  352. }
  353. // ZEGAR 2
  354. else if(fds[i].fd == clock_s)
  355. {
  356. char clocks_buf[8];
  357. int r = read(clock_s, clocks_buf, 8);
  358.  
  359. //RAPORT 3
  360. Raport3(raport,data_size, &il_mat,&il_wydan, nfds);
  361. }
  362.  
  363. // KOLEJNE POLACZENIA
  364. else
  365. {
  366. int il_rcv=0;
  367. clCon = 0;
  368. il_blocks=0;
  369. while(1)
  370. {
  371. // Wysylanie i odbieranie danych
  372. printf("petla sie zaczyna\n");
  373.  
  374. rc = recv(fds[i].fd, rec_buf, sizeof(rec_buf),0);
  375. if ( CheckingRcv(rc, &clCon) == -1)
  376. break;
  377.  
  378.  
  379. printf("Received bytes: %d\n", rc);
  380. int if_give = Take_from_Buffer(&data_size, buf, send_buf);
  381. if(if_give==-1)
  382. {
  383. printf("Braklo materialu\n");
  384. QEnqueue(Q,fds[i].fd);
  385. printf("Dodano element\n ");
  386.  
  387. }
  388. else if(if_give!=-1)
  389. {
  390. int que=QDequeue(Q);
  391.  
  392. if(que!=-1)
  393. {
  394. printf("Biore z kolejki i wysylam\n");
  395. // for(int r=0; i<SENDSIZE; i++)
  396. // printf("%c,", send_buf[0]);
  397.  
  398. rc = send(que, send_buf, 180, 0);
  399. if (rc < 0)
  400. {
  401. fprintf(stderr, "Error in function sssend()\n");
  402. clCon = 1;
  403. break;
  404. }
  405. il_rcv--;
  406. printf(" Dane wyslane:\n");
  407. for(int r=0; i<SENDSIZE; i++)
  408. printf("%c,", send_buf[0]);
  409. //break;
  410. }
  411. else
  412. {
  413. printf("Teraz mam wyslac \n");
  414.  
  415. // for(int r=0; i<180; i++)
  416. // printf("%c,,,", *(send_buf+i));
  417.  
  418.  
  419. rc = send(fds[i].fd, send_buf, 180, 0);
  420. if (rc < 0)
  421. {
  422. fprintf(stderr, "Error in function send()\n");
  423. clCon = 1;
  424. break;
  425. }
  426.  
  427.  
  428.  
  429. //break;
  430. }
  431.  
  432. for(int k=0; k<SENDSIZE; k++)
  433. *(send_buf+k)=0;
  434.  
  435. il_blocks++;
  436. il_wydan+=SENDSIZE;
  437. }
  438. printf("Wychodzi z petli\n");
  439. // continue;
  440. }
  441.  
  442. if (clCon)
  443. {
  444. close(fds[i].fd);
  445. fds[i].fd = -1;
  446. change_size = 1;
  447.  
  448. //* RAPORT 2
  449. char * rap2 = "\n**************************************\n After disconnect: \n";
  450. Raporting(rap2, raport, strlen(rap2));
  451. GettingTime(raport);
  452. Raporting( inet_ntoa(addr.sin_addr), raport, sizeof(inet_ntoa(addr.sin_addr))+1);
  453. int blocksize = sizeof(il_blocks);
  454. char block_il[blocksize];
  455. sprintf(block_il, "%d", il_blocks);
  456. strcat(block_il, " - ilosc przeslanych blokow\n");
  457. Raporting( block_il, raport, strlen(block_il));
  458. //*********************
  459. }
  460. }
  461. }
  462.  
  463. if (change_size)
  464. {
  465. for (int m = 0; m < nfds; m++)
  466. {
  467. if (fds[m].fd == -1)
  468. {
  469. for(int n = m; n < nfds; n++)
  470. fds[n].fd = fds[n+1].fd;
  471.  
  472. nfds--;
  473. }
  474. }
  475. change_size = 0;
  476. }
  477.  
  478. }
  479.  
  480.  
  481. for (int i = 0; i < nfds; i++)
  482. {
  483. if(fds[i].fd >= 0)
  484. close(fds[i].fd);
  485. }
  486.  
  487. free(send_buf);
  488. close(raport);
  489. return 0;
  490. }
  491.  
  492.  
  493. //*********************************************************
  494.  
  495. char Add_to_Buffer(int * data_size, char cc, char buf[], int* il_mat)
  496. {
  497. char c = cc;
  498.  
  499. if (*data_size >= GIVESIZE) // jeżeli jest miejsce na blok
  500. {
  501. if (c == '[')
  502. c = 'a';
  503. else if (c == '{')
  504. c = 'A';
  505.  
  506. for (int k = 0; k < GIVESIZE; k++) // przekazuje blok
  507. buf_put(c);
  508.  
  509. *data_size -= GIVESIZE;
  510. c++;
  511. *il_mat+=GIVESIZE;
  512. }
  513.  
  514. return c;
  515. }
  516.  
  517. //*******************************************************************
  518.  
  519. int Take_from_Buffer(int * data_size, char buf[], char * send_buf)
  520. {
  521. if (SENDSIZE <= BUFSIZE - *data_size) // jezeli jest odpowiednia ilosc danych
  522. {
  523. char p[1];
  524. for (int j = 0; j < SENDSIZE; j++)
  525. {
  526. buf_get(p);
  527. *(send_buf+j)=p[0];
  528. printf("%c, ", *(send_buf+j));
  529. }
  530.  
  531. *data_size += SENDSIZE;
  532. return 0;
  533. }
  534.  
  535. return -1;
  536. }
  537.  
  538. //**********************************************************
  539.  
  540. void Raport3(int raport, int data_size, int *il_mat, int *il_wydan, int nfds)
  541. {
  542.  
  543. //Raport 3
  544. char * rap3 = "\n*************************************\n Raport after 5 seconds: \n";
  545. Raporting(rap3, raport, strlen(rap3));
  546.  
  547. // TS
  548. GettingTime(raport);
  549.  
  550. // zajetosc magazynow
  551. char procent[sizeof((data_size*100)/BUFSIZE)];
  552. char ile_danych[sizeof(data_size)+sizeof(procent)+20];
  553. sprintf(ile_danych, "%d", data_size);
  554. strcat(ile_danych, " - zajetosc magazynu \t");
  555. sprintf(procent, "%d", data_size*100/BUFSIZE);
  556. strcat(ile_danych, procent);
  557. strcat(ile_danych, "%\n");
  558. Raporting(ile_danych, raport, strlen(ile_danych));
  559.  
  560. // przeplyw materialu
  561. char przep[sizeof(*il_mat-*il_wydan)+48];
  562. sprintf(przep, "%d", (*il_mat - *il_wydan));
  563. strcat(przep, " - przeplyw materialu w ostatnich 5 sekundach \n");
  564. Raporting(przep, raport, strlen(przep));
  565.  
  566. // ilosc klientow
  567. char klienci[sizeof(nfds-2)];
  568. sprintf(klienci, "%d", nfds-2);
  569. strcat(klienci, " - ilosc klientow podlaczonych \n");
  570. Raporting(klienci, raport, strlen(klienci));
  571.  
  572. *il_wydan =0;
  573. *il_mat =0;
  574.  
  575. }
  576.  
  577.  
  578.  
  579. //*********************************************************
  580. void GettingTime(int raport)
  581. {
  582. char secM[20], nsecM[10], secR[20], nsecR[10];
  583. char re[31] = "WALL TIME: ";
  584. char mon[27] = "MONOTONIC: ";
  585. int retMon, retRe;
  586. struct timespec tsR, tsM;
  587.  
  588. retRe = clock_gettime (CLOCK_REALTIME, &tsR);
  589. if (retRe)
  590. perror("clock_gettimeRe()");
  591.  
  592. sprintf(secR, "%d", (int)(tsR.tv_sec));
  593. sprintf(nsecR, "%ld", tsR.tv_nsec);
  594. strcat(secR, ".");
  595. strcat(secR, nsecR);
  596. strcat(re, secR);
  597. strcat(re, "\t");
  598. Raporting(re, raport, sizeof(re));
  599.  
  600. //***************************
  601.  
  602. retMon = clock_gettime (CLOCK_MONOTONIC, &tsM);
  603. if (retMon)
  604. perror("clock_gettimeMon()");
  605.  
  606. sprintf(secM, "%d", (int)(tsM.tv_sec));
  607. sprintf(nsecM, "%ld", tsM.tv_nsec);
  608. strcat(secM, ".");
  609. strcat(secM, nsecM);
  610. strcat(mon, secM);
  611. strcat(mon, "\n");
  612. Raporting(mon, raport, sizeof(mon));
  613. }
  614.  
  615. //**********************************************
  616.  
  617. void Raporting(char * buf, int raport, int count )
  618. {
  619. ssize_t nr;
  620. nr = write(raport, buf, count);
  621. if(nr == -1 || nr != count)
  622. {
  623. fprintf(stderr, "Error in function write");
  624. exit(1);
  625. }
  626.  
  627. nr = write(raport, "\n" , 1);
  628. if(nr == -1 || nr != 1)
  629. {
  630. fprintf(stderr, "Error in function write");
  631. exit(1);
  632. }
  633. }
  634.  
  635. //**************************************************************
  636.  
  637. char* CheckingParameters(int argc, char*argv[], int* t, char *adres, long* port)
  638. {
  639.  
  640. int opt;
  641. char * r = NULL;
  642. char* ptr = NULL;
  643.  
  644.  
  645. while((opt = getopt(argc, argv, "r:t:")) != -1)
  646. {
  647. switch(opt)
  648. {
  649. case 'r':
  650. r = optarg;
  651. break;
  652. case 't':
  653. *t = (int)strtol(optarg, &ptr,0);
  654. break;
  655. default:
  656. abort();
  657. }
  658. }
  659.  
  660.  
  661. if (r == NULL) //sprawdzenie czy jest r podane
  662. {
  663. fprintf(stderr,"-r is mandatory!\n");
  664. exit (1);
  665. }
  666.  
  667. else if( !t) // sprawdzenie czy jest t podane
  668. {
  669. fprintf(stderr,"-t is mandatory!\n");
  670. exit (1);
  671. }
  672. else if( *t<1 && *t>8) // sprawdzenie zakresu t
  673. {
  674. fprintf(stderr, "-t should have value from <1,8>\n");
  675. exit(1);
  676. }
  677.  
  678. if (optind != (argc-1)) // sprawdzenie liczby parametrow
  679. {
  680. fprintf(stderr,"ERROR, wrong number of parameters\n");
  681. exit(1);
  682. }
  683.  
  684. // sprawdzanie poprawnosci [<addr>:]port
  685. char* pEnds;
  686. char * tmp = argv[optind];
  687. strcpy( adres,strtok(tmp, "[]:"));
  688. tmp = strtok(NULL, "[]:");
  689. if(tmp==NULL)
  690. {
  691. *port = strtol(adres, &pEnds, 0);
  692. if(*port==0)
  693. {
  694. fprintf(stderr,"ERROR, wrong PORT number\n");
  695. exit(1);
  696. }
  697. strcpy(adres,"localhost");
  698. }
  699. else
  700. {
  701. *port = strtol(tmp, &pEnds, 0);
  702. if(*port==0)
  703. {
  704. fprintf(stderr,"ERROR, wrong PORT number\n");
  705. exit(1);
  706. }
  707. }
  708.  
  709. return r;
  710. }
  711.  
  712. //***********************************************************
  713.  
  714.  
  715. void nano(float od_czas)
  716. {
  717. struct timespec tim, tim2;
  718. tim.tv_sec = (int)od_czas;
  719. tim.tv_nsec = (od_czas - tim.tv_sec) * 1000000000;
  720.  
  721. if(nanosleep(&tim , &tim2) < 0 )
  722. perror("nanosleep blad");
  723. }
  724.  
  725. //*************************************************************
  726.  
  727. void error(char * fun, int fd)
  728. {
  729. fprintf(stderr, "Error in function %s \n", fun);
  730. close(fd);
  731. exit(-1);
  732.  
  733. }
  734.  
  735. //*************************************************************
  736.  
  737. int CheckingRcv( int rc, int * clCon)
  738. {
  739. if (rc < 0)
  740. {
  741. if (errno != EWOULDBLOCK)
  742. {
  743. perror("Error in function recv()");
  744. *clCon = 1;
  745. return -1;
  746. }
  747. }
  748.  
  749. if (rc == 0)
  750. {
  751. printf("Connection closed\n");
  752. *clCon = 1;
  753. return -1;
  754. }
  755. return 0;
  756. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement