Domanda

Quando creo un socket usando accept () e ne ricavo un FILE usando fdopen (), cosa devo fare per ripulire tutto? Devo eseguire fclose () sul FILE, shutdown () e close () sul socket, oppure solo shutdown () eo close () o fclose ()? Se non eseguo fclose (), devo liberare manualmente () il puntatore FILE?

È stato utile?

Soluzione

Da man fdopen:

  

Il descrittore di file non è dup & # 8217; ed e verrà chiuso alla chiusura dello stream creato da fdopen ()

Quindi userei solo fclose (), che chiude anche il descrittore di file sottostante. Non so nemmeno se sia necessario shutdown ().

Altri suggerimenti

Da http://opengroup.org/onlinepubs/007908775/xsh/fclose. html

  

La funzione fclose () eseguirà a   close () sul descrittore di file che è   associato al flusso indicato   in streaming.

Se hai racchiuso il tuo socket in uno stream, probabilmente non ha più senso chiudere (), almeno non prima di svuotare lo stream. Ma non lo giuro, perché non so che non ci sono usi in cui vorresti chiudere () piuttosto che chiudere ().

Qui hai 2 cose che devi ripulire: il flusso rappresentato da FILE e il descrittore di file rappresentato dal socket. Devi prima chiudere lo stream, quindi il descrittore di file. Quindi, in generale dovrai fclose () qualsiasi oggetto FILE , quindi close () qualsiasi descrittore di file.

Personalmente non ho mai usato shutdown () quando voglio ripulire dopo me stesso, quindi non posso dirlo.

modifica

Altri hanno giustamente sottolineato che fdclose () chiuderà anche il descrittore di file sottostante e poiché la chiamata di close () su un descrittore di file chiuso porterà a un errore , in questo caso hai solo bisogno di fdclose () .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top