Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

290
Visualizações
Client Server multiple connections in C

I am trying to reason about how a simple server implemented in C with sockets can handle concurrent clients. Let's say a simple server waits for a client to connect and then read a message sent from the client. read() is a blocking function so the server will block until a client writes to it. If we assume two clients are concurrently writing to the server. The server will wake up to one of them but what will happen to the other one? is the server still "listening" while handling the request from the first client? I know that the bind function takes an int as the second argument that specifies the backlog (5 by default). does that mean that only 5 clients can connect concurrently to a server? If thats true, how are servers that handle multiple concurrent connections are implemented?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

The select(2) and poll(2) system calls were invented to deal with this exact situation (with non-blocking sockets ).

Then there is a multithreaded approach with fork(2) and then of course the server could be implemented with threads .

The best solution for you depends on your specific requirements.

over 4 years ago · Santiago Trujillo Relatório

0

You should threads. Servers usually have a main thread that listens for the connection. If a connection is made, the main thread creates another thread and passes that connection to the newly created thread. This way, connections are answered while the main thread can still listen for new connections.

Edit: Here is the listen():

listen(int socket_fd, int backlog)

For a given listening socket, the kernel maintains two queues.

  • An incomplete connection queue for which SYN has been reached, but the three-way handshake (TCP) is not completed. (SYN_RCV State) A connection queue full
  • Three-way handshake done. (State SET) The backlog argument historically specifies the sum of both queues. But there is no formal definition of what backlog means.
over 4 years ago · Santiago Trujillo Relatório

0

using this function in the server:

int listen(int sockfd, int backlog); 

The 'backlog' indicates how many outstanding clients can be trying to connect at one time.

When this function returns:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);  

then immediately , passing the 'sockfd' parameter to the

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);  

to have the thread handle the communication with the client.

Note: creating a thread is expensive and slow, so a 'pool' of threads should be initially created and activate one for each client connection and when the client disconnects, return the thread to the pool

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda