例如,我没有连接多少客户端,但我希望任何数量的客户端能够在一段时间内连接,例如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()阻止程序继续。
我该如何解决这个问题?
答案 0 :(得分:2)
您希望使用带有超时值的select或poll来检测是否可以安全地调用接受而不会阻止。
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);
}
}
答案 1 :(得分:1)
检查服务器代码here
伪代码:
listener thread:
while(1)
{
:
:
if(select(...)>0)
{
if(FD_SET(..))
if(accept(...)) dispatch_msg_to_processing_thread;
}
:
:
}
processing thread: process message.