#852502 28.01.2012 15:46:54
#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);
}
}
#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);
}
}