C中的客户端服务器多个连接

hl0ma9xz  于 2023-08-03  发布在  其他
关注(0)|答案(3)|浏览(149)

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

3b6akqbq

3b6akqbq1#

select(2)poll(2)系统调用就是为了处理这种情况而发明的(使用non-blocking sockets)。
然后是fork(2)的多进程方法,当然,服务器可以用threads实现。
最适合您的解决方案取决于您的具体要求。

ggazkfy8

ggazkfy82#

在服务器中使用此函数:

int listen(int sockfd, int backlog);

字符串
“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);


以使线程处理与客户端的通信。
注意:创建一个线程是昂贵和缓慢的,所以一开始应该创建一个线程池,并为每个客户端连接激活一个线程,当客户端断开连接时,将线程返回到线程池

nimxete2

nimxete23#

你应该线程。通常服务器有一个主线程来监听连接。如果建立了连接,主线程将创建另一个线程,并将该连接传递给新创建的线程。这样,在主线程仍然能够侦听新连接的同时处理连接。

**编辑:**这里是listen():

第一个月
对于给定的侦听套接字,内核维护两个队列:

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

相关问题