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?
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). –
@Adriano z twoim podejściem, jak mógłbym zapobiec wysyłaniu przez użytkownika rozmiarów 0xFFFF do końca czasu? – afuzzyllama
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?). –