Wielowątkowy server TCP

0

Witam,
Załóżmy, że w funkcji main tworzę wątki dla każdego nowego połączenia TCP. Wątek wygląda tak:

 
void *servlet(void *arg)
{
   int client = (int)arg;
   int n;
   char s[256];

   memset(s, '\0', 100);
   while( (n = (read(client,s,100)) ) > 0 ) { /* czekamy na odbior danych od klienta */
      if (s[0] == 'Q')
              break;
      printf("msg: %s", s);
      write(client,s,n);              /* odpowiadamy do klienta ECHO */
      memset(s,'\0', n);
   }

   close(client);
   pthread_exit(0);
}

Chciałbym mieć możliwość asynchronicznej wymiany danych z klientami. Czy w takim wypadku tworzyć dwa wątki w funkcji main i zabezpieczyć je mutexami czy tworzyć wątek z poziomu już utworzonego wątku?
Proszę o pomoc, nie mam dużego doświadczenia.
Pozdrawiam.

0

Nie jestem pewny, czy na pewno dobrze zrozumiałem Twój problem, ale postaram się pomóc, gdyż sam niedawno stanąłęm przed problemem rozsyłania przez serwer danych do niektórych tylko klientów oraz wymiany danych między dwoma klientami. Zrobiłem to w taki sposób, że każdy wątek nowego klienta serwer zapisywał do tablicy wątków, zaś każdy wątek otrzymywał swój unikalny numer, tak więc w tablicy wątków pod indeksem np 5 był wątek klienta z numerem 5. Dzięki temu serwer mógł wysyłać dane tylko do niektórych klientów rozróżniając ich po numerach (indeksach tablicy). Napisałem procedurę serwera Odeślij_do która przyjmowała za parametr nr klienta, zaś klient wysyłając do serwera wiadomość musiał jako ostatni znak podać nr klienta, do którego wiadomość miała być wysłana, serwer ucinał ostatnią cyfrę i wiedział do którego elementu z tablicy wątków wysłac otrzymaną wiadomość.

0

Dzięki za odpowiedź.
Założenia mam następujące:
Program główny serwera oczekuje na nowe połączenie klienta. Gdy je nawiąże, tworzy nowy wątek, do którego przekazuje deskryptor socketa.

   while (1) {
      printf("Waiting for a new connection ....\n");  /* debug */
      csd = accept(sd, NULL, NULL);
      if (csd < 0)
         panic("accept");
      printf("New connection accepted on socket: %d", csd); /* debug */
      pthread_create(&child, &pattr, servlet, (void *)csd);
   }

Od tej pory nowy wątek obsługuje klienta. Będzie on miał dwa zadania.

  1. Odbierać dane od klienta, analizować je i zapisywać do bazy postgreSQL.
  2. Analizować dane z bazy i na ich podstawie odpowiadać klientowi.

Z czym problem:
W listingu, który przedstawiłem w pierwszym poście, wątek oczekuje na informacje od klienta. Nie mam możliwości wykonywania jakichkolwiek zadań, a chciałbym np "rozmawiać" w tym czasie z klientem. Dlatego uważam, że potrzebny jest jeszcze jeden wątek.

Proszę o sugestie,
pozdrawiam.

0

Zaimplementuj sobie w głównej klasie serwera metody do wysyłania danych do klientów, sam serwer niech tylko czeka na połączenia, zaś wysyłanie danych do klientów niech odbywa się w wątkach serwera przez wywoływanie metod serwera (oczywiście w pętli while oczekującej na przychodzące dane od klientów zaraz po otrzymaniu danych klienta, bo chyba chodzi o to, że serwer "rozmawia" z klientami po otrzymaniu nowych danych od klientów, nie sam z siebie?)

0

Gdybym miał oczekiwać na dane od klienta i na ich podstawie mu odpowiadać, to nie byłoby tego postu.
Nie wiem czy powinienem tworzyć wątek writera, którego rodzicem będzie wątek klienta czy też wątek główny. Poza tym nie wiem dokładnie jak powinno wyglądać współdzielenie socketa przez 2 wątki.
Ps. Piszę w C.

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