Advertisement
Guest User

klient

a guest
Jan 23rd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/msg.h>
  4. #include <sys/types.h>
  5. #include <sys/ipc.h>
  6. #include <signal.h>
  7. #include <errno.h>
  8. #include <string.h>
  9. #include <pthread.h>
  10. #include <ctype.h>
  11. #include <unistd.h>
  12.  
  13. #define MAX 50
  14.  
  15. key_t key;
  16. int ID_kolejki;
  17. char komunikatTekst[MAX];
  18.  
  19. typedef struct Komunikat {
  20. long type;
  21. long pid_klienta;
  22. char mtext[MAX];
  23. } Komunikat;
  24.  
  25.  
  26. Komunikat kom_odebrany;
  27. Komunikat kom_wyslany;
  28.  
  29.  
  30. void *wyslij() {
  31. while(1) {
  32. kom_wyslany.type = 1;
  33. kom_wyslany.pid_klienta = getpid();
  34. sleep(1);
  35. printf("\nKlient %d: Wysyłanie komunikatu. Podaj tekst do wyslania: ", getpid());
  36. int i = 0;
  37. while(i < MAX) {
  38. komunikatTekst[i] = getchar();
  39. if(komunikatTekst[i] == '\n') {
  40. komunikatTekst[i] = '\0';
  41. break;
  42. }
  43. i++;
  44. }
  45. strcpy(kom_wyslany.mtext, komunikatTekst);
  46. if((msgsnd(ID_kolejki, (Komunikat *)&kom_wyslany, strlen(kom_wyslany.mtext)+sizeof(long), 0)) == -1) {
  47. printf("Klient %d: Blad przy wysylaniu komunikatu. ERRNO %i (%s)\n", getpid(), errno, strerror(errno));
  48. exit(2);
  49. } else
  50. printf("Klient %d: Klient wyslal wiadomosc do serwera. Tresc wiadomosci: %s\n", getpid(), kom_wyslany.mtext);
  51. }
  52. pthread_exit((void *) 0);
  53. }
  54.  
  55. void *odbierz() {
  56. while(1) {
  57. kom_odebrany.type = getpid();
  58. int i;
  59. for(i = 0; i < MAX; i++) {
  60. kom_odebrany.mtext[i] = '\0';
  61. }
  62. if((msgrcv(ID_kolejki, (Komunikat *)&kom_odebrany, MAX+sizeof(long), kom_odebrany.type, 0)) == -1) {
  63. if (errno == 43) {
  64. printf("Klient %d: Serwer zakonczyl prace! Kolejka zostala usunieta\n", getpid());
  65. exit(2);
  66. } else if (errno == 22) {
  67. printf("Klient %d: Blad przy pobieraniu komunikatu od serwera! Serwer zakonczyl prace.\n", getpid());
  68. exit(2);
  69. } else {
  70. printf("Klient %d: Blad przy pobieraniu komunikatu od serwera! ERRNO %i (%s)\n", getpid(), errno, strerror(errno));
  71. exit(2);
  72. }
  73. } else
  74. printf("Klient %d: Klient odebral wiadomosc. Tresc: %s\n", getpid(), kom_odebrany.mtext);
  75. }
  76. pthread_exit((void *) 0);
  77. }
  78.  
  79.  
  80. int main() {
  81. //dwa watki - do odbeirania i wysylania, dzialaja niezaleznie
  82. pthread_t TID1, TID2;
  83.  
  84. //klucz do kolejki
  85. if((key = ftok(".", 808182)) == -1) {
  86. printf("Klient %d: Blad tworzenia klucza!\n", getpid());
  87. exit(-1);
  88. } else
  89. printf("Klient %d: Klucz zostal utworzony\n", getpid());
  90.  
  91. //tworzenie kolejki - 0600 bo odczytywanie i pisanie
  92. if((ID_kolejki = msgget(808182, 0666 | IPC_CREAT)) == -1 ) {
  93. printf("Klient %d: Blad przy tworzeniu kolejki komunikatow! ERRNO %i (%s)\n", getpid(), errno, strerror(errno));
  94. exit(-2);
  95. }
  96. printf("Klient %d: Utworzono kolejke komunikatow\n", getpid());
  97.  
  98. if(pthread_create(&TID1, NULL, odbierz, NULL) == -1) {
  99. printf("Klient %d: Blad tworzenia watku do odbierania wiadomosci! ERRNO %i (%s)\n", getpid(), errno, strerror(errno));
  100. exit(-1);
  101. }
  102.  
  103. if(pthread_create(&TID2, NULL, wyslij, NULL) == -1) {
  104. printf("Klient %d: Blad tworzenia watku do wysylania wiadomosci! ERRNO %i (%s)\n", getpid(), errno, strerror(errno));
  105. exit(-1);
  106. }
  107.  
  108. if(pthread_join(TID1, NULL) == -1) {
  109. printf("Klient %d: Blad przylaczenia watku do odbierania wiadomosci! ERRNO %i (%s)\n", getpid(), errno, strerror(errno));
  110. exit(-1);
  111. }
  112.  
  113. if(pthread_join(TID2, NULL) == -1) {
  114. printf("Klient %d: Blad przylaczenia watku do wysylania wiadomosci! ERRNO %i (%s)\n", getpid(), errno, strerror(errno));
  115. exit(-1);
  116. }
  117.  
  118.  
  119. return 0;
  120.  
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement