PDA

Visualizza la versione completa : [C] Socket


Fusic86
20-09-2013, 16:32
Ho diversi problemi con il seguente programma, che deve far comunicare 2 processi tramite socket.
SERVER:

while(1){
connfd=accept(listenfd,(struct sockaddr*) &client,(socklen_t *)sizeof(client));
pid=fork();
if(pid!=0){/*processo padre*/
sleep(1);
close(connfd);
}else{/*processo figlio*/
char buffer[50];
int carta;
int colla;
int ink;
close(listenfd);
//comunicazione tramite connfd
printf("SERVER:connessione accettata, commesso in attesa\n");
//il commesso attende la richiesta dalla tipografia
read(connfd,&buffer,sizeof(buffer));
printf("COMMESSO: ordine ricevuto(%s)\n",buffer);
carta = strcmp(buffer,"carta");
colla = strcmp(buffer,"colla");
ink = strcmp(buffer,"ink");
if(carta==0){
write(connfd,"100carta",8);
read(connfd,&buffer,sizeof(buffer));
printf("COMMESSO: pagamento ricevuto.(%s)\n",buffer);
}else if(colla==0){
write(connfd,"100colla",8);
read(connfd,&buffer,sizeof(buffer));
printf("COMMESSO: pagamento ricevuto.(%s)\n",buffer);
}else if(ink==0){
write(connfd,"100ink",6);
read(connfd,&buffer,sizeof(buffer));
printf("COMMESSO: pagamento ricevuto.(%s)\n",buffer);
}

close(connfd);
printf("COMMESSO: connessione chiusa.\n");
exit(0);
}
}
CLIENT:(riporto solo 1 dei 3 casi di comunicazione, tanto sono uguali)


while(1){
completato=consuma(&tipografia[ID].carta,&tipografia[ID].colla,&tipografia[ID].ink);
if(completato==0){
printf("Lavoro eseguito con successo da Tipografia %d:\n",ID+1);
printf("Rimanenze:\n-carta->%d\n-colla->%d\n-ink->%d\n",tipografia[ID].carta,tipografia[ID].colla,tipografia[ID].ink);
sleep(3);
}else{
switch (completato){
case -1:{
printf("Tipografia %d: Carta terminata.\n",ID+1);
//creo il socket(ricordati di chiuderlo!!!)
int sockfd;

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
perror("Errore nella creazione della socket");
exit(1);
}
if (connect(sockfd, (struct sockaddr *) &server, sizeof server) == -1){
perror("Errore nella connessione al socket");
exit(1);
}
printf("Tipografia %d: connessione accettata(Richiedo carta).\n", ID+1);

write(sockfd,"carta",sizeof(buffer));
read(sockfd,&buffer,sizeof(buffer));
printf("Tipografia %d: consegna ricevuta.(%s)\n",ID+1,buffer);
tipografia[ID].carta=tipografia[ID].carta+100;
write(sockfd,"pagamento carta",15);
printf("Tipografia %d: pagamento effettuato.\nChiudo connessione.\nRiprendo produzione.",ID+1);
close(sockfd);
break;
}......
1: il commesso riceve un messaggio che stampato a video incomprensibile(serie di simboli), quando il massaggio passato era la semplice stringa "carta". Devo effettuare la codifica/decodifica?
2:essendo il messaggio incomprensibile il commesso non entra in nessuno dei casi IF e mi stampa Connessione chiusa(fin qui tutto apposto). Il Client stampa a video "Consegna ricevuta(anch'esso una serie di caratteri non codificati)" come se il server avesse effettuato la write di spedizione successiva alla read dell'ordine, dopo aver effettuato i vari strcmp. Ovviamente il client si blocca perch l'ultima write(del pagamento) non trova nessuna socket aperta dall'altra parte(e non dovrebbe darmi un errore invece che bloccarsi?)

Quali possono essere i problemi?

Sto impazzendo con queste benedette socket

Fusic86
20-09-2013, 19:05
trovati gli errori(grazie ad un amico).
Se pu servire/interessare era sbagliato il passaggio del 3 parametro dell'accept e soprattutto il buffer di lettura.
Quando legge una stringa, tipo "carta", si deve riempire l'ultima posizione dell'array di caratteri con uno 0, nel seguente modo:
int nbytes=read(sockfd,&buffer,sizeof(buffer);
buffer[nbytes]=0;
in questo modo la stringa leggibile e comparabile e quant'altro

Loading