2012-12-23 17 views
5

Pracuję na serwerze proxy w c. Dość daleko posunąłem się używając kombinacji fredów i fgetów w różnych miejscach, ale chciałbym pogodzić się i zrozumieć różnicę. W poniższym przykładzie próbuję użyć fread w miejscu, w którym wcześniej użyłem fget pomyślnie. Zamiast tego mój serwer zawiesza się na linii przerażenia. Jaka jest różnica i dlaczego mój program się zawiesza?stragany na straganie, ale fget nie robi?

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; 
} 

dzięki!

EDIT: Więc jeśli uczynić linię "while ((q = fread (czytnik, 1, 1, request))> 0) {"

otrzymuję "Czytałem coś" w całym moim ekranie. ..

nie wiem co to oznacza. Czy to prawda, że ​​fread dosłownie nie zrobi nic, jeśli w strumieniu nie ma co najmniej liczby postaci twojego bufora?

+0

size_t q; przepraszam .. typ tłumaczenia na stos –

Odpowiedz

4

fgets zwraca po odczytaniu nowej linii, gdy fread będzie blokować, dopóki żądana liczba bajtów nie będzie dostępna w strumieniu lub w EOF. W twoim przypadku połączenie blokuje, ponieważ nie masz 2000 bajtów danych gotowych w strumieniu.

+0

TO MUSI BYĆ. jesteś panem mistrzem. sprawdzi od razu –

+0

pamiętając, że fread wróci, gdy tylko dojdzie do EOF (koniec pliku) –

+0

jaki jest preferowany sposób obejścia tego problemu ... czy powinienem użyć bufora 1-bajtowego? –

0

zamiast na do odczytu na gniazdku TCP wydaje mi się dziwne ..?

W każdym razie, fread blokuje tak długo, jak nie ma nic do czytania. Zawsze powinieneś sprawdzić, czy gniazdo jest gotowe do wykonania odczytu lub zapisu, używając na przykład linux.

+0

Jestem pewien, że jest coś do czytania –

+1

Dlaczego to wydaje się wam dziwne? Celem 'stdio' jest buforowanie danych do fragmentarycznego czytania, więc jeśli tego chcesz, to dlaczego go nie używać? – Dolda2000

+0

zgodziła się, fajnie jest owijać gniazda jako pliki, dzięki czemu można używać funkcji szefa, takich jak fread .. z wyjątkiem sytuacji, gdy nie można lubić pozornie nie mogę haha –

Powiązane problemy