如何在特定时间段内使用' accept() '接受任意数量的连接?
How do I accept any number of connections using `accept()` during a certain time period?
例如,我不知道有多少客户端将连接,但我希望在一段时间内能够连接任意数量的客户端,例如10秒。
现在我有这样的东西:
unsigned int currentTime = (unsigned int)time(NULL);
int session[100], sessionCount = 0;
// accept connections for 10 seconds:
while ( (unsigned int)time(NULL) - currentTime < 10 ) {
session[sessionCount++] = accept( my_sock_desc, (struct sockaddr *)&client_sock_addr, &sock_size );
}
这将接受任意数量的连接,但显然,while循环的最后一次迭代将调用accept(),从而阻止程序继续。
我该如何解决这个问题?
您需要使用select或poll的超时值来检测调用accept是否安全而不会阻塞。
void mainloop()
{
time_t startTime = time(NULL);
time_t listenTime = 10; // 10 seconds, for example
time_t elapsed = 0;
elapsed = time(NULL) - startTime;
secondsToWait = (elapsed >= listenTime) ? 0 : (listenTime-elapsed);
while (secondsToWait > 0)
{
fd_set readset = {};
FD_SET(my_sock_desc, &readset);
timeval waittime = {};
waittime.tv_sec = secondsToWait;
int count = select(my_sock_desc+1, &readset, NULL, NULL, &waittime);
if (FD_ISSET(my_sock_desc, &readset))
{
accept( my_sock_desc, (struct sockaddr *)&client_sock_addr, &sock_size );
}
elapsed = time(NULL) - startTime;
secondsToWait = (elapsed >= listenTime) ? 0 : (listenTime-elapsed);
}
}
查看服务器代码
伪代码:
listener thread:
while(1)
{
:
:
if(select(...)>0)
{
if(FD_SET(..))
if(accept(...)) dispatch_msg_to_processing_thread;
}
:
:
}
processing thread: process message.
相关文章:
- 尝试将 c 字符串数组与分隔符连接起来
- 任意大小的 constexpr 数组是否可以用作 switch 语句中的案例?
- 如何在VS2019中获取数组的任意对齐?
- 如何在C++中实现节点数任意的通用树数据结构?
- 将任意对象附加到数组有什么问题
- 需要关于如何将我的随机数数组连接到冒泡排序的帮助
- Cassandra 驱动程序中每个主机的最大连接数
- 将数组中的任意位复制到变量中?
- 如何将X 2维数组连接到一个三维阵列中
- 从二进制文件读取到数组:前面的任意数字
- qt如何连接QPushButton的2D数组并返回位置
- 一个数组可以划分的最大子数组,使得不同子数组中任意两个元素的 GCD 始终为 1?
- 连接数组,数组 1 内存消失C++
- 如何在C++中将边列表转换为邻接矩阵,其中包含连接到顶点的边数而不是一条边?
- C++ 数组任意两个项相等
- 如何在C++中找到任意数组的大小
- 在具有任意数量子级的节点树中查找节点
- 读取任意大小的任意数组
- 以任意顺序连接多个线程
- 如何传递任意数组的结构到一个函数