2012-12-23 17 views
5

Sto lavorando su un server proxy in c. Sono andato piuttosto lontano usando una combinazione di fread e fget in posti diversi ma vorrei riconciliarmi e capire la differenza. Nell'esempio seguente, sto cercando di usare fread in un posto in cui ho usato in precedenza fget con successo. Invece il mio server ora si blocca alla linea del fread. Qual è la differenza e perché il mio programma è sospeso?bancarelle di fread su presa ma fget doesnt?

void HandleTCPClient(int clntSocket) 
{ 
    FILE *request = fdopen(clntSocket, "r"); 
    char reader[2000]; 
    size_t q; //typo before 
    while((q=fread(reader, 1, sizeof(reader), request))>0) { //hangs here! 
     printf("i read something!\n"); 
    } 
    return; 
} 

grazie !!

EDIT: così se faccio la linea "mentre ((q = fread (lettore, 1, 1, richiesta))> 0) {"

ottengo "Ho letto qualcosa di" tutto il mio schermo. ..

non so cosa significhi. Quindi è corretto che fread non farà letteralmente nulla se non c'è almeno il numero di dimensioni del buffer del tuo personaggio presente nello stream?

+0

size_t q; scusa .. digita la traduzione per impilare –

risposta

4

fgets restituisce quando viene letto un ritorno a capo mentre fread viene bloccato fino a quando il numero di byte richiesto è disponibile nello stream o su EOF. Nel tuo caso, la chiamata si blocca perché non hai 2000 byte di dati pronti nello stream.

+0

QUESTO DEVE ESSERE. tu signore sei un campione. controllerà subito –

+0

tieni presente che verrà visualizzato non appena EOF viene raggiunto (fine del file) –

+0

qual è il modo migliore per aggirare questo problema ... dovrei usare un buffer da 1 byte? –

0

L'utilizzo di fread() anziché recv() da leggere su un socket TCP mi sembra strano ..?

In ogni caso, fread sta bloccando finché non c'è nulla da leggere. Si dovrebbe sempre verificare che un socket sia pronto per eseguire la lettura o la scrittura, usando select() per esempio su linux.

+0

Sono sicuro che ci sia qualcosa da leggere –

+1

Perché ti sembra strano? Lo scopo di 'stdio' è quello di bufferizzare i dati per una lettura frammentaria, quindi se è quello che vuoi, perché non usarlo? – Dolda2000

+0

d'accordo, è bello avvolgere i socket come file in modo da poter usare le funzioni di boss come fread .. tranne quando non si può piacere apparentemente non posso haha –