2012-12-20 12 views
7

Konfiguruję sposób komunikacji między serwerem a klientem. Jak mam to działa w tej chwili, jest to, że strumień pierwszy bajt zawiera wskaźnik tego, co nadchodzi, a następnie patrząc klasę, że wniosek może określić długość żądanie:Jak umieścić ogranicznik w tablicy bajtów NetworkStream?

stream.Read(message, 0, 1) 

if(message == <byte representation of a known class>) 
{ 
    stream.Read(message, 0, Class.RequestSize); 
} 

jestem ciekaw jak radzić sobie z przypadkiem, gdy rozmiar klasy nie jest znany, jeśli po odczytaniu znanego żądania dane są uszkodzone.

Myślę, że mogę wstawić do strumienia jakiś separator, ale ponieważ bajt może zawierać się w przedziale 0-255, nie jestem pewien, jak utworzyć unikalny ogranicznik. Czy chcę umieścić wzór w strumieniu, aby reprezentować koniec wiadomości? Jak mogę się upewnić, że ten wzór jest na tyle unikalny, że nie można go pomylić z rzeczywistymi danymi?

+1

Podziel swój strumień na ustalony rozmiar ** porcje ** (powiedzmy na przykład 64K). Przygotuj 2 bajty do każdego fragmentu z bieżącym rozmiarem, kiedy otrzymasz porcję, w której ta wartość nie jest równa 0xFFFF, a następnie osiągniesz koniec strumienia. Nie próbuj mieć unikalnego wzorca, ** jest pewien, że zostanie zerwany **, chyba że zakodujesz dane wejściowe (ale to spowoduje, że będą większe). –

+0

@Adriano z twoim podejściem, jak mógłbym zapobiec wysyłaniu przez użytkownika rozmiarów 0xFFFF do końca czasu? – afuzzyllama

+0

Jeśli nadawca jest złośliwy, nie, nie możesz (chyba że ustawisz arbitralny limit). Ale jeśli możesz otrzymać dodatkowy licznik (przed pierwszą porcją) z liczbą porcji, które zostaną wysłane (to również ograniczy maksymalny rozmiar). Jednak dwa razy rozważyłbym dodanie tego rodzaju sprawdzenia integralności danych. Tego rodzaju rzeczy są obsługiwane na niższym poziomie ** przez protokół ** (czy korzystasz z połączenia TCP?). –

Odpowiedz

4

Istnieją różne podejścia w tym zakresie. Jedną opcją byłoby przesłanie najpierw długości nazwy klasy i możliwego całego pakietu (np. Zawsze pierwszego bajtu). W ten sposób możesz przeczytać tylko ten bajt, a następnie n bajtów więcej, aby uzyskać nazwę klasy.

Dzięki temu podejściu nie kończy się czytanie lot rzeczy, które złośliwy klient wysyła z zamiarem wykonania DoS Twojej aplikacji i możesz szybko określić, czy czytasz wystarczająco dużo, aby obsłużyć pakiet, czy też nie jest on jeszcze dostępny kompletny.

-1

Istnieje kilka bajtów niskiego poziomu, które są używane szczególnie jako ograniczniki. Początek tekstu i koniec tekstu mają (odpowiednio) wartość 0x02 i 0x03. I masz Początek kursu w połączeniu z Koniec transmisji, 0x01 i 0x04; możesz ich użyć.

+3

Tylko wtedy, gdy gwarantuje się, że jego dane nigdy nie zawierają tych znaków. Jeśli ma do czynienia z danymi binarnymi, to nie jest tak. – ThiefMaster

+0

Na pewno, ale to zależy od jego danych, myślę, że przynajmniej dobrze jest o tym wspomnieć. – Davio

Powiązane problemy