Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [C] Socket

  1. #1

    [C] Socket

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

    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;
    						}......
    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

  2. #2
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.