Advertisement
Guest User

proj

a guest
Jan 18th, 2018
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. /* servTCPConcTh2.c - Exemplu de server TCP concurent care deserveste clientii
  2. prin crearea unui thread pentru fiecare client.
  3. Asteapta un numar de la clienti si intoarce clientilor numarul incrementat.
  4. Intoarce corect identificatorul din program al thread-ului.
  5.  
  6.  
  7. Autor: Lenuta Alboaie <adria@infoiasi.ro> (c)2009
  8. */
  9.  
  10. #include <sys/types.h>
  11. #include <sys/socket.h>
  12. #include <netinet/in.h>
  13. #include <errno.h>
  14. #include <unistd.h>
  15. #include <stdio.h>
  16. #include <string.h>
  17. #include <stdlib.h>
  18. #include <signal.h>
  19. #include <pthread.h>
  20.  
  21. /* portul folosit */
  22. #define PORT 2908
  23.  
  24. /* codul de eroare returnat de anumite apeluri */
  25. extern int errno;
  26.  
  27. typedef struct thData{
  28. int idThread; //id-ul thread-ului tinut in evidenta de acest program
  29. int cl; //descriptorul intors de accept
  30. }thData;
  31.  
  32. static void *treat(void *); /* functia executata de fiecare thread ce realizeaza comunicarea cu clientii */
  33. void raspunde(void *);
  34.  
  35. int main ()
  36. {
  37. struct sockaddr_in server; // structura folosita de server
  38. struct sockaddr_in from;
  39. int nr; //mesajul primit de trimis la client
  40. int sd; //descriptorul de socket
  41. int pid;
  42. pthread_t th[100]; //Identificatorii thread-urilor care se vor crea
  43. int i=0;
  44.  
  45.  
  46. /* crearea unui socket */
  47. if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
  48. {
  49. perror ("[server]Eroare la socket().\n");
  50. return errno;
  51. }
  52. /* utilizarea optiunii SO_REUSEADDR */
  53. int on=1;
  54. setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
  55.  
  56. /* pregatirea structurilor de date */
  57. bzero (&server, sizeof (server));
  58. bzero (&from, sizeof (from));
  59.  
  60. /* umplem structura folosita de server */
  61. /* stabilirea familiei de socket-uri */
  62. server.sin_family = AF_INET;
  63. /* acceptam orice adresa */
  64. server.sin_addr.s_addr = htonl (INADDR_ANY);
  65. /* utilizam un port utilizator */
  66. server.sin_port = htons (PORT);
  67.  
  68. /* atasam socketul */
  69. if (bind (sd, (struct sockaddr *) &server, sizeof (struct sockaddr)) == -1)
  70. {
  71. perror ("[server]Eroare la bind().\n");
  72. return errno;
  73. }
  74.  
  75. /* punem serverul sa asculte daca vin clienti sa se conecteze */
  76. if (listen (sd, 2) == -1)
  77. {
  78. perror ("[server]Eroare la listen().\n");
  79. return errno;
  80. }
  81. /* servim in mod concurent clientii...folosind thread-uri */
  82. while (1)
  83. {
  84. int client;
  85. thData * td; //parametru functia executata de thread
  86. int length = sizeof (from);
  87.  
  88. printf ("[server]Asteptam la portul %d...\n",PORT);
  89. fflush (stdout);
  90.  
  91. //client= malloc(sizeof(int));
  92. /* acceptam un client (stare blocanta pina la realizarea conexiunii) */
  93. if ( (client = accept (sd, (struct sockaddr *) &from, &length)) < 0)
  94. {
  95. perror ("[server]Eroare la accept().\n");
  96. continue;
  97. }
  98.  
  99. /* s-a realizat conexiunea, se astepta mesajul */
  100.  
  101. td=(struct thData*)malloc(sizeof(struct thData));
  102. td->idThread=i++;
  103. td->cl=client;
  104.  
  105. pthread_create(&th[i], NULL, &treat, td);
  106.  
  107. }//while
  108. };
  109. static void *treat(void * arg)
  110. {
  111. struct thData tdL;
  112. tdL= *((struct thData*)arg);
  113.  
  114.  
  115. printf ("[thread]- %d - Asteptam mesajul...\n", tdL.idThread);
  116. fflush (stdout);
  117. pthread_detach(pthread_self());
  118.  
  119.  
  120. raspunde((struct thData*)arg);
  121. /* am terminat cu acest client, inchidem conexiunea */
  122. close (tdL.cl);
  123. return(NULL);
  124.  
  125. };
  126.  
  127.  
  128. void raspunde(void *arg)
  129. {
  130. int nr, i=0;
  131. struct thData tdL;
  132. tdL= *((struct thData*)arg);
  133.  
  134. //tdL.cl = client
  135.  
  136. char username[100], parola[100];
  137. read ( tdL.cl , username, sizeof(username));
  138. read ( tdL.cl , parola, sizeof(parola));
  139.  
  140. int semnal;
  141. printf("\n %s %s",parola,username);
  142. if(!strcmp(username,"Mitica")&& !strcmp(parola,"QWER"))
  143. semnal=1;
  144. strcmp(username,"Mitica".'')
  145. printf()
  146. else
  147. semnal=2;
  148.  
  149. write(tdL.cl, semnal, sizeof(int));
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement