PDA

View Full Version : [C] scambio di stringhe tra client e server


jarno
06-03-2009, 12:44
Ciao a tutti,

ho creato un server e un client in C. La mia prima prova è quella di spedire dal client al server due interi e il server risponde al client con la somma dei due addendi. E tutto ciò funziona perfettamente.
Il mio prossimo quesito sarebbe quello di inviare al server una parola ("CIAO") e il server risponda al client con un altra parola("UH?") e una volta risposto chiuda il canale.

Ora posto solo il codice senza i collegamenti tra client e server, i quali sono funzionanti:

lato server:


static void add_server (int connfd)
{
char buf[MAXBUFL];
size_t n;
char a;

while ((n = Readline (connfd, buf, sizeof(buf)-1)) > 0)
{
char a;
buf[n] = '\0';
if (sscanf(buf,"%c",a) == "CIAO")
snprintf (buf, sizeof(buf), "HU?\r\n");
else
snprintf (buf, sizeof(buf), "Parola sbagliata\r\n", a);
Writen (connfd, buf, strlen(buf));
exit(0);
}



lato client:


static void add_client (int sockfd)
{
ssize_t n;
char buf[MAXBUFL+1];
char a;


while ( (n = Readline(0,buf,sizeof(buf))) > 0)
{
Writen (sockfd, buf, n);
if ( (n = Readline(sockfd,buf,sizeof(buf))) > 0)
Writen (1, buf, n);
else
err_quit("(%s) error - unexpected EOF from server", prog);
}
}
}


e quando compilo e lancio il tutto mi da questo errore:
error - unexpected EOF from server


Come potrei fare questo esercizio?
Dovrei inviare una parola e riceverne una di risposta.

Grazie in anticipo :)

jarno
09-03-2009, 11:48
nessuno?

agente mm8
09-03-2009, 14:27
Per favore usa i tag code, poi vedremo di risolvere insieme il problema

cionci
09-03-2009, 16:38
Devi usare le parentesi quadre.

jarno
10-03-2009, 20:11
ho modificato i programmi, ma al posto di riceve la stringa desiderata(inviata dal server) ricevo una serie di caratteri random (anche se poi sono sempre le stesse, quindi tanto random non sono)

lato client


#include <sys/types.h>
#include <sys/socket.h>
//"in" per "sockaddr_in"
#include <netinet/in.h>
//"netdb" per "gethostbyname"
#include <netdb.h>
#include <stdio.h>
#include <string.h>

#define MAX 16

int main(void)
{
int r_value;
int sd;
struct sockaddr_in server;
int server_dim;

sd=socket(AF_INET,SOCK_STREAM,0);
server_dim=sizeof(struct sockaddr_in);
server.sin_family=AF_INET;
server.sin_port=htons(9999);
server.sin_addr.s_addr=inet_addr("127.0.0.1");
r_value=connect(sd,(struct sockaddr *)&server,server_dim);
if(r_value==0)
{
printf("Connessione avvenuta\n");
}
if(r_value==-1)
{
printf("Non è stato possibile effettuare una connessione\n");
exit(-1);
}

char buf[MAX];
int rec;

rec=recv(sd,&buf,MAX,0);
if(rec<0)
printf("Errore ricezione\n");
printf("Ricezione avvenuta\n");


printf("Ricevuto saluto \"%s\"\n", buf);


close(sd);


}




lato server


#include <sys/types.h>
#include <sys/socket.h>
//"in" per "sockaddr_in"
#include <netinet/in.h>
//"fcntl" per la funzione "fcntl"
#include <fcntl.h>
#include <stdio.h>
#include <string.h>

#define MAX 16

int main(void)
{
int r_val;
int sd,cd;
struct sockaddr_in server,client;
int server_dim,client_dim;

sd=socket(AF_INET,SOCK_STREAM,0);
server_dim=sizeof(struct sockaddr_in);
server.sin_family=AF_INET;
server.sin_port=htons(9999);
server.sin_addr.s_addr=INADDR_ANY;
r_val=bind(sd,(struct sockaddr *)&server,server_dim);
if(r_val==-1)
{
printf("Impossibile aprire una porta in ascolto\n");
exit(-1);
}
listen(sd,5);

cd=accept(sd,(struct sockaddr *)&client,&client_dim);
if(cd==-1)
{
printf("Impossibile aprire una connessione di ingresso\n");
exit(-2);
}
if((r_val==0) && (cd==0))
{
printf("Connessione avvenuta\n");
}






char buf[MAX];
strcpy(buf,"aiaooo");
send(sd,buf,strlen(buf), 0);
printf("%s\n",buf);


close(sd);


}

jarno
11-03-2009, 00:47
risolto...avevo sbagliato il socket del client server, era cd e non sd

cionci
11-03-2009, 00:49
L'errore è qui:

rec=recv(sd,&buf,MAX,0);