View Single Post
Old 26-01-2010, 08:48   #1
Metal2001
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 1117
[C] Problema con chat con socket

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
Codice:
#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
Codice:
#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);
}
Metal2001 è offline   Rispondi citando il messaggio o parte di esso