2011-10-15 13 views
7

Ho ottenuto un descrittore per un socket TCP nel modo seguente:I descrittori per i socket possono essere convertiti in puntatori di file?

int desc = accept(socket_descriptor, &client_address, &len)

Ora da questo descrittore desc voglio ottenere un puntatore a file. È possibile utilizzare fdopen() qui?

Il motivo per cui voglio ottenere un puntatore di file è perché sto apportando modifiche a un codice esistente che scrive dati su un file locale. Ora, voglio estendere la sua funzionalità in modo che possa scrivere in alternativa su un client TCP. Non voglio riscrivere tutte le funzioni e pensavo di riuscire in qualche modo a utilizzare l'infrastruttura esistente. Le funzioni esistenti usano il puntatore del file per scrivere sul file. Mi stavo chiedendo se fosse possibile rendere la stessa funzione scrivere su un flusso TCP senza apportare modifiche.

risposta

8

Sì, fdopen() è esattamente quello che ti serve. Ecco cosa man page sta dicendo su di esso:

La funzione fdopen() associa un flusso con l'esistente file di descrittore, fd. La modalità del flusso (uno dei valori "r", "r +", "w", "w +", "a", "a +") deve essere compatibile con la modalità del descrittore del file . L'indicatore di posizione del file del nuovo stream è impostato su appartenente a fd e gli indicatori di errore e di fine del file sono deselezionati. Le modalità "w" o "w +" non causano il troncamento del file. Il descrittore di file non è duplicato e verrà chiuso quando lo stream creato da fdopen() viene chiuso. Il risultato dell'applicazione di fdopen() a un oggetto memoria condivisa non è definito.

Ma usarlo con cautela quando si applica ai descrittori di socket. Le funzioni di I/O di alto livello utilizzano il buffering e possono inviare dati in modo diverso (ad esempio quando lo \n viene rilevato nello stream, inserire \r ecc.)

+1

La maggior parte dei file non ha buffer di riga, solo 'stdout'. Non sono sicuro che ci sia un modo per impostare un file per il buffer di linea, ma credo che la maggior parte sarà un buffer di blocchi, che dovrebbe essere un po 'più adatto al socket. –

+0

@ChrisLutz: la funzione è 'setlinebuf'. Penso che 'stdout' è solo a livello di linea se è collegato a un terminale, ma non ne sono sicuro. –

+0

@DietrichEpp - Grazie. E penso che tu abbia ragione su 'stdout'. –

Problemi correlati