Metal2001
26-01-2010, 08:48
Sto preparando una chat scritta in c sotto linux come progetto di sistemi operativi e ho qualche difficoltà
Nella versione scritta di seguito la chat funziona solo dal server verso il client,se il client scrive mi da l'errore "segmentation fault", vorrei risolvere questo problema e inserire qualche semplice operazione su file,ad esempio un piccolo txt dove ci sono dati del ora-giorno-nome utente usando le sistem call open,write e read
Ecco i codici,spero possiate aiutarmi
Server
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
int server_sockfd, client_sockfd;
int server_len, client_len;
int status;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
char socketname;
int bytes_read;
char *my_string;
char msg[30];
pid_t pid;
char s;
pthread_t th1;
pthread_t th2;
int j=0,k=0;
int nbytes = 100;
void sighandler ()
{
if(k!=0)
printf("\nRicevuto segnale di terminazione\nprogramma in esecuzione per %d minuti e %d secondi\n",k,j);
else
printf("\nRicevuto segnale di terminazione\nprogramma in esecuzione per %d secondi\n",j);
exit(0);
}
void* thread_body1 (void* var)
{
for(;;)
{
sleep(1);
j++;
if(j==60)
{
k++;
j=0;
}
}
}
void* thread_body2 (void* var)
{
for(;;)
{
sleep(1);
read(server_sockfd, msg, nbytes);
printf("server:%s\n",msg);
signal(SIGINT,sighandler);
}
}
int main()
{
if(pthread_create (&th1,0,thread_body1,0)<0)
{
printf("Errore in create");
exit(1);
}
printf("Digitare:\ne - per le informazioni sulla scheda di rete ethernet\nw - per le informazioni sulla scheda di rete wireless\n qualsiasi altro carattere per non ottenre informazioni\n------>");
scanf("%c",&s);
switch(s)
{
case 'e':
pid=fork();
if (pid==0)
{
printf("figlio:il mio pid è %d,il ppid è %d,sto per eseguire ifconfig eth0\n",getpid(),getppid());
execl("/sbin/ifconfig", "ifconfig eth0","eth0",(char *) 0);
return 0;
}
break;
case 'w':
pid=fork();
if (pid==0)
{
printf("figlio:il mio pid è %d,il ppid è %d,sto per eseguire ifconfig eth1\n",getpid(),getppid());
execl("/sbin/ifconfig", "ifconfig eth1","eth1",(char *) 0);
return 0;
}
break;
default:
printf("Nessuna informazione richiesta");
}
{
wait(&status); //da controllare se serve o no
printf("Digitare nome del socket per l'invio:");
scanf("%s",&socketname);
server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, &socketname);
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
listen(server_sockfd, 5);
if(pthread_create (&th2,0,thread_body2,0)<0)
{
printf("Errore in create");
exit(1);
}
while(1)
{
printf("creato socket con nome %s\nin attesa...\n",server_address.sun_path);
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, &client_len);
//read(client_sockfd,msg, 30);
//printf("\nusername:%s",msg);
//read(client_sockfd,msg, 30);
//printf("\npassword:%s\n",msg);
for(;;)
{
my_string = (char *) malloc (nbytes + 1);
bytes_read = getline (&my_string, &nbytes, stdin);
write(client_sockfd, my_string, nbytes);
free(my_string);
signal(SIGINT,sighandler);
}
close(client_sockfd);
}
}
}
client
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
int sockfd;
int len;
struct sockaddr_un address;
char socketname;
int result;
int bytes_read;
int nbytes = 100;
char msg[20];
char *my_string;
pthread_t th1;
pthread_t th2;
int j=0,k=0;
void sighandler ()
{
if(k!=0)
printf("\nRicevuto segnale di terminazione\nprogramma in esecuzione per %d minuti e %d secondi\n",k,j);
else
printf("\nRicevuto segnale di terminazione\nprogramma in esecuzione per %d secondi\n",j);
exit(0);
}
void* thread_body1 (void* var)
{
for(;;)
{
sleep(1);
j++;
if(j==60)
{
k++;
j=0;
}
}
}
void* thread_body2 (void* var)
{
for(;;)
{
sleep(1);
read(sockfd, msg, nbytes);
printf("server:%s\n",msg);
signal(SIGINT,sighandler);
}
}
int main()
{
if(pthread_create (&th1,0,thread_body1,0)<0)
{
printf("Errore in create");
exit(1);
}
printf("Digitare nome del socket per la ricezione a cui connettersi:");
scanf("%s",address.sun_path);
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
address.sun_family = AF_UNIX;
len = sizeof(address);
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1)
{
perror("impossibile connettersi al server");
exit(1);
}
//printf("Digitare nome utente:");
//scanf("%s",msg);
//write(sockfd, &msg, 30);
//printf("Digitare password:");
//scanf("%s",msg);
//write(sockfd, &msg, 30);
if(pthread_create (&th2,0,thread_body2,0)<0)
{
printf("Errore in create");
exit(1);
}
sleep(1);
for(;;)
{
printf("*1* ");
my_string = (char *) malloc (nbytes + 1);
printf("*2* ");
bytes_read = getline (&my_string, &nbytes, stdin);
printf("*3* ");
write(sockfd, my_string, nbytes);
printf("*4* ");
free(my_string);
printf("*5* ");
signal(SIGINT,sighandler);
}
close(sockfd);
exit(0);
}
Nella versione scritta di seguito la chat funziona solo dal server verso il client,se il client scrive mi da l'errore "segmentation fault", vorrei risolvere questo problema e inserire qualche semplice operazione su file,ad esempio un piccolo txt dove ci sono dati del ora-giorno-nome utente usando le sistem call open,write e read
Ecco i codici,spero possiate aiutarmi
Server
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
int server_sockfd, client_sockfd;
int server_len, client_len;
int status;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
char socketname;
int bytes_read;
char *my_string;
char msg[30];
pid_t pid;
char s;
pthread_t th1;
pthread_t th2;
int j=0,k=0;
int nbytes = 100;
void sighandler ()
{
if(k!=0)
printf("\nRicevuto segnale di terminazione\nprogramma in esecuzione per %d minuti e %d secondi\n",k,j);
else
printf("\nRicevuto segnale di terminazione\nprogramma in esecuzione per %d secondi\n",j);
exit(0);
}
void* thread_body1 (void* var)
{
for(;;)
{
sleep(1);
j++;
if(j==60)
{
k++;
j=0;
}
}
}
void* thread_body2 (void* var)
{
for(;;)
{
sleep(1);
read(server_sockfd, msg, nbytes);
printf("server:%s\n",msg);
signal(SIGINT,sighandler);
}
}
int main()
{
if(pthread_create (&th1,0,thread_body1,0)<0)
{
printf("Errore in create");
exit(1);
}
printf("Digitare:\ne - per le informazioni sulla scheda di rete ethernet\nw - per le informazioni sulla scheda di rete wireless\n qualsiasi altro carattere per non ottenre informazioni\n------>");
scanf("%c",&s);
switch(s)
{
case 'e':
pid=fork();
if (pid==0)
{
printf("figlio:il mio pid è %d,il ppid è %d,sto per eseguire ifconfig eth0\n",getpid(),getppid());
execl("/sbin/ifconfig", "ifconfig eth0","eth0",(char *) 0);
return 0;
}
break;
case 'w':
pid=fork();
if (pid==0)
{
printf("figlio:il mio pid è %d,il ppid è %d,sto per eseguire ifconfig eth1\n",getpid(),getppid());
execl("/sbin/ifconfig", "ifconfig eth1","eth1",(char *) 0);
return 0;
}
break;
default:
printf("Nessuna informazione richiesta");
}
{
wait(&status); //da controllare se serve o no
printf("Digitare nome del socket per l'invio:");
scanf("%s",&socketname);
server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, &socketname);
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
listen(server_sockfd, 5);
if(pthread_create (&th2,0,thread_body2,0)<0)
{
printf("Errore in create");
exit(1);
}
while(1)
{
printf("creato socket con nome %s\nin attesa...\n",server_address.sun_path);
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, &client_len);
//read(client_sockfd,msg, 30);
//printf("\nusername:%s",msg);
//read(client_sockfd,msg, 30);
//printf("\npassword:%s\n",msg);
for(;;)
{
my_string = (char *) malloc (nbytes + 1);
bytes_read = getline (&my_string, &nbytes, stdin);
write(client_sockfd, my_string, nbytes);
free(my_string);
signal(SIGINT,sighandler);
}
close(client_sockfd);
}
}
}
client
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
int sockfd;
int len;
struct sockaddr_un address;
char socketname;
int result;
int bytes_read;
int nbytes = 100;
char msg[20];
char *my_string;
pthread_t th1;
pthread_t th2;
int j=0,k=0;
void sighandler ()
{
if(k!=0)
printf("\nRicevuto segnale di terminazione\nprogramma in esecuzione per %d minuti e %d secondi\n",k,j);
else
printf("\nRicevuto segnale di terminazione\nprogramma in esecuzione per %d secondi\n",j);
exit(0);
}
void* thread_body1 (void* var)
{
for(;;)
{
sleep(1);
j++;
if(j==60)
{
k++;
j=0;
}
}
}
void* thread_body2 (void* var)
{
for(;;)
{
sleep(1);
read(sockfd, msg, nbytes);
printf("server:%s\n",msg);
signal(SIGINT,sighandler);
}
}
int main()
{
if(pthread_create (&th1,0,thread_body1,0)<0)
{
printf("Errore in create");
exit(1);
}
printf("Digitare nome del socket per la ricezione a cui connettersi:");
scanf("%s",address.sun_path);
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
address.sun_family = AF_UNIX;
len = sizeof(address);
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1)
{
perror("impossibile connettersi al server");
exit(1);
}
//printf("Digitare nome utente:");
//scanf("%s",msg);
//write(sockfd, &msg, 30);
//printf("Digitare password:");
//scanf("%s",msg);
//write(sockfd, &msg, 30);
if(pthread_create (&th2,0,thread_body2,0)<0)
{
printf("Errore in create");
exit(1);
}
sleep(1);
for(;;)
{
printf("*1* ");
my_string = (char *) malloc (nbytes + 1);
printf("*2* ");
bytes_read = getline (&my_string, &nbytes, stdin);
printf("*3* ");
write(sockfd, my_string, nbytes);
printf("*4* ");
free(my_string);
printf("*5* ");
signal(SIGINT,sighandler);
}
close(sockfd);
exit(0);
}