Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include <arpa/inet.h>
  8. #include <pthread.h> //aggiungi -pthread al comando g++/gcc!
  9. #include <signal.h>
  10. using namespace std;
  11.  
  12. struct client_info {
  13.     char nick[20];
  14.     int sockno;
  15.     char ip[INET_ADDRSTRLEN];
  16. };
  17.  
  18. int* refServerSocket;
  19. int clients[100];
  20. int n = 0;
  21. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  22.  
  23. void sendtoall(char *, int);
  24. void *recvmg(void *sock);
  25. void exitServer(int);
  26.  
  27. int main(int argc,char *argv[])
  28. {
  29.     struct sockaddr_in my_addr,their_addr;
  30.     int my_sock, their_sock;
  31.     socklen_t their_addr_size;
  32.     int portno;
  33.     pthread_t recvt;
  34.     char msg[500];
  35.     char buffer[50];
  36.     char initmsg[] = "Mi serve il tuo nickname: ";
  37.     int len;
  38.     struct client_info cl;
  39.     char myIP[INET_ADDRSTRLEN];
  40.     char ip[INET_ADDRSTRLEN];
  41.    
  42.     cout<<"\nINSERISCI L'IP DI UNA TUA INTERFACCIA (ipv4)\n";
  43.     cout<<"(puoi ricavarlo mediante il comando /sbin/ifconfig)\n-->";
  44.     cin.getline(myIP, 16);
  45.     cout<<"\nINSERISCI IL NUMERO DI PORTA (valore intero)\n";
  46.     cout<<"(se non sei amministratore deve essere maggiore di 1023)\n-->";
  47.     cin>>portno;
  48.    
  49.     my_sock = socket(AF_INET,SOCK_STREAM,0);
  50.     memset(my_addr.sin_zero,'\0',sizeof(my_addr.sin_zero));
  51.     my_addr.sin_family = AF_INET;
  52.     my_addr.sin_port = htons(portno);
  53.     my_addr.sin_addr.s_addr = inet_addr(myIP);
  54.     their_addr_size = sizeof(their_addr);
  55.  
  56.     if(bind(my_sock,(struct sockaddr *)&my_addr,sizeof(my_addr)) != 0) {
  57.         cerr<<"Binding fallita\n";
  58.         exit(1);
  59.     }
  60.  
  61.     if(listen(my_sock,5) != 0) {
  62.         cerr<<"Listening fallita\n";
  63.         exit(1);
  64.     }
  65.  
  66.     refServerSocket = &my_sock;
  67.     signal(SIGINT,  exitServer);
  68.     signal(SIGKILL, exitServer);
  69.     signal(SIGTERM, exitServer);
  70.  
  71.     cout<<"\nIl server e' pronto!\n\nPuoi collegarti al server tramite telnet con il seguente comando: telnet "<<myIP<<" "<<portno<<"\n\nAttendo connessioni client...\n";
  72.     while(1) {
  73.         if((their_sock = accept(my_sock,(struct sockaddr *)&their_addr,&their_addr_size)) < 0) {
  74.             cerr<<"Accept fallita\n";
  75.             exit(1);
  76.         }
  77.         pthread_mutex_lock(&mutex);
  78.         inet_ntop(AF_INET, (struct sockaddr *)&their_addr, ip, INET_ADDRSTRLEN);
  79.  
  80.         strcpy(buffer, initmsg);
  81.         send(their_sock, buffer, strlen(buffer), 0);
  82.         memset(buffer, 0, sizeof buffer);
  83.  
  84.         recv(their_sock, buffer, 50, 0);
  85.         strcpy(cl.nick,buffer);
  86.         memset(buffer, 0, sizeof buffer);
  87.         cl.nick[strlen(cl.nick)-2] = '\0';
  88.  
  89.         cout<<cl.nick<<" con indirizzo di riferimento "<<ip<<" si e' connesso!\n";
  90.         cl.sockno = their_sock;
  91.         strcpy(cl.ip,ip);
  92.         clients[n] = their_sock;
  93.         n++;
  94.         pthread_create(&recvt,NULL,recvmg,&cl);
  95.         pthread_mutex_unlock(&mutex);
  96.     }
  97.     return 0;
  98. }
  99.  
  100. void sendtoall(char *msg,int curr)
  101. {
  102.     int i;
  103.     pthread_mutex_lock(&mutex);
  104.     for(i = 0; i < n; i++) {
  105.         if(clients[i] != curr) {
  106.             if(send(clients[i],msg,strlen(msg),0) < 0) {
  107.                 cerr<<"Fallito l'invio messaggio\n";
  108.                 continue;
  109.             }
  110.         }
  111.     }
  112.     pthread_mutex_unlock(&mutex);
  113. }
  114.  
  115. void *recvmg(void *sock)
  116. {
  117.     struct client_info cl = *((struct client_info *)sock);
  118.     char msg[500];
  119.     char tmp[520];
  120.     int len, i, j;
  121.     while((len = recv(cl.sockno,msg,500,0)) > 0) {
  122.         strcpy(tmp,cl.nick);
  123.         strcat(tmp,": ");
  124.         msg[len] = '\0';
  125.         strcat(tmp, msg);
  126.         sendtoall(tmp,cl.sockno);
  127.         memset(msg,'\0',sizeof(msg));
  128.         memset(tmp,'\0',sizeof(tmp));
  129.     }
  130.     pthread_mutex_lock(&mutex);
  131.     cout<<cl.nick<<" con indirizzo ip di riferimento "<<cl.ip<<" si e' disconnesso!\n";
  132.     for(i = 0; i < n; i++) {
  133.         if(clients[i] == cl.sockno) {
  134.             j = i;
  135.             while(j < n-1) {
  136.                 clients[j] = clients[j+1];
  137.                 j++;
  138.             }
  139.         }
  140.     }
  141.     n--;
  142.     pthread_mutex_unlock(&mutex);
  143. }
  144.  
  145. void exitServer(int segnale)
  146. {
  147.    cerr<<"\nChat terminata (operazioni conclusive)\n";
  148.    close(*refServerSocket);
  149.    exit(0);
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement