Rozmiar odebranych danych w TcpClient.

0

Witam.
Mam taką metodę:

        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. :)

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

1

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

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.

0

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

0

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

1

Prawdopodobnie chodzi ci o NetworkStream.ReadTimeout.

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