Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.83 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <stdio.h>
  8. #include<pthread.h>
  9.  
  10. #define ST_PORT 9998
  11.  
  12. #pragma comment (lib, "Ws2_32.lib")
  13. #pragma comment (lib, "Mswsock.lib")
  14. #pragma comment (lib, "AdvApi32.lib")
  15.  
  16.  
  17. typedef struct lista{
  18. int si;
  19. pthread_t watek;
  20. int nr;
  21. struct lista* next;
  22. } lista;
  23.  
  24. struct dane_dla_watku // tablica zawiera dane , ktore otrzymaja watki
  25. {
  26. lista *head;
  27. int *si;
  28. int* user;
  29. }dane_dla_watku;
  30.  
  31. //pthread_t ghMutex;
  32. pthread_mutex_t mutex;
  33. void* funkcja_watku(void *arg);
  34. int main() {
  35.  
  36.  
  37. /*WSADATA wsas;
  38. int result;
  39. WORD wersja;
  40. wersja = MAKEWORD(1, 1);
  41. result = WSAStartup(wersja, &wsas);
  42. int s;
  43. s = socket(AF_INET, SOCK_STREAM, 0);*/
  44.  
  45. int s, newsockfd, portno;
  46. socklen_t clilen;
  47. char buffer[256];
  48. s = socket(AF_INET, SOCK_STREAM, 0);
  49. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  50. /*struct sockaddr_in sa;
  51. memset((void *)(&sa), 0, sizeof(sa));
  52. sa.sin_family = AF_INET;
  53. sa.sin_port = htons(ST_PORT);
  54. sa.sin_addr.s_addr = htonl(INADDR_ANY);
  55. result = bind(s, (struct sockaddr FAR *) & sa, sizeof(sa));
  56. result = listen(s, 5);*/
  57.  
  58. struct sockaddr_in sa;
  59. bzero((char *) &sa, sizeof(sa));
  60. sa.sin_family = AF_INET;
  61. sa.sin_addr.s_addr = INADDR_ANY;
  62. sa.sin_port = htons(9998);
  63. bind(s, (struct sockaddr *) &sa,sizeof(sa));
  64. listen(s,5);
  65.  
  66. //---------------------------------
  67.  
  68. int licz_watk = 0;
  69. struct sockaddr_in sc;
  70. int lenc;
  71. lista* head = NULL;
  72. /*ghMutex = CreateMutex(NULL, FALSE, NULL);
  73. if (ghMutex == NULL)
  74. {
  75. printf("CreateMutex error: %d\n", GetLastError());
  76. return 1;
  77. }*/
  78. pthread_mutexattr_init(&mutex);
  79. for (;;)
  80. {
  81. lenc = sizeof(sc);
  82. int tmpS = accept(s, (struct sockaddr *) & sc, &lenc);
  83. lista* el_listy = malloc(sizeof(lista));
  84. el_listy->next = NULL;
  85. lista* tmp = head;
  86. if (tmp == NULL)
  87. {
  88. el_listy->nr = 1;
  89. head = el_listy;
  90. }
  91. else
  92. {
  93. while (tmp->next != NULL)
  94. {
  95. tmp = tmp->next;
  96. }
  97. el_listy->nr = tmp->nr + 1;
  98. tmp->next = el_listy;
  99. }
  100. el_listy->si = tmpS;
  101. struct dane_dla_watku dane={ head, &el_listy->si, &el_listy->nr };
  102.  
  103. int err = pthread_create(&el_listy->watek,NULL, funkcja_watku, (void *)(&dane));
  104. if (err != 0){
  105. printf("\ncan't create thread :[%s]", strerror(err));
  106. }
  107. else{
  108. printf("\n Thread created successfully\n");
  109. }
  110.  
  111. }
  112. /*WaitForMultipleObjects(THREADCOUNT, aThread, TRUE, INFINITE);
  113. for (int i = 0; i < THREADCOUNT; i++)
  114. CloseHandle(aThread[i]);*/
  115. pthread_mutexattr_destroy(&mutex);
  116. return 0;
  117. }
  118. void* funkcja_watku(void *arg)
  119. {
  120.  
  121. char buf[80];
  122. struct dane_dla_watku *dn = (struct dane_dla_watku*)arg;
  123. int *sia = dn->si;
  124. lista *tmp = dn->head;
  125. char usernum = *(dn->user) + '0';
  126. char hello[40] = "Uzytkownik";
  127. int dlug2 = strlen(hello);
  128. hello[dlug2] = usernum;
  129. strcat(hello, " sie polaczyl.");
  130. dlug2 = strlen(hello);
  131. hello[dlug2] = '\0';
  132. while (tmp != NULL)
  133. {
  134.  
  135. send(tmp->si, hello, dlug2+1, 0);
  136. tmp = tmp->next;
  137. }
  138.  
  139. while (1) {
  140.  
  141. while (recv(*sia, buf, 80, 0) > 0)
  142. {
  143. //WaitForSingleObject(ghMutex, INFINITE);
  144. pthread_mutex_lock(&mutex);
  145. if (strcmp(buf, "KONIEC") == 0)
  146. {
  147. printf("koniec");
  148.  
  149. //closesocket(sia);
  150. //WSACleanup();
  151. return;
  152. }
  153. char bufuser[100] = "Uzytkownik";
  154. int dlug2 = strlen(bufuser);
  155. bufuser[dlug2] = usernum;
  156. strcat(bufuser, ": ");
  157. strcat(bufuser, buf);
  158. lista *tmp = dn->head;
  159. while (tmp != NULL)
  160. {
  161. dlug2 = strlen(bufuser);
  162. bufuser[dlug2] = '\0';
  163. send(tmp->si, bufuser, dlug2+1, 0);
  164. tmp = tmp->next;
  165. }
  166. printf("%s\n", buf);
  167. //ReleaseMutex(ghMutex);
  168. pthread_mutex_unlock(&mutex);
  169. };
  170.  
  171. }
  172.  
  173. return 0;
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement