C# 4.0 TCP Server

1

Witam.

Zastanawiam się ostatnimi czasy, jaką drogą najlepiej pójść w budowaniu serwera TCP.

Przyjmijmy, że mamy serwer, który jednocześnie obsługuje po 300 socketów, średnio utrzymujących łącze przez 2 godziny dla każdej jednostki. W międzyczasie, każdy socket, w zależności od zaangażowania w aplikację wysyła po 5 pakietów co sekundę, średniej wielkości 30 byte'ów.

Każdy socket ma swój buffer, do którego wpisujemy średnio 10 pakietów na wysłanie co ok. 500ms, zaraz po Read'zie. Średnia wielkość pakietu to +/- 40 byte'ów.

Skracając:
-> 300 clientów,
-> client wysyła ok. 5 pakietów na sekundę, średniej wielkości 30 byte'ów, które są splitowane w kilka sendów (max. 2/3 pakiety na jeden recv),
-> server odsyła ok. 10 pakietów co sekundę, średniej wielkości 40 byte'ów, które są bufferowane w jeden send.

Najważniejsza odpowiedź, którą chciałbym uzyskać to:

  • czy bawić się w pojedynczy thread dla każdego socket'u,
  • bawić się w TcpListener i otwieranie async'u dla każdego nowego połączenia,
    • jeśli tak:
    • synchronous send/recv?
    • asynchronous send/recv?
  • bawić się w jeden Thread, który zajmie się handlowaniem przychodzących połączeń/wysyłaniem pakietów/czytaniem pakietów?

Dziękuje i za dodatkową literaturę kłaniam się bardzo nisko.

1

Cześć,

nigdy nie miałem tak dużo operacji na jednym sockecie na raz. Maksymalnie 100 połączeń na raz i 1-2 pakiety co 1 sekundę i to tylko w przypadku gdy ruszał największy harmonogram. W moim przypadku zrobiłem jeden thread, wszystko na async i dawało/daję radę. Oczywiście trzeba pamiętać żeby wątek maksymalnie odseparować od innych operacji - tak żeby czytał tylko z kolejki/stosu kolejne pakiety do wysłania i zwracał te odebrane.

W rozwiązanie jeden thread na socket bym odradzał - jeżeli zwiększy ci się liczba clientów do 500 albo 2000. To przy dużej ilości wątków aplikacja może mieć problemy przy przełączaniu się pomiędzy nimi.

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