[C++ Builder] Optymalizacja przesyłania plików

0

Witam

Mam pytanie, ale bardziej teoretyczne, chodzi mi o optymalizacje przesyłania plików, groźnie brzmi ale w gruncie rzeczy chce po prostu się dowiedzieć jak pisać kod żeby jak najszybciej przesłać dany plik... mówie o C++ Builderze i TClientSocket

dla przykładu jak stworze sobie bufor powiedzmy 100 bajtów i je wysyłam przes SendBuffer to jest to dużo mniej wydajne niż gdybym wysłał 8192 bajty i tutaj też do was pytanie czy pakiet wysyłany przez TClientSocket ma właśnie 8192 bajty? bo tak gdzieś wyczytałem.

Drugie pytanie co jest lepsze? Wpakować powiedzmy do bufora wiecej niż te 8192 B i zostawić podział na pakiety systemowi czy lepiej jest powiedzmy w pętli dzielić na te 8192 i tak wysyłać za każdym razem wywołując SendBuffer?

Chciałbym abyście napisali z własnego przykładu jakieś sposoby na zoptymalizoanie całego procesu, bo chce "wyciagnąć z łącza ile wlezie" ;)

Mam nadzieje że ktoś się wypowie :)

0

Zdobądź uchwyt socketa swojej klasy i wykonaj na nim getsockopt z flagą SO_SNDBUF, a uzyskasz rozmiar bufora 'nadajnika' - po tyle bajtów wysyłaj. Równie dobrze będzie gdy będziesz usiłował wysłać cały bufor na raz i odpowiednio przesuwał wskaźnik i zmniejszał rozmiar bufora zgodnie z tym, co send() zwróci, a zwraca ilość wysłanych bajtów, lub -1 w razie błędu.

Inna sprawa to kompresja danych w locie, niby błachostka, a potrafi znacznie przyspieszyć transfer. Można użyć chociażby zlib1.dll - jest chyba dostępna od windowsa 98

0

Dzięki za odpowiedz :)

Mam kolejne pytanko, z moich testów wynikła dizwina sprawa, napisałem sobie w celach testowych mały programik, który w pętli wysyła pakiety (w tym przypadku to jakiś tam tekst) oto jak wgląda kawałek logu z tego wysyłania.

--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 0
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 0
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 0
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 0
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 1187
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 0
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 0
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 16
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 0
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 1343
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 0
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 0
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 0
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 1016
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 0
--- Wysyłanie kolejnej parti! ---
Wysłano bajtów: 7202
Czas: 15

Jak się przyjżeć to to dziwnie wygląda, są momenty że ten sam pakiet jest ileś razy pod rząd wysyłany błyskawicznie, ale co pewien czas zdarzają się jakieś dziwne zachamowania które stopują wysyłanie na ok sekunde... dlaczego tak się dzieje? Czy to jest wina mojego kodu czy po prostu tak już musi być, jest jakaś "kolejka do karty sieciowej" czy coś takiego?

Jeśli udało by mi się to obejść to wysłanie nawet dość sporego pliku było by zadowalająco szybkie, jak na razie jest niestety dość wolne :/

Proszę o odpowiedz :)
Pozdrawiam :)

0

bo dane nie sa wysylane natychmiast, tylko sa buforowane i wysylane hurtem jak sie zbierze odpowiednia ilosc/bedzie przerwanie sprzetowe/etc. i to moze byc wlasnie taki efekt. druga rzecz - te nagle skoki w czasie moga byc spowodowane np. tym, ze akurat w tym momencie system okresowo oddaje procesor innemu programowi... a te 7202 bajty ktore wysylasz to dlugosc wzieta 'z powietrza' czy taka dlugosc bufora socketa otrzymales wg metody podanej przez sapero? piki powtarzaly sie co 4-5 paczek po 7202, sprobuj puszczac wiec np. 21000b na raz.. acz mi to sie wydaje troche duzo i watpliwie, wiec obstawiam to ze po prostu cos Ci sie wcina w czas procka..

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