Ho diversi problemi con il seguente programma, che deve far comunicare 2 processi tramite socket.
SERVER:
CLIENT:(riporto solo 1 dei 3 casi di comunicazione, tanto sono uguali)codice: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); } }
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?codice: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; }......
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

Rispondi quotando