Prosty serwert TCP/IP - kilka pytań

0

Dobry wieczór

Zacząłem pisać posty czas klient/serwer korzystający z protokołu TCP/IP. Odnośnie tego miałbym kilka pytać. Na początku pokażę kod abym mógł sprecyzować moje pytania i było wiadomo dokładnie o co mi chodzi.

public void RunServer()
        {
            Socket client = SERVER_SOCKET.Accept();
            while (true)
            {
                SERVER_SOCKET.Listen(200);

                Socket newClient = SERVER_SOCKET.Accept();
                connectedClients.Add(new Client(newClient, connectedClientIterator));

                Task.Factory.StartNew(() => ClientListener(newClient));
            }
        } 
 //get message
            while (true)
            {
                byte[] receiveBuffer = new byte[1234];
                int bytesCount = client.Receive(receiveBuffer); // ***!!!***
                string s = ASCIIEncoding.ASCII.GetString(receiveBuffer, 0, bytesCount);
                //jakies dalsze dzialania z 's'
            }

"Client" to strukturka zawierająca dwa pola: ID i Socket

"connectedClients" to lista List<Client>

Mam właściwie X pytania.

Pierwsze z nich odnosi się do połączenia serwera z wieloma klientami. Tak jak w kodzie powyżej dla każdego klienta tworzę oddzielny Task który w pętli nasłuchuje nadchodzących wiadomości. Czy jest to właściwe podejście ( zakładając, że chciałbym aby serwer mógł obsługiwać do 200-250 klientów).

Drugie (jest związane z pierwszym) odnosi się do usuwania tasków. Jeżeli miałbym np. metodę CloseServer() która miała by za zadania zamknąć wszystkie połączenia to w jaki sposób mógłbym zakończyć taski ? Czytałem o cancellationToken ale w tym przypadku nic by mi on nie dał. Zakładając, że tam gdzie zaznaczyłem //!!! byłby zapytanie do cancellationToken'a to i tak musiałbym czekać, aż klient wyśle jakąkolwiek wiadomość a jeżeli było by przed tym, to CloseServer() mógłbym wywołać po sprawdzeniu cancellationToken'a. Poza tym mógłbym (jeżeli zamykałbym serwer) po prosu po kolei zamykać połączenia z list connectionClients czy to też byłby zły sposób ?

I jeszcze takie ostatnie. Jeżeli chodzi o wysyłanie wiadomości przez kilenta do serwera i vice versa to mam mały problem ponieważ nie znam wielkości wysłanego pakietu.
Czy taki sposób to dobre obejście czy jest to już kombinowanie:
Wysłanie pierwszego 4-bajtowego pakietu który określałby długość następnego (posiadałby ustalony rozmiar 1 int'a)
Deklaracja bufora o rozmiarze z poprzedniego pakietu
Odbiór drugiego pakietu (tego właściwego) i wczytanie go do utworzonego wcześniej bufora?

To by było na tyle. Za każdą pomoc z góry dziekuję

Pozdrawiam

0

idźże na codeproject.com i se pobierz co tylko potrzebujesz gotowce jakie byś tylko se chciał małe i duże projekty...

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