Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    mi fallice case 2 dello swich..usato nei socket

    ciao a tutti...

    non riesco a capire il xke mi chiude subito il server
    se cerco di eseguire il case 2

    vi posto qui il mio codice dei vari switch case..e se necessario l'intero codice del programma..

    client :

    codice:
    k: while((choise=comunicazione(conn_s))=='r')
       {
    		printf("client:inserire numero valido \n");
       }
    	
       switch (choise)
       {
       case '0': exit(0);
    	   break;
       case '1':visualizzamappa(conn_s);
    	   ;break;
       case '2':
    	   char postistr[TEXT_LENGTH];
    	   int numposti;
    	   puts("inserisci il numero di posti da prenotare");
    	   errore=(scanf("%s",postistr));
    	   if(errore<0)
    	   {	
    		   if(WSAGetLastError()==WSAEINTR)
    							{
    							printf("errore nella scanf");
    							SendMessage(HWND_BROADCAST,my_mex_type,0,0);
    							exit(-1);// uscita
    							}
    	   }
    	   if(verificastringa(postistr)!=-1)
    	   {
    			numposti=atoi(postistr);
    	   }
    	   else numposti=-1;
    	   if(numposti<=0|| numposti>127)
    	   {
    			puts("Errore:	numero posti inserito non valido.al max è possibile prenotare 127 posti,SALA PERMETTENDO");
    	   }
    	   else 
    	   leggiposti( numposti,conn_s);
    	   break;
       case '3':disdici(conn_s); 
    	   break;
       default: break;
       }
    
       printf("client:proseguire con un altra operazione? Y per si altro per no: ");
    
       fgets(buffer,MAX,stdin);
       if(buffer[0]=='y' || buffer [0]=='Y')
       {
    		if(send(conn_s,"y",sizeof(buffer),0)==-1)
    		{
    				if(WSAGetLastError()==WSAEHOSTDOWN)
    				{
    						printf("client:errore nella send");
    						SendMessage(HWND_BROADCAST,my_mex_type,0,0);
    						system("PAUSE");
    						exit(-1);
    				}
    		}
    		system("PAUSE");
    		goto k;
       }
       system("PAUSE");
       WSACleanup();
       }
    e del server :

    codice:
    switch (choise)
    {
    
    
    				// esci
    			case 0: printf("uscita \n");
    				send (conn,"0",strlen(buffer),0); //strlen restituisce lunghezza della stringa
    
    				//chiusura del socket
    				if(closesocket(conn) ==SOCKET_ERROR)
    				{
    						fprintf(stderr,"server :errore nella chiusura del socket");
    						exit(EXIT_FAILURE);
    				}
    
    				//rimuovo il file alla chiusura
    
    				remove("codici");
    				remove("mappa");
    
    				//terminazione dell utilizzo di Windows Socket per tutti i thread
    
    				WSACleanup();
    				exit(0);
    			break;
    
    
    			//visualizzare la mappa
    		case 1: 
    				if(priorita==0 ||priorita==2)
    				{
    						char postidainv[dim1*dim2];
    						matrixtoposti(postidainv);
    						send(conn,postidainv,dim1*dim2,0);
    				send(conn,"1",strlen(buffer),0);
    				}
    				else
    					{
    						send(conn,"r",MAX,0);
    						goto k;
    						break;
    					}
    				caricamappa();
    		break;
    
    
    			//prenotare i posti
    
    		case 2:
    			
    			
    		if(priorita ==1 || priorita ==2)
    		{
    			int t=0;
    			char risp[7];
    			int numposti=(int) buffer[1];
    			char buffer2[1000];
    			int r=recv(conn,buffer2,sizeof(buffer2),0);
    			if(r==0|| r==-1)
    			{
    					if(WSAGetLastError()==WSAEINTR)
    					{
    						// SE ERRORE DOVUTO AD UNA INTERRUZIONE
    
    						SendMessage(NULL,my_mex_type,0,0);
    						//invio messaggio indicante errore nella comunicazione
    					}
    			}
    			int s;
    			while(t<numposti)
    			{
    					s=occupaposto((buffer2[t*2])-1,(buffer2[1+(t*2)])-1);
    					risp[5]=buffer2[t*2];
    					risp[6]=buffer2[1+(t*2)];
    					if(s==-2)
    					{
    						//posto non disponibile
    							risp[0]='Y';
    							risp[1]='Y';
    							risp[2]='Y';
    							risp[3]='Y';
    					}
    					else 
    						if(s==-1)
    						{
    								//posto è occupato
    							risp[0]='E';
    							risp[0]='E';
    							risp[0]='E';
    							risp[0]='E';
    						}
    						else
    						{
    								//posto libero
    							errore=sprintf(risp,"%d",s);
    							if(errore<0)
    							{
    								if(WSAGetLastError()==WSAEINTR)
    								{
    										SendMessage(HWND_BROADCAST,my_mex_type,0,0);
    										exit(-1);
    								}
    							}
    						}
    						send(conn,risp,7,0);
    						t++;
    			} //chiude il while
    
    
    					send(conn,"2",strlen(buffer),0);
    		}
    			else
    				{
    					send(conn,"r",MAX,0);
    					goto k;
    					break;
    				}
    				caricacodici();
    		break;
    
    
    			//disdire i posti
    
    		case 3:
    		if(priorita==1 || priorita ==2)
    		{
    			if(buffer[1]=='C')
    			{
    					int cod;
    					char codice[4];
    					if(recv(conn,codice,sizeof(codice),0)<0)
    					{
    							printf("impossibile leggere il messaggio");
    							if(WSAGetLastError()==WSAEINTR)
    							{
    									SendMessage(HWND_BROADCAST,my_mex_type,0,0);
    										exit(-1);
    							}
    					}
    					sscanf(codice,"%d",&cod);
    					char postodadisdire[2];
    					if(recv(conn,postodadisdire,sizeof(postodadisdire),0)<0)
    					{
    							if(WSAGetLastError()==WSAEINTR)
    							{
    									SendMessage(HWND_BROADCAST,my_mex_type,0,0);
    										exit(-1);
    							}
    					}
    					int s=liberaposto(cod,(postodadisdire[0])-1,(postodadisdire[1])-1);
    					char risp[2];
    					if(s==1)
    					{
    							risp[0]='1';   //1 indica prenotazione disdetta
    							risp[1]='1';
    							send(conn,risp,sizeof(risp),0);
    					}
    					else
    					{
    							risp[0]='E'; //con E indico che è occupato
    							risp[1]='E'; 
    					}
    
    					send(conn,"3",strlen(buffer),0);
    			}
    		}
    			else 
    				{
    					send(conn,"r",MAX,0);
    					goto k;
    					break;
    				}
    			salvamappa(conn);
    			salvacodici();
    		break;
    
    		default: break;
    } // chiude lo switch

  2. #2

    Moderazione

    Il linguaggio va indicato anche nel titolo come "tag", ora correggo io, in futuro ricordatene.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    scusami

  4. #4
    Nessun problema, capita.

    Tornando al codice: al di là del fatto che la gestione degli errori della scanf è completamente sbagliata (hai letto la sua documentazione? ) mi pare che la comunicazione vera e propria avvenga in leggiposti, che non hai riportato.

    In ogni caso: senza offesa, ma mi pare che quel codice sia estremamente disordinato ed intricato in maniere strane, dovresti cercare di ripulirlo un po' e ridurre il tutto ad un esempio più compatto e facilmente compilabile/testabile, altrimenti dubito che qualcuno trovi la voglia/il tempo di stare a districarsi in quel pasticcio.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    ecco il codice di leggiposti .. riguardo la documentazione di scanf ora cerco su google grazie cmq dell'appunto

    codice:
    void leggiposti(int numposti,SOCKET conn) // permette di prenotare uno o più  posti 
    {
    	char buffer[1000];
    	buffer[0]=2;
    	buffer[1]=(char) numposti;
    	int t=0;
    	while(t<numposti)
    	{
    			int q=0;
    			char posto[TEXT_LENGTH];
    			puts("\ninserisci numero della fila");
    
    			while(q<=0 || q>127)
    			{
    					errore=scanf("%s",posto);
    
    					if(errore<0)
    						{
    							if(WSAGetLastError()==WSAEINTR)
    									{
    									printf("Errore nella scanf");
    									SendMessage(HWND_BROADCAST,my_mex_type,0,0);
    									exit(-1);// uscita
    									}
    						}
    
    			if(verificastringa(posto)!=-1)
    				{
    						q=atoi(posto); // converte stringa in intero
    				}
    			else
    					q=-1;
    					if(q<=0 || q>127)
    						puts("\n\nErrore:numero fila inserito non valido.inserisci il numero fila");
    			} // chiusura del while
    
    			buffer[2+(t*2)]=(char)q;
    
    			puts("\ninserisci il numero del posto");
    			q=0;
    
    			while( q<=0 || q>127)
    			{
    					errore=scanf("%s",posto);
    					if(errore<0)
    					{
    						if(WSAGetLastError()==WSAEINTR)
    						{
    							printf("Errore nella scanf");
    							SendMessage(HWND_BROADCAST,my_mex_type,0,0);
    							exit(-1);// uscita
    						}
    					}
    
    				if(verificastringa(posto)!=-1)
    				{
    						q=atoi(posto);
    				}
    				else
    					q=-1;
    
    					if(q<=0||q>127)
    						puts("\n\nErrore:numero posto inserito non valido.inserisci il numero di posto");
    			}
    
    			buffer[2+(t*2)+1]=(char)q;
    			++t;
    	} // chiudo while controllo su t
    	if(conn<0)
    		printf("impossibile connettersi \n");
    	int errore=send(conn,buffer,(numposti*2)+2,0);
    
    	if (errore<0)
    	{
    		if(WSAGetLastError()==WSAEINTR)
    				{
    				printf("errore nella send");
    				SendMessage(HWND_BROADCAST,my_mex_type,0,0);
    				exit(-1);// uscita
    				}
    	}
    	
    	char risp[7];
    	int q=0;
    
    	while(q<numposti)
    	{
    			errore=recv(conn,risp,sizeof(risp),0);
    			if(errore<0)
    			{
    					if(WSAGetLastError()==WSAEINTR)
    					{
    					printf("errore nella recv");
    					SendMessage(HWND_BROADCAST,my_mex_type,0,0);
    					exit(-1);// uscita
    					}
    			}
    
    		if(risp[0]=='E')
    		{
    				errore=printf("\nil posto %d,%d è occupato\n", risp[5],risp[6]);
    				if(errore<0)
    				{
    						if(WSAGetLastError()==WSAEINTR)
    						{
    							printf("errore nella printf");
    							SendMessage(HWND_BROADCAST,my_mex_type,0,0);
    							exit(-1);// uscita
    						}
    				}
    		}
    		else
    			if(risp[0]=='Y')
    				{
    						errore=printf("\n\nil posto %d,%d non è disponibile nella sala\n", risp[5],risp[6]);
    						if(errore<0)
    						{
    							if(WSAGetLastError()==WSAEINTR)
    							{
    							printf("errore nella printf");
    							SendMessage(HWND_BROADCAST,my_mex_type,0,0);
    							exit(-1);// uscita
    							}
    						}
    				puts("\ncontrollare le dimensioni della sala tramite la funzione visualizza");
    			}
    			else
    					errore=printf("\nil posto %d,%d è stato prenotato con codice %s \n", risp[5],risp[6],risp);
    					if(errore<0)
    						{
    							if(WSAGetLastError()==WSAEINTR)
    							{
    							printf("errore nella printf");
    							SendMessage(HWND_BROADCAST,my_mex_type,0,0);
    							exit(-1);// uscita
    							}
    						}
    
    			q++;
    	} // chiudi la while controllo sulla q
    }

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Bisogna anche capire che vuol dire che il server "si chiude" ... hai degli errori ? Nulla ?

    Quello che mi chiedo è cosa ci sia dopo il case 2 dello switch del server ... perché, se non c'è più nulla, è ovvio che il server termini.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    c'ero un errore subito dopo lo switch... ho risolto grazie x l'osservazione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.