[英]Working for accept() system call
我必须编写一个程序来检查C中有多少个客户端可以连接到单个服务器(套接字)。
我以Beej的编程指南作为参考,并意识到在单个客户端连接到服务器后,更多的客户端无法同时将消息发送到同一服务器。 仅在第一个连接关闭后,才会传递第二个客户端的积压消息。
由于我是套接字编程的新手,所以我不确定“ accept”是否是要使用的正确系统调用。 同样,在监听中应该知道BACKLOG的值是什么,以查看服务器可以处理的压力。
有什么帮助吗?
accept()
是正确的系统调用。 它返回与新传入的连接相关联,同时使准备接收更多的连接原始套接字的新文件描述符。
但是,一旦您接受了该传入连接,通常需要执行以下主要过程:
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.