Wiele połączeń na tym samym porcie

0

Dzień dobry,

Rozbudowuję swój amatorski program o synchronizację danych opartą o mój własny serwer tcp w sieci lokalnej. Korzystam z komponentów synapse (multiplatformowe i proste).

Kiedy tworzę wątek nasłuchujący wszystko odbywa się super. Serwer kolejkuje nadchodzące połączenia, przesył danych jest niewielki( sieć do 20 komputerów przesyłają stringi z wierszami tabel i komórek). Więc czas oczekiwania klientów jest stosunkowo krótki.

Jednak chciałem rozwinąć serwer o możliwość jednoczesnego łączenia się z kilkoma klientami bo pracujemy nad przesyłem większej ilości danych.

Próbowałem uruchamiać nowe instancje wątku nasłuchującego, jednak wtedy kolejne wątki nie odbierają połączeń tak jak ten pierwszy.

Myślałem żeby port komunikacyjny przekazywał krótką informację o innych dostępnych wolnych portach i tam kierować jednoczesny ruch, uruchamiając kolejne instancje wątków ale z innymi portami. Może tak komponenty synapse sobie poradzą?(mac os i windows).
A może potrafią jednak obsłużyć wielu klientów na jednym porcie? Uruchamianie kolejnych instancji serwera gdy na poprzedniej trwa komunikacja wywołuje błąd i zatrzymanie komunikacji aż do ponownego uruchomienia całego programu.

Pozdrawiam
Krzysztof

1

Nie wiem jak to jest w Pascalu/Delphi ale w innych językach stawiasz serwer TCP natomiast dla każdego połączenia tworzysz nowy wątek do obsługi klienta, można też zrobić pulę wątków i przydzielać wątek z puli. Nie da się natomiast o ile mi wiadomo mieć wielu serwerów które nasłuchują na tym samym porcie.

2
pcchack napisał(a):

Próbowałem uruchamiać nowe instancje wątku nasłuchującego,

Nie uruchomisz wielu serwerów nasłuchujących na tym samym porcie. OS (Windows) na to nie pozwoli
PS. Niektóre klasy (obiekty) z synapse używałem jako klientów.
Pakiet Indy dla Delphi dobrze radzi sobie z problemem o którym piszesz, czyli wielowątkową obsługą połączeń, ale nie wiem czy ma wersję dla Free Pascal'a

Myślałem żeby port komunikacyjny przekazywał krótką informację o innych dostępnych wolnych portach i tam kierować jednoczesny ruch, uruchamiając kolejne instancje wątków ale z innymi portami.

To nie tak działa.
Serwer nasłuchuje na jednym ustalonym porcie i dla każdego połączenia tworzy wątek do jego obsługi

Jest jeszcze inny wariant nawiązywania połączenia.
Klient wysyła po sieci pakiet rozgłoszeniowy (broadcast UDP ) z zapytaniem, "jest tu jakiś serwer dla mojej usługi ?" , a serwer po otrzymaniu takiego pakietu odpowiada, "tu jestem, mój adres IP to "X" i nasłuchuję na porcie Y". Tak działają terminale płatnicze PeP'u

0

Znalazłem rozwiązanie - jest nim utworzenie większej ilości obiektów ttcpblocksocket jednak…
nie mam pojęcia jak to zrobić dynamicznie ?bo statycznie to nie jest problem ale mniej ciekawe rozwiązanie i duplikowanie kodu obsługi każdego połączenia. I będzie ich np 10…
Nie mam pojęcia jak nazywać ttcpblocksockety tak aby można było po dynamicznym utworzeniu zidentyfikować później każdy z nich w utworzonych dla obsługi połączeń wątkach.
Jest w ogóle takie coś jak identyfikacja ttcpblocksocketów? Nie mają właściwości name itp.

0

Ogromne dzięki! , problem rozwiązany.
Najbardziej pomogło jak napisaliście że nie można inicjować stu serwerów na jednym porcie a jedynie przechwytywać połączenia :)

Działa tak:

Jako globalny trzeba ustawić listenersocket zainicjować porty ip itd, ustawić do słuchania.

Uruchomić wątek z socket.accept.

Uruchamiać jego instancje z procedury attendconnection. Po zakończeniu procedury zwalniać kolejno wątki.

Tym sposobem synapse i ttcpblocksocket staje się wielowątkowe dla połączenia tcp.

2

przecież dokładnie taki przykładowy kod masz razem z synapse... Ale kto by tam przykłady przeglądał, nie mówiąc już o dokumentacji...

0

Jeszcze jeden problem mam i bardzo proszę o pomoc. Tamto rozwiązane super sobie radzi obsługuje ogromną ilość klientów.

Dlaczego jednak gdy zwalniam listenerconnection (aby zmienić adres ip np z pętli wewnętrznej 127.0.0.1 na 192.168…. lub odwrotnie, wczesniej wszystkie sockety są zwalniane i kończone wszystkie połączenia) to po ponownym create już się nie chce łączyć z klientami? Nie ma błędu, wątki się nie zawieszają.

Aby ominąć ten problem muszę zamknąć program i uruchomić od nowa.

0
Windowbee napisał(a):

Dlaczego jednak gdy zwalniam listenerconnection ...

Kryształowa kula wskazuje na błąd w 42 wierszu.

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