zaliczenie - gwiazdka |
| mamci88 | 28.01.2012 15:46:55 |
| Grupa: Użytkownik Posty: 7 #852502 Od: 2011-11-6 | #include <pthread.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #define BUFLEN 1000 struct KLIENT { FILE *f; long csock; char login[256]; struct KLIENT *next; } *klienci = NULL; struct KLIENT * wezklienta(FILE *f) { struct KLIENT *k = klienci; while(k) { if(k->f == f) return k; k=k->next; } } void dodajklienta(FILE *f, char *login, long csock) { struct KLIENT *nowy = (struct KLIENT *) malloc(sizeof(struct KLIENT)); nowy->f = f; nowy->csock = csock; strcpy(nowy->login,login); nowy->next = klienci; klienci=nowy; } void usunklienta(FILE *f) { struct KLIENT * k = klienci, *prev = NULL; if(k->f == f) { klienci=klienci->next; free(k); return; } while(k) { if(k->f == f) { prev->next = k->next; free(k); break; } prev = k; k = k->next; } } void *watek(void * arg) { double wartosc,suma; wartosc = 0; suma = 0; long csock = (long) arg; FILE * f = fdopen(csock,"r"); fprintf(f,"Hello SDSLZ\n"); int logged = 0; for(; char linia[256],komenda[256],argument[256]; if(!fgets(linia,sizeof(linia),f)) break; int n=strlen(linia); if(n>0 && linia[0]=='/') { // polecenie int m=sscanf(linia,"/%s %s",komenda,argument); if(m==1 && !strcmp(komenda,"help")) { char buf[256]; sprintf(buf,"Help ?! WTF ?!\n"); write(csock,buf,strlen(buf)); continue; } if(m==2 && !strcmp(komenda,"login")) { if (wezklienta(f)!=NULL) usunklienta(f); logged=1; dodajklienta(f,argument,csock); continue; } if(m==1 && !strcmp(komenda,"logout")) { char buf[256]; sprintf(buf,"Wylogowano\n"); write(csock,buf,strlen(buf)); usunklienta(f); continue; } if(m==1 && !strcmp(komenda,"list")) { printf("%s\n",komenda); struct KLIENT *k = klienci; while(k) { char buf[256]; struct KLIENT *ja = wezklienta(f); if (k->login==ja->login) sprintf(buf,"%s*\n",k->login); else sprintf(buf,"%s\n",k->login); write(csock,buf,strlen(buf)); k=k->next; } continue; } char buf[256]; sprintf(buf,"Nie rozumiem: %s",linia); write(csock,buf,strlen(buf)); } else { if(!logged) { fprintf(f,"niezalogowany !!\n"); } else { struct KLIENT *k = klienci; struct KLIENT *ja = wezklienta(f); while(k) { char buf[256]; if (k->login!=ja->login ) { sprintf(buf,"%s: %s\n",ja->login,linia); write(k->csock,buf,strlen(buf)); } k=k->next; } } continue; // dane } } fclose(f); } main() { struct sockaddr_in server; int sock, opt, n; long csock; char buf[BUFLEN]; double wartosc, suma; sock = socket(AF_INET, SOCK_STREAM, 0); opt = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(99999); if (bind(sock, (struct sockaddr *) &server, sizeof(server))) { perror("bind"); exit(1); } listen(sock, 5); for (; csock = accept(sock, NULL, NULL); printf("Klient polaczony\n"); pthread_t tid; pthread_create(&tid,NULL,watek, (void *) csock); } } |
| Aby pisac na forum musisz sie zalogować !!! |