Paweł Nowosielski

Paweł Nowosielski LinkedIn
(https://www.linkedi
n.com/in/pawelnowosi
elski/)

Temat: Remoting, Sockety...

Witajcie DotNetoManiacy :)

Mam do poprawienia zdawało by się prostą rzecz ;) Przejąłem kawałek kodu, który z grubsza działa, ale czasami gubi wiadomości wysyłane po tcp. Im bardziej się zagłębiam, to okazuje się, że kod działa na dobrą sprawę przez przypadek, niestety w msdn są bardzo lakoniczne opisy, brak niuansów... Prawdziwe działanie muszę wydobywać z logów...

Chciałbym dowiedzieć się jak rozwiązalibyście następujące zagadnienie:
W danym momencie tylko jeden klient jest połączony z serwerem i utrzymuje połączenie. Klient wysyła do serwera binarne wiadomości, każda idzie w nowym wątku, serwer również wysyła odpowiedzi w nowych wątkach. Wszystko ma być wysyłane po tym jednym otwartym połączeniu.

Nie oczekuję gotowego kodu, wystarczy mi ogólny zarys, jak to można porządnie rozwiązać, resztę sobie spróbuję doczytać, ew. dopytam. Jeśli coś niejasno opisałem, pytajcie bez oporów :)

Z góry dziękuję za rady :)

Pozdrawiam,
Paweł
Maciej Aniserowicz

Maciej Aniserowicz software
developer/architect

Temat: Remoting, Sockety...

Czy Remoting w tytule wątku to tylko zmyłka? Bo wyglada to na bezposrednie pisanie do NetworkStream. :)
Wiele wątków piszacych do jednego strumienia == wiele problemów. Zacząłbym od upewnienia się, że każda wiadomość zostanie zapisana od początku do końca - tak aby wiadomości nie szły "poszatkowane" bo wtedy wystąpić może prawdopodobnie zarówno sodoma, jak i gomora.
Słowo-klucz: synchronizacja między wątkami. "Wysyłacz" powinien byc thread-safe, czyli tylko jeden wątek naraz może zapisywać dane do strumienia.
Lektura MSDN o bloku lock to dobry punkt startowy.Maciej Aniserowicz edytował(a) ten post dnia 21.01.10 o godzinie 13:11
Paweł Nowosielski

Paweł Nowosielski LinkedIn
(https://www.linkedi
n.com/in/pawelnowosi
elski/)

Temat: Remoting, Sockety...

Dzięki wielkie Maciek!

Tak chodzi wyłącznie o NetworkStream. Podejrzewałem, że nie będzie łatwo, proste wstawienie lock-ów do mojego śmietnika powoduje zakleszczenie.

Tutaj dochodzą niestety takie niuanse, jak np. jeśli połączenie jest otwarte, ale klient nie nadaje, metoda Read() na serwerze nie zwraca 0, ale czeka, aż coś przyjdzie. Jeśli postawię lock przed Read() to skutecznie się zabezpieczam, by serwer wysłał cokolwiek w tym czasie. Chyba, że przed czytaniem (Read) nie lock-ować?

Gdyby ktoś mógł rozwinąć jeszcze trochę temat, może jakiś malutki opis w jaki sposób czytać ze strumienia tylko wtedy gdy są tam dane. Może ktoś ma sprawdzone sposoby i chciałby się podzielić.

Jeszcze raz serdecznie dziękuję za pomoc!
Paweł
Maciej Aniserowicz

Maciej Aniserowicz software
developer/architect

Temat: Remoting, Sockety...

Odczytuje chyba tylko jeden wątek (inaczej byłoby zupełnie bez sensu)? Nie ma potrzeby lockowania przy odczycie - czytasz sobie w pętli przychodzące dane i gdy złożą sie w pełną wiadomość - podejmujesz odpowiednie akcje (pewnie w tym miejscu odpalenie przetwarzania wiadomosci w kolejnym wątku).
Lockowanie przy pisaniu ma zapewnic przesylanie calych wiadomosci.

Następna dyskusja:

Sockety - problem koncepcyjny




Wyślij zaproszenie do