为accept()系统调用工作

时间:2011-11-14 05:02:50

标签: c sockets testing client-server

我必须编写一个程序来检查有多少客户端可以连接到C中的单个服务器(套接字)。

我使用Beej的编程指南作为参考,并且已经意识到在单个客户端连接到服务器之后,更多客户端无法同时向同一服务器发送消息。只有在第一个连接关闭后,才会传递来自第二个客户端的积压消息。

由于我对套接字编程的新意,我不确定“accept”是否是要使用的正确系统调用。此外,BACKLOG的值应该是什么才能听取服务器可以处理的压力。

任何帮助?

2 个答案:

答案 0 :(得分:2)

accept()是正确的系统调用。它返回与新传入连接关联的 new 文件描述符,同时保留原始套接字准备接收更多连接。

但是,一旦你接受了那个传入连接,通常会有主要过程:

  1. 创建一个线程来处理该套接字
  2. fork一个继承新文件描述符的新进程。
  3. 使用select()epoll()等来轮询该套接字上的读取
  4. 如果您不这样做,则接受的连接上的任何后续read()都会被阻止,这意味着您无法再次呼叫accept()

    listen()的backlog参数仅用于告诉内核可以允许多少套接字保持在其初始“连接”状态之前 - 通常不需要对其进行非常大的调整。

答案 1 :(得分:2)

Section 7.2 of Beej's guide涵盖了大多数C程序员首先学习的方法。第7.2节末尾的例子应该是你想要的。

基本上,您使用select让程序等待在您已接受的其中一个连接上接收数据,或者让新客户端尝试连接。然后你检查一下发生了什么并处理它。 (不幸的是,该示例确实教导了一个坏习惯 - 忘记将套接字设置为非阻塞模式,因此如果连接不再处于挂起状态,它会在accept中死锁。)

基本理念是:

1)设置基本结构以跟踪客户端,初始化它们以反映您没有客户端的事实。

2)为新连接设置监听套接字。

3)使用select等待事情发生。您可以等待新客户端进行连接,从现有客户端接收数据,可以将数据发送到现有客户端,在现有连接上发生错误,或者等待一定时间。使用跟踪客户端的结构,确保等待从所有现有客户端收到数据。

4)处理发生的事情。如果新客户端尝试连接accept连接并更新您的跟踪结构。如果从客户端收到数据,请查看它是否完成命令,如果是,则处理它。如果您的某个客户端关闭了连接或该连接出现错误,请关闭套接字并更新跟踪进行清理。

5)回到第3步。

这称为“I / O多路复用”。还有其他方法可以做到,但这是大多数C程序员首先学习的方式。