Synchronizacja send() i recv()

0

Pisząc prostą aplikacje klient-serwer napotkałem na następujący problem: wysyłam funkcją send() partie danych, np. w pętli kolejne "porcje" pliku po 1024 bajty. Po drugiej stronie klient odbiera je funkcja recv(), jednak nie zawsze udaje mu sie odebrac wszystko. Wpisałem więc w pętli wysyłającej Sleep(10) (tak jak to jest zrobione w programie "filesend" autorstwa Adama Boducha). W testach na localhost wszystko było OK - problem pojawił się, kiedy testowałem to z kolegą który ma dośc słabe łącze - 10 milisekund przerwy to najwyraźniej za mało. I teraz pytanie: jak zsynchronizować przesyłanie przez sockety ? Nie moge przeciez zwiększać sleep miedzy wywołaniami send(), bo nie zawsze jest to konieczne a na pewno zawsze opóżnia program :-8 . Nie za bardzo podoba mi sie pomysł z potwierdzaniem otrzymania każdej partii przesłanych danych przez klienta, też będzie to zajmowało troche czasu. Przypuszczam że jakiś sposób istnieje, bo np. nie sadze żeby wysyłanie w protokole ftp było opóżniane przez jakieś sleep...

0

Też miałem kiedyś ten problem, i rozwiązałem go potwierdzając odbiór każdego pakietu. W sumie, niestety o ok. 50% zmniejsza to transfer (przynajmniej u mnie :]). Miałem też inny pomysła, ale w sumie potwierdzanie mi wystarczało. Oto on :]:
Serwer wysyła porcje danych, z dodatkowym 4 bajtowym nagłówkiem, który mówi, gdzie dane 1024 bajty mają się znaleźć w pliku (czy buforze) u klienta. Klient sprawdza czy pakiety nadchodzą po kolei. Jeśli nie, to w jakiejś tablicy dopisuje adres w pliku, gdzie nie doszły dane. Oczywiście klient zna długość pliku, więc wie kiedy jest jego koniec. I w tym momencie sprawdza tablicę niedosłanych danych, i wysyła żądania do serwera, o brakujące pakiety.

No, nie znam się zabardzo na aplikacjach sieciowych, ale taki pomysł mi przyszedł kiedyś do głowy...

//myślie, że to by zanadto nie spowalniało transferu... u mnie (przesyłając przez internet, z neo+ do neo+), bez żadnego zabezpieczenia, gubiło się jakieś 5-10% pakietów...

0

No tak, ale napisałem ze wołałbym raczej nie stosowac takiego potwierdzania otrzymania danych... :-8 . Drugi sposób ma zastosowanie tylko do plików, a co jeżeli wysyłam np. pojednyncze wiadomości tekstowe ? Wydaje mi się, że protokół TCP powinien mieć wbudowaną taką sychronizację, ale nie wiem jak jej użyć [???] .

1 użytkowników online, w tym zalogowanych: 0, gości: 1