Rozmiar odebranych danych w TcpClient.

Rozmiar odebranych danych w TcpClient.
PM
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:6
0

Witam.
Mam taką metodę:

Kopiuj
        public string ReadString(short size)
        {
            NetworkStream stream = Client.GetStream();
            byte[] msg = new byte[size];
            stream.Read(msg, 0, size);
            return System.Text.Encoding.Default.GetString(msg);
        }

Ma ona za zadanie zbierać pakiety od clienta.
Problem jest w tym, że rozmiar odebranego pakietu musi być z góry ustalony.
Chciałbym się doweidzieć czy jest jakiś sposób, aby można było dowiedzieć się jaki jest rozmiar nadesłanego pakietu?
Jeżeli ktoś kojarzy, to chodzi mi o coś takiego jak metoda bytesAvailable() z c++ Qt.
Z góry dziękuje za pomoc. :)

Antoniossss
  • Rejestracja:prawie 16 lat
  • Ostatnio:ponad 10 lat
1

Po 1, nie ma takiej metody - to są strumienie - z założenia nie ma być znana ich długość i forma.
Powinieneś przeczytać w dokumentacji co robi Read. Odczytuje n bajtów ze strumienia i zapisuje do bufora (w twoim przypadku do msg) a jako wynik operacji zwraca właśnie N
Aby odczytać dowolne dane ze strumienia odczytujesz je porcjami o rozmiarze size i zapisujesz sobie przy każdej iteracji gdzieś tam gdzie chcesz tak długo, aż read zwróci -1;
Proste


www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!
xeo545x39
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Kosmos
  • Postów:1571
1

A właściwość socketa Available? Zwraca ile można odczytać bajtów. Czyli:

Kopiuj
public string ReadString()
{
    NetworkStream stream = Client.GetStream();
    byte[] msg = new byte[stream.Socket.Available];
    stream.Read(msg, 0, msg.Length);
    return System.Text.Encoding.Default.GetString(msg);
}

Jeżeli to ty decydujesz jak wysyła klient dane, to lepiej użyć BinaryReader i BinaryWriter, są dużo wygodniejsze.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
Antoniossss
  • Rejestracja:prawie 16 lat
  • Ostatnio:ponad 10 lat
0

Orly? Szkoda tylko, że to jest ilość danych z w buforze, nie długość strumienia ;]


www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!
xeo545x39
No to i tak będzie musiał zrobić jak mówisz ;p
Antoniossss
no właśnie, więc rozwiązanie podane przez Ciebie, nie będzie skuteczne (chociaż może być na krótką metę, małe paczki i niskie opóźnienie sieci połączone z brakiem znacznej framgmentacji danych w warstwie transportowej. Dodatkowo nie jest ono odporne na lagi itd;] Jeżeli paczka powiedzmy ma długość 2kb, ale na coś tam się przytkało po drodze do odbiorcy, i socket odebrał tylko 400bajtów. Available poda(o ile cokolwiek zwróci - zależy od rodzaju strumienia i implementacjo) Ci te 400 i on tylko tyle odczyta, a pozostałą część danych przyjdzie później idzie w piach.
PM
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:6
0

Okey, dzięki.
Jeszcze chciałbym się dowiedzieć czy mogę jakoś ustawić czas oczekiwania na odpowiedź od clienta w metodzie Read?

Zobacz pozostałe 2 komentarze
Antoniossss
ale co. Pytasz o metodę, czy dlaczego nie lubię# :>
xeo545x39
Dlaczego nie lubisz C#? Czy ogólnie tam .net?
Antoniossss
Właściwie nie jestem bardziej sprecyzowany. Generalnie moja niechęć do .NET zaczęła się na tym, jak budowałem app w C++ korzystającą z .NET. Wielowątkowość = mordęga :P przynajmniej dla mnie. # to klon javy. Ma jeden jedyny + który sprawia, że jest "lepszy" - partial class. Można w wygodny sposób wydzielić np generacje gui od logiki. Ale to jest taki tyci tyci plusik. Dodatkowo to jest M$. Jak to jest M$ to to działa tylko dla M$ i jeszcze wg zasad i standardów które M$ sobie wymyśla. AA no i najpiękniejsza sprawa - IDE dla c# - VS <rotfl> Bardzo drogi edytor tekstowy;D
xeo545x39
Nie dziwię się, że zniechęciłeś się do .NETa poprzez C++/CLI, chyba każdy się zniechęcił ;] Co innego C#, tu już jest normalnie. A to, że M$ ustala wszelkie zasady to imo dobrze, że jest jeden rozwijany standard.
Antoniossss
no właśnie mnie chodzi o to, że standardy są rozwijane, a oni wprowadzają własne - i sami sobie je rozwijają ;P
xeo545x39
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Kosmos
  • Postów:1571
1

Prawdopodobnie chodzi ci o NetworkStream.ReadTimeout.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał

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.