c++ - 如何在特定时间段内使用 `accept()` 接受任意数量的连接?

标签 c++ sockets ipc asyncsocket inter-process-communicat

例如,我不知道有多少客户端会连接,但我希望任意数量的客户端能够在一段时间内连接,比如 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() 的调用,从而阻止程序继续。

我该如何解决这个问题?

最佳答案

您想使用 selectpoll有一个超时值来检测在不阻塞的情况下调用 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);
    }
}

关于c++ - 如何在特定时间段内使用 `accept()` 接受任意数量的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14052146/

相关文章:

sockets - LuaSockets和代码::Blocks

linux - 如何在不创建套接字文件的情况下使用 unix 域套接字

C# IpcChannel 远程连接失败(实际远程处理时)

c - Msgrcv 未收到消息,但消息已正确发送

javascript - 即使在 main 中全局分配了 ipc, Electron 菜单仍然显示单击时未定义 ipc

c++ - 读取二进制数据寻找十六进制序列

c++ - ARM 交叉编译

MATLAB 中的 C++ MEX 编译

android - 套接字、读和写线程

c++ - Boost.Python.ArgumentError: python str 未转换为 std::string