Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    337

    [C -LINUX] funzione recv

    ho imprementato un server e un client semplicissimi, il problema è il seguente, il server manda dei caratteri , il client li riceve.
    solitamente utilizzo un terminatore come ultimo carattere, oppure conosco a priori quanti caratteri mi saranno inviati, ma in questo caso la situazione è differente.

    non conosco quanti caratteri mi saranno inviati dal server e non so quale sia l'ultimo carattere.

    la funzione recv:

    recv(sd, &carattere, 1,0)

    mi restituisce il numero di caratteri ricevuti, ma se non so quanti caratteri devo ricevere come posso fare?

    grazie mille.

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    337
    ma io sapevo che la recv è bloccante e quindi se non riceve niente rimane semplicemente in attesa e non esce.

    è cos'? oppure a un certo punto si sblocca e mi restituisce -1 o 0?

    grazie

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    No, rimane bloccata fino a quando il socket dall'altra parte viene chiuso.
    Per fare quello che ti serve devi crearti un protocollo.
    Ad esempio, i primi quattro byte informano quanti byte vengono spediti nella riga seguente.
    Oppure puoi codificare i byte in formato base64 e usare un \n per terminare la stringa.
    Puoi anche documentarti sulla - select - che però non ho mai usato.

  5. #5
    Si recv è bloccante, ritorna zero quando riceve un pacchetto col flag FIN.
    Puoi usare fcntl per settare to O_NONBLOCK così recv ritorna -1 se non ci sono più dati da leggere.
    codice:
    fcntl(socket_descriptor, F_SETFL, O_NONBLOCK);
    oppuri usi select()


  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    337
    Originariamente inviato da shodan
    No, rimane bloccata fino a quando il socket dall'altra parte viene chiuso.
    Per fare quello che ti serve devi crearti un protocollo.
    Ad esempio, i primi quattro byte informano quanti byte vengono spediti nella riga seguente.
    Oppure puoi codificare i byte in formato base64 e usare un \n per terminare la stringa.
    Puoi anche documentarti sulla - select - che però non ho mai usato.
    ho provato a scrivere dopo la connect: fcntl(sd, F_SETFL, O_NONBLOCK);

    dove sd è il mio socket, ma se la metto subito dopo la connect mi esce subito, dove la devo inserire nel codice prima della recv?


    grazie

  7. #7

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    337
    niente da fare io ho scritto:
    codice:
    a
    	sd=socket(AF_INET, SOCK_STREAM, 0);
    	fcntl(sd, F_SETFL, O_NONBLOCK);
    ...
    ...
    ..
    	{while(1){
    		error=recv(sd,&ch,1,0);
    		if(error>0)
    		printf("\nil carattere ricevuto è : %c , il valore di error è: %d", ch, error);
    		if(error<=0) break;
    		}
    ma il problema è in stostanza che la connect se agigungo questa riga NON si connette, mi ritorna -1 nel client.

    grazie

  9. #9

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.