Wysyłanie pliku[C#/WinForm] - monitorowanie ilości wysłanych danych

Wysyłanie pliku[C#/WinForm] - monitorowanie ilości wysłanych danych
P1
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:37
0

Witam. Napisałem program do wysyłania/odbierania plików przez TCP/IP, co działa tak jak powinno. Chciałbym jednak móc monitorować ile pliku już "się wysłało i odebrało", aby wykorzystać to do zrobienia progressbar'u(paska postępu?), ale nie mam pojęcia jak się za to zabrać. Znalazłem ze dwa artykuły (m.in. o pasku postępu), ale nic nie zrozumiałem. Mógłby ktoś mi powiedzieć co i jak trzeba zrobić? Z góry dzięki. Tu kod projektu http://ideone.com/IcIicz

AL
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 2 miesiące
  • Postów:308
1

zrób jakiś bufor i zapisuj strumień w pętli, w tym czasie uruchom timer (interval 1 sekunda) i obliczaj ile się wysłało. na podstawie tego możesz obliczyć prędkość, czas do końca, postęp

P1
Dzięki, ale mów do mnie raczej jak do zielonego. O ile wiem bufor to pewna przestrzeń w pamięci? Czyli mam stworzyć jakąś klasę? poza tym jak zapisać strumień w pętli? W między czasie znalazłem jeszcze jeden problem: jeżeli wysyłam pliki większe niż 64 kB, to program po prostu je ucina. Wiesz co z tym zrobić?
P1
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:37
0

Dobra. Rozwiązałem problem tak, że zamiast wysyłania całej tablicy jedną funkcją, wysyłam bajty pojedynczo. Oprócz tego wysyłam także rozmiar tablicy bajtów, aby serwer (który odbiera plik), wiedział ile razy ma powtórzyć pętle pobierającą bajt. Pasek postępu działa pięknie, kłopot z za dużymi plikami znikł, ale prędkość przesyłania jest mała. Plik ok 3,05 MB wysyła około 30 - 60 s. I moje pytanie brzmi: czy winny jest temu algorytm (komputer wolno wykonuje pętle?), czy po prostu tak musi być? Link do programu http://ideone.com/p2T9vs

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 5 godzin
1

maksymalny rozmiar paczki IP to 64 kB. to znacznie więcej niż typowy rozmiar paczki Ethernetowej (około 1500 B, większe to tzw. jumbo frame i nie każdy sprzęt to obsługuje).
Wynika z tego że paczka większa niż ten (upraszczając) 1 kB i tak jest automatycznie dzielona i łączona.

Rozwiązałem problem tak, że zamiast wysyłania całej tablicy jedną funkcją, wysyłam bajty pojedynczo

Nie, aż tak to nie musisz - wysyłaj po jednym kilobajcie (1024 B) na raz.
Teraz tracisz na prędkości bo narzut jest znacznie większy niż dane.

edytowany 2x, ostatnio: Azarien
P1
Dzięki za wyczerpującą odpowiedź. Ale mam jeszcze jedno pytanie: napisałem już funkcje na wysyłanie kB na raz, ale funkcja odbiera nadal po jednym bajcie. Prędkość jest zadowalająca (50 mB wysyła się dużo szybciej niż wcześniej 3 mB), ale czy zamiast odbierać po bajcie, będę odbierać tablicę, to coś przyśpieszę? Chyba to nie ma znaczenia, bo tak czy inaczej wysyłam bajty po kolei? Prosilbym, aby mnie poprawić, jeśli moje rozumowanie jest błędne.
Azarien
przerób odbieranie też...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.