C中的Client Server多个连接

时间:2015-07-16 18:06:59

标签: c sockets client-server server

我试图推断在C中使用套接字实现的简单服务器如何处理并发客户端。假设一个简单的服务器等待客户端连接,然后读取客户端发送的消息。 read()是一个阻塞函数,因此服务器将阻塞,直到客户端写入它。如果我们假设两个客户端同时写入服务器。服务器将唤醒其中一个,但另一个会发生什么?处理来自第一个客户端的请求时,服务器仍在“监听”吗?我知道bind函数将int作为指定backlog的第二个参数(默认为5)。这是否意味着只有5个客户端可以同时连接到服务器?如果是这样,那么如何实现处理多个并发连接的服务器?

3 个答案:

答案 0 :(得分:4)

发明select(2)poll(2)系统调用是为了处理这种情况(使用non-blocking sockets)。

然后有fork(2)的多进程方法,当然,服务器可以用threads实现。

针对您的案例的最佳解决方案取决于您的具体要求。

答案 1 :(得分:2)

你应该线程。通常服务器有一个主线程来监听连接。如果建立了连接,则主线程创建另一个线程并将该连接传递给新创建的线程。这样就可以响应连接,而主线程仍然能够侦听新连接。

修改 这是listen():

listen(int socket_fd, int backlog)

对于给定的侦听套接字,kernal维护两个队列。

  • 未完成SYN的连接队列不完整,但三方握手(TCP)未完全完成。 (SYN_RCV状态) 完整的连接队列
  • 完成三方握手。 (ESTABLISHED状态)backlog参数历史上指定两个队列的总和。但是积压的含义并没有正式的定义。

答案 2 :(得分:1)

在服务器中使用此功能:

int listen(int sockfd, int backlog); 

'积压'表示有多少未完成的客户端一次尝试连接。

当此函数返回时:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);  
然后立即通过' sockfd'

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

让线程处理与客户端的通信。

注意:创建一个线程既昂贵又缓慢,所以#' pool'应该首先创建线程并为每个客户端连接激活一个,当客户端断开连接时,将线程返回到池