3

私は現在、maxWaitTimeがアイドル状態になった後にクライアントを切断するエコーサーバーを作成しています。

クライアントがデータを送信するまでプログラムがソケットをブロックすることを期待していましたが、gdbでプログラムを実行すると、Readlineでselectとblocksが実行されます。

retval = 0は、選択を通過するたびに、fd_setソックスが[256、(31ゼロ)]になり、選択後、ソックスが[32ゼロ]になることを知っています。

接続の受け入れは別の関数で行われ、接続記述子はエコー関数に渡されます。

あなたが私を正しい方向に向けるのを手伝ってくれるか、一定の時間が経過した後にクライアントを切断する方法を教えてくれたら、私に知らせてください。

さらに詳しい情報が必要な場合はお知らせください。

前もって感謝します!

    FD_ZERO(&sock);
    FD_SET(sockfd,&sock);

    int opt = 3;

    setsockopt(sockfd, SOL_SOCKET, SO_RCVLOWAT,&opt,sizeof(opt));

    timeout.tv_sec = maxWaitTime;
    timeout.tv_usec = 0;

    for ( ; ; ) {
            FD_SET(sockfd,&sock);

            printf("Set is %d\n",FD_ISSET(sockfd,&sock));

            int retval;
            retval = select(1, &sock, NULL, NULL, &timeout);

            if(retval)
            {
                    quitProgram(number);
            }
            else
            {
            printf("n is %d\n",retval);

            if ( (n = Readline(sockfd, line, MAXLINE)) == 0)
            {
                    return;         /* connection closed by other end */
            }

            Writen(sockfd, line, n);

    }

`

4

1 に答える 1

6

他の人がコメントしているように、コードにはいくつかの論理的な穴があります。あなた自身の承認によって:

retval = 0は、選択を通過するたびに、fd_setソックスが[256、(31ゼロ)]になり、選択後、ソックスが[32ゼロ]になることを知っています。

それは何かがうまくいかなかったことをあなたに示しているはずです。ソケットはfd_set終了後select()にありませんでした。つまり、ソケットはまだ読み取れませんでした。 タイムアウトをretval=0意味します。select()

呼び出されるfd_setたびにリセットするだけでなく、リセットする必要があります。代わりにこれを試してください:select()timeval

int opt = 3; 
setsockopt(sockfd, SOL_SOCKET, SO_RCVLOWAT,&opt,sizeof(opt)); 

for ( ; ; )
{ 
    timeout.tv_sec = maxWaitTime; 
    timeout.tv_usec = 0; 

    FD_ZERO(&sock); 
    FD_SET(sockfd,&sock); 

    int retval = select(sockfd+1, &sock, NULL, NULL, &timeout); 
    if (retval <= 0) 
    { 
        quitProgram(number); /* error or connection timed out */
    } 
    else 
    { 
        if ( (n = Readline(sockfd, line, MAXLINE)) <= 0) 
        { 
            return; /* error or connection closed by other end */ 
        } 

        Writen(sockfd, line, n); 
    } 
}
于 2012-09-26T22:03:58.107 に答える