繁体   English   中英

为accept()系统调用工作

[英]Working for accept() system call

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

我以Beej的编程指南作为参考,并意识到在单个客户端连接到服务器后,更多的客户端无法同时将消息发送到同一服务器。 仅在第一个连接关闭后,才会传递第二个客户端的积压消息。

由于我是套接字编程的新手,所以我不确定“ accept”是否是要使用的正确系统调用。 同样,在监听中应该知道BACKLOG的值是什么,以查看服务器可以处理的压力。

有什么帮助吗?

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

但是,一旦您接受了该传入连接,通常需要执行以下主要过程:

  1. 创建一个线程来处理该套接字
  2. 派生一个继承新文件描述符的新进程。
  3. 使用select()epoll()等轮询该套接字上的读取

如果不这样做,则接受的连接上的任何后续read()都将阻塞,这意味着您无法再次调用accept()

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

《 Beej指南》的第7.2节介绍了大多数C程序员首先要学习的方法。 7.2节末尾的示例应该正是您想要的。

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

基本思想是这样的:

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

2)设置用于新连接的监听套接字。

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

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

5)返回步骤3。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM