Problem z TCPListerner oraz portem COM

0

Witam,
mam problem z TCPListenerem oraz obsługą portu COM (dokładnie ciężko jest mi ustalić teraz zdalnie co jest przyczyną) obstawiam że prawdopodobnie rozchodzi się o port COM, jednak już opisuję sprawę.
To tak, aplikacja jest serwerem ma za zadanie odbierać połączenia przychodzące po TCP (sieć LAN) z 5 urządzeń,
[strona urządzenia-klienta łączy się wysyła wiadomość i się rozłącza], a serwer odbiera to połączenie tworzy nowy wątek dla danego połączenia, w którym odbiera (z czytuje z GetSream) wiadomość i przerabia ją na odpowiedni ciąg bytów który następnie jest wysyłany przez port COM. Ale już nie dziś, teraz już nie wysyła od razu na port COM tylko dodaje wiadomość do Queue (do kolejki) gdyż się prawdopodobnie wcześniej program wysypywał z tego powodu że robiły się kolizje i windows sobie z tym nie radził że dwa wątki w jednej chwili chciały wysyłać wiadomość na port COM. Tak więc dodałem osobny wątek który co 500ms sprawdza czy w Queue coś jest i jeśli jest to to wysyła. Ale ściąga z kolejki pojedynczo jeśli w kolejce (Queue) będzie 5 wiadomości wyśle je w kolejności co 500ms. Wydawałoby się że wszystko jest już ok, nie powinno się nic dziać, po testach wstępnych było wszystko ok, jednak dziś dowiedziałem się że serwer się już 2 krotnie zawiesił, prawdopodobnie przy wykorzystaniu jednoczesnym 4 urządzeń.
I teraz mam pytanie gdzie może być problem czy TCPListerner sobie z tym nie radzi, czy Queue nie radzi sobie z jednoczesnym dodawaniem i z czytywaniem (ściąganiem) danych z kolejki czy może coś innego może być problemem?
Sprzęt:
Serwer (sprzętowy) niestety windows Home Premium - proszę nie pytać tak musiałobyć...
Program kompilowany przy pomocy Visual Studio Express 2010
Framework: MS Framework 4.0 Client
Pozdrawiam

0

Masz jakiś stały czas, po którym odczytujesz z urządzeń, czy cały czas mielisz odczyt i jak coś się trafi to pakujesz do kolejki? Może lepiej byłoby wysyłanie do portu zsynchronizować z innymi wątkami, np przy pomocy prostego locka, tak żeby poszczególne wątki ustawiały się w kolejce do wysłania przez port, a po każdej wysłanej komendzie dać portowi "odpocząć" przez jakieś ~50ms. Tylko, że wtedy musiałbyś czekać aż wątek dostanie dostęp do portu zanim z powrotem zacznie odczyt.

0

W załączniku załączam "poglądowy" obrazek.
Jak widać teoretycznie z portem COM już nie powinno być problemu, gdyż działa w osobnym wątku i co 500ms wysyła wiadomość o ile jakaś jest w kolejce do wysłania, wcześniej był z tym problem gdyż w wątkach w których po odebraniu połączenia odbierałem wiadomość (getstream) i je odpowiednio przerabiałem od razu wysyłając na port COM prawdopodobnie (a nawet na pewno) gdy szybko odbierał serwer połączenia tzn 5 urządzeń na raz się łączyło i przesyłało dane to różne wątki w jednej chwili wysyłały dane wspólnie na port COM (ten sam port COM) ale otwarty w innym wątku. Teraz ta część jest "poprawiona" jest osobny wątek który te dane wysyła na już przez niego otwarty port COM i co 500ms. Tak więc jednak port COM chciałbym usunąć jako winowajce zawieszeń serwera -> aczkolwiek czasem wyrzuca błąd że program się zawiesił, pojawia się okno z windowsa "Program przestał działać/odpowiadać" a on jednak dalej działa. Tak czy owak wygląda że pozostaje prawdopodobnie TCPListener jako sprawca tych problemów, może on nie potrafi przyjmować czy poradzić sobie z 5 połączeniami na raz?
Wydaje mi się że jak się to urządzenie połączy i zaraz rozłączy, to oczyszcza buffor czy to co on tam ma, a nawet gdyby nie to napisałem kolejną funkcje (wątek) który co minute -> czy 15min czyści wszystkie stare wątki za pomocą funkcji Abort();
Tak więc sprawa jest dość zawiła, także serwer na dziś dzień jest ode mnie 400km, więc muszę "zdalnie rozwiązać" miał ktoś takie problemy, macie jakieś pomysły?

0

Wątek wysyłający na port za każdym razem otwiera port na nowo, czy działa cały czas na otwartym?
Może spróbuj ograniczyć na razie działanie programu do odczytywania z urządzeń bez wysyłania na port, lub odwrotnie - wysyłaj tylko na port pomijając odczyt. Zobaczysz która część się sypie

0

Witam,
Wątek wysyłając na port otwiera go tylko raz.
Jednak dziś się dowiedziałem że serwer wysypuje się tylko przy jednym urządzeniu na reszcie działa normalnie, poprawnie.
Jednak na przyszłość bym zapytał czy TCPListerner tak dobrze kolejkuje/przyjmuje połączenia (połącz,wyślij,rozłącz np. 40 połączeń na minute z 5 urządzeń) na jednym porcie że nie powinno być takich problemów? Aplikacja będzie działać przez cały rok 24/7. Warto się jakoś dodatkowo zabezpieczyć?
Pozdrawiam

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