n° 185
Maggio/Giugno 2013
Maggio 20, 2013, 05:35:18 pm *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: [C] SOCKEt tcp/ip problema con una read  (Letto 1390 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
cest31
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 2


Mostra profilo E-mail
« inserita:: Settembre 28, 2010, 02:30:06 pm »

Raga Buona sera premetto che è il mio primo post in questo forum, quindi mi scuso se erroneamente effettuo qualche errore sintattico legato alle regole del forum..
Cmq passando alle cose da veri "Smanettoni".
Mi sono inbattuto in un problema alquanto insolito , stupido, ma ahime per me complesso.
Adesso vi spiego e poi posto il codice..
Devo creare un duo Server-client che si scambino alcuni messaggi; adesso ho notato che le read scritte all'interni di cicli (while) perdono la loro qualità bloccante...Ecco questo mi sta facendo impazzire da un paio di giorni...adesso vi posto le sezioni di codice interessati..Sperando in un vostro aiuto o in una qualche vostra considerazione che mi accenda qualche lampadina...
Adesso vi posto i codici, il server scrive al client due cose e poi dovrebbe attendere una risposta dal client,attendere grazie alla read che blocca.Ma niente la read non ne vuole proprio sentire a bloccare..

Ecco il Server
void effective_game(int sock,int gettoni){
   srand(time(NULL));
   int carta,letti,k=0;
   char carta_clie, seme_clie,seme_send[1],clie_send[1],mia_carta[1],scelta[2],scleta[2];
   char mazzo1[]="23456789LJKQA23456789LJKQA23456789LJKQA23456789LJKQA";
   char mazzo2[]="FFFFFFFFFFFFFQQQQQQQQQQQQQPPPPPPPPPPPPPCCCCCCCCCCCCC";
   do{
      carta_clie = mazzo1[rand()%51+0];
      seme_clie = mazzo2[rand()%51+0];   
      seme_send[0]=seme_clie;
      clie_send[0]=carta_clie;
      write(sock,clie_send,1);
      write(STDOUT_FILENO,clie_send,1);
      write(sock,seme_send,1);
      write(STDOUT_FILENO,seme_send,1);
      letti=read(sock,scelta,1);        // Questa è la read che non fa da bloccante
                scelta[1]='\0';
      write(STDOUT_FILENO,scelta,strlen(scelta));
     }while((atoi(scelta))==2);



Ecco il client

if(pipe(pi_pip)<0){
            printf("ERRORE PIPE");}
if(pipe(popo)<0){
            printf("ERRORE PIPE");}                                 
while(y==0){                                   
           if((pid=fork())<0){
            printf("ERRORE FORK");}
      else if(pid==0){                           //figlio
            write(STDOUT_FILENO,"\nCosa vuole fare??\n\n1)Fermarsi\n2)Chiamare carta\n3)Abbandonare la mano\n",70);         
            alarm(30);
                               scanf("%s",buff);                           
                      alarm(0);
                      close(popo[0]);
                 write(popo[1],"scritto",7);
                 close(pi_pip[0]);
                 write(pi_pip[1],buff,1);
                 exit(0);}
         else if(pid!=0){
                wait(0);                       
            close(popo[1]);
                  read(popo[0],buffer,7);
                  if(strncmp(buffer,"scritto\0",7)==0){
                              close(pi_pip[1]);
                              letti=read(pi_pip[0],risp_input,1);   
                              write(socket,risp_input,1);}             QUI  è DOVE MANDO L'INFORMAZIONE AL SERVER
Registrato
Malo88
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 2


Mostra profilo
« Risposta #1 inserita:: Novembre 27, 2011, 11:31:49 pm »

Ciao, non so se hai risolto, però conta che ad ogni write deve corrispondere una read dall'altro capo e viceversa. Questo perchè una write potrebbe involontariamente sbloccare una read quando non dovrebbe. E' come mandare un ACK dall'altra parte. E' possibile che la tua read venga sbloccata in quanto riceva una write. Dovresti innanzitutto provare a stampare quello che ti restituisce la read per capire cosa l'ha sbloccata. Fammi sapere
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page