IL codice che segue è funzionante, l'ho realizzato in prospettiva del codice che postero' dopo e che invece mi da problemi.
Di seguito, server e client che si connettono attraverso socket in tcp, il client invia dei messaggi che vengono visualizzati dal server.
Quando dal client si inserisce la stringa "quit", il server invia un messaggio "fatto" al client che l ovisualizza. Il server chiude la connessione con il client e si mette in attesa di un ulteriore connessione da un altro client.
Codice server in c sotto Linux:
//prova server scambio stringhe in TCP
//
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/signal.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
//
#define ERRORE_(x) {puts(x);exit(1);}
#define MAX_CODA 1
#define MAX_DIM 1024
//
int main(void)
{
int ds_sock,ds_sock_acc,ret,lenght;
char buff[MAX_DIM];
struct sockaddr_in server;
struct sockaddr client;
//
system("clear");
ds_sock=socket(AF_INET,SOCK_STREAM,0);
if (ds_sock==-1) ERRORE_("CHIAMATA SOCKET FALLITA!!");
//
server.sin_family=AF_INET;
server.sin_port=htons(1569);
server.sin_addr.s_addr=INADDR_ANY;
ret=bind(ds_sock,(struct sockaddr*)&server,sizeof(server));
if (ret==-1) ERRORE_("CHIAMATA bind FALLITA!!");
ret=listen(ds_sock,1);
if (ret==-1) ERRORE_("CHIAMATA listen FALLITA!!");
//
signal(SIGCHLD,SIG_IGN);
lenght=sizeof(client);
//
printf("in attesa di connessione da parte del client!!\n\n");
//
while(1)
{
while((ds_sock_acc=accept(ds_sock,&client,&lenght) )==-1);
printf("client connesso!!\n\n");
if (fork()==0)
{ close(ds_sock);
do
{
read(ds_sock_acc,buff,MAX_DIM);
printf("messaggi client: %s\n",buff);
//getchar();
}
while (strcmp(buff,"quit")!=0);
write (ds_sock_acc,"\n\nfatto",10);
close(ds_sock_acc);
printf("\nclient disconnesso!!\n\n");
printf("\nin attesa di connessione da nuovo client!!\n\n");
exit(0);
}
else close(ds_sock_acc);
}//while(1)
}
__________________________________________________ _______________
codice client in c sotto Linux:
//client per invio stringhe
//
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/signal.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
//#include <string.h>
#include <stdlib.h>
//
#define ERRORE_(x) {puts(x);exit(1);}
#define MAX_DIM 1024
#define MAX_CODA 3
int main(void)
{
char indserver[30];
char buff[MAX_DIM];
char risp[1];
int ds_sock,ret;
struct sockaddr_in client;
struct hostent *hp;
//
system("clear");
ds_sock=socket(AF_INET,SOCK_STREAM,0);
if (ds_sock==-1) ERRORE_("CHIAMATA socket FALLITA!!");
//
client.sin_family=AF_INET;
client.sin_port=htons(1569);
//
//strcpy(risp,"x");
printf("il server si trova su una macchina remota? s/n\n\n");
scanf("%s",risp);
while((strcmp(risp,"s")!=0)&&(strcmp(risp,"n")!=0) )
{
printf("\nscelta sbagliata, ripetere!!\n\n");
printf("il server si trova su una macchina remota? s/n\n\n");
scanf("%s",risp);
}
if (strcmp(risp,"s")==0)
{
printf("\ninserire l'indirizzo del server\n\n");
scanf("%s",indserver);
}
else if (strcmp(risp,"n")==0) strcpy(indserver,"127.0.0.1");
//
signal(SIGINT,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
//
hp=gethostbyname(indserver);
client.sin_addr.s_addr=((struct in_addr*)(hp->h_addr))->s_addr;
//bcopy(hp->h_addr,&client.sin_addr,hp->h_lenght);
ret=connect(ds_sock,(struct sockaddr *)&client,sizeof(client));
if (ret==-1)
{
perror("CHIAMATA SISTEMA connect FALLITA!!");
exit(1);
}
//
printf("\nConnesso al server!!\n");
printf("\ndigitare le stringhe da trasferire,quit per terminare!!\n\n");
do
{
scanf("%s",buff);
write(ds_sock,buff,MAX_DIM);
}
while(strcmp(buff,"quit")!=0);
read(ds_sock,buff,MAX_DIM);
printf("\nmessaggio dal server%s\n\n",buff);
close(ds_sock);
}
-----------------------------------------------------------------------------------------------
Come detto questo codice funziona perfettamente.Invece ora ho tentato di creare un client che propone un menu di scelta . Se scelgo 'a' il server fa una cosa , se scelgo 'b' un altra , con 'c' avrebbe lo stesso effetto del "quit" del codice sopra.
Purtroppo nn va quando da scanf (dal client) inserisco il carattere ,il server nn fa nulla .
codice client:
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/signal.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
//#include <string.h>
#include <stdlib.h>
//
#define ERRORE_(x) {puts(x);exit(1);}
#define MAX_DIM 1024
#define MAX_CODA 3
int main(void)
{
char indserver[30];
char buff[MAX_DIM];
char risp[1];
char scelta[1];
int ds_sock,ret;
struct sockaddr_in client;
struct hostent *hp;
//
system("clear");
ds_sock=socket(AF_INET,SOCK_STREAM,0);
if (ds_sock==-1) ERRORE_("CHIAMATA socket FALLITA!!");
//
client.sin_family=AF_INET;
client.sin_port=htons(1569);
//
//strcpy(risp,"x");
printf("il server si trova su una macchina remota? s/n\n\n");
scanf("%s",risp);
while((strcmp(risp,"s")!=0)&&(strcmp(risp,"n")!=0) )
{
printf("\nscelta sbagliata, ripetere!!\n\n");
printf("il server si trova su una macchina remota? s/n\n\n");
scanf("%s",risp);
}
if (strcmp(risp,"s")==0)
{
printf("\ninserire l'indirizzo del server\n\n");
scanf("%s",indserver);
}
else if (strcmp(risp,"n")==0) strcpy(indserver,"127.0.0.1");
//
//signal(SIGINT,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
//
hp=gethostbyname(indserver);
client.sin_addr.s_addr=((struct in_addr*)(hp->h_addr))->s_addr;
//bcopy(hp->h_addr,&client.sin_addr,hp->h_lenght);
ret=connect(ds_sock,(struct sockaddr *)&client,sizeof(client));
if (ret==-1)
{
perror("CHIAMATA SISTEMA connect FALLITA!!");
exit(1);
}
//
printf("\nConnesso al server!!\n");
//printf("\ndigitare le stringhe da trasferire,quit per terminare!!\n\n");
do
{ printf("\nscelta a/b, c x uscire :");
scanf("%s",scelta);
while(getchar()!='\n');
if (strcmp(scelta,"a")==0)
{ printf("prima opzione");
write(ds_sock,scelta[0],1);
}
else if (strcmp(scelta,"b")==0)
{ printf("seconda opzione");
write(ds_sock,scelta[0],1);
}
}
while(strcmp(scelta,"c")!=0);
read(ds_sock,buff,MAX_DIM);
printf("\nmessaggio dal server%s\n\n",buff);
close(ds_sock);
}
- - - - - ----------------------------------------------
codice server :
//scelta server
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/signal.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//
#define ERRORE_(x) {puts(x);exit(1);}
#define MAX_CODA 1
#define MAX_DIM 1024
//
int main(void)
{
int ds_sock,ds_sock_acc,ret,lenght,n;
char buff[MAX_DIM];
struct sockaddr_in server;
struct sockaddr client;
//
system("clear");
ds_sock=socket(AF_INET,SOCK_STREAM,0);
if (ds_sock==-1) ERRORE_("CHIAMATA SOCKET FALLITA!!");
//
server.sin_family=AF_INET;
server.sin_port=htons(1569);
server.sin_addr.s_addr=INADDR_ANY;
ret=bind(ds_sock,(struct sockaddr*)&server,sizeof(server));
if (ret==-1) ERRORE_("CHIAMATA bind FALLITA!!");
ret=listen(ds_sock,1);
if (ret==-1) ERRORE_("CHIAMATA listen FALLITA!!");
//
signal(SIGCHLD,SIG_IGN);
lenght=sizeof(client);
//
printf("in attesa di connessione da parte del client!!\n\n");
//
while(1)
{
while((ds_sock_acc=accept(ds_sock,&client,&lenght) )==-1);
printf("client connesso!!\n\n");
if (fork()==0)
{ close(ds_sock);
do
{
read(ds_sock_acc,buff,MAX_DIM);
printf("messaggi client: %s\n",buff);
}
while (strcmp(buff,"c")!=0);
write (ds_sock_acc,"\n\nfatto",10);
close(ds_sock_acc);
printf("\nclient disconnesso!!\n\n");
printf("\nin attesa di connessione da nuovo client!!\n\n");
exit(0);
}
else close(ds_sock_acc);
}//while(1)
}
-----------------------------------------------------------------------------------------------
nn riesco a capire xchè qui il server nn riceve i caratteri e agisca di conseguenza.
In origine il codice era +complesso , asseconda della scelta del client il server faceva una chiamata ad una determinata funzione, ma visto che nn va nemmeno cosi ho preferito semplificare e incentrare sul problema.
Insomma mi pare che la read nn riceva il carattere giusto.
nn so più DOVE SBATTERE.
SPERO VIVAMENTE IN UN AIUTO!!