2014-12-15 21 views
5

Mam obecnie skonfigurowany serwer TCP, który może akceptować połączenie od klienta i wywoływać echo bez względu na to, co klient wprowadza. W jaki sposób chciałbym, aby wielu klientów łączyło się z serwerem i wysyłało dane wejściowe do wszystkich klientów?Jak mogę akceptować wielu klientów do serwera TCP?

Wydaje mam widelec, ale nie jestem całkowicie pewien, w jaki sposób ...

Na serwerze należy umieścić nieskończoną pętlę począwszy od zaakceptować (lub słuchać?), Który będzie bulić, gdy istnieje nowe połączenie? Następnie na proces potomny musiałbym zamknąć gniazdo z poprzedniego procesu i połączyć się z nowym, ale jeszcze raz nie jestem w pełni pewien.

Jak wyglądałby pseudo kod pod względem manipulacji widełkami i gniazdami? Zgaduję:

while(1) //before connection or accept? 

pid = fork() 

if(pid==0) 
    // open socket from client 
    // run the rest of the code 
    // end process when client disconnects 
else 
    // close socket from client 

Odpowiedz

0

Okazuje się, że pseudo kod wygląda następująco:

while(1)  //before listen 

pid = fork; //right after accept 

if(fork>0) 
    close sd2 (sd2 = accept(....)) 
    continue 
else 
    run the rest of the program 
2

można znaleźć w internecie wiele przykładów, najpierw znalazłem: http://www.tutorialspoint.com/unix_sockets/socket_server_example.htm

Należy pamiętać, że proces (lub wątek) na podejście klienta nie skaluje się dobrze. Nowoczesne serwery wykorzystują nieblokującą się główną pętlę dyspozytorską. Spójrz na libevent.

Oto przykład z serwerem echa użyciu biblioteki libevent: https://github.com/jasonish/libevent-examples/tree/master/echo-server