1

可能であれば、受信したパケットをキャッチするために read 関数を呼び出しています。取得するパケットがない場合、errno EAGAIN が発生しますが、ネットワークが切断されると EAGAIN も発生するため、両方のシナリオを区別することはできません。

    while ( ((n = read(sockfd, &(buffer[pos]), 1)) > 0) and not messageFound) {

            //reading byte by byte
            if (n == 1) {
               // Some stuff.. 
            }
        }

// Never returning 0, but when returning negative values:
        if (n < 0){
            qDebug()<< "Read error #" << errno << ": " << strerror(errno);
            if(errno != EAGAIN){ // It is always this error, so it's never entering here
                qDebug()<< "Disconnected. Reason #" << errno << ": " << strerror(errno);
                *connected = false;
            }
        }

ソケットが切断されているかどうかを確認する方法はありますか、または read を呼び出す前に利用可能なパケットがあるかどうかを知る方法はありますか? (selectで試しましたが、うまくいかないようです)

4

1 に答える 1

3

POSIX ソケットの場合、クローズされた接続とデータの準備ができていないことの違いは戻り値にあります。接続が閉じている場合、戻り値は 0 です。データがない場合は負の値になります ( man ページを参照) 。

于 2012-04-26T09:55:14.833 に答える