0

たとえば、接続するクライアントの数はわかりませんが、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() の呼び出しが終了し、プログラムの続行がブロックされます。

どうすればこの問題を解決できますか?

4

2 に答える 2

2

タイムアウト値を指定して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);
    }
}
于 2012-12-27T11:04:07.873 に答える
1

ここでサーバーコードを確認してください

擬似コード:

listener thread:
       while(1)
        {
        :
        : 
        if(select(...)>0)
        {
        if(FD_SET(..)) 
                  if(accept(...)) dispatch_msg_to_processing_thread;
        }
        :
        :
        }

processing thread: process message.
于 2012-12-27T09:29:23.567 に答える