1

ソケットからデータを読み取ろうとしています。なんらかの理由で理解できませんが、read 関数が無限ループに陥っているようです。それが起こると私が思う理由は、Eclipseを使用してデバッグしている間、デバッガーが読み取り機能を通過しないためです。また、端末でプログラムを実行すると、永久に実行されます。ヘルプ!!

追加情報: Linux で実行しており、この問題と関係があるかどうかはわかりませんが、プログラムでスレッドを作成します。

私が言及する必要があると思うもう1つのこと: read() が初めて呼び出されたとき、期待どおりに機能し、ソケット内のメッセージ全体を読み取ります。read() が 2 回目に呼び出されたとき (読み取るものが残っていないとき) に問題が発生します。read が関数を終了する 0 を返すと予想していましたが、代わりに read は無限ループに入ります。

すべてが起こっている場所は次のとおりです。

read_write_res block_read_reply(int fd, void* buf, int max, int* read_size) {
int flag = 1;
if (read_size != NULL)
    *read_size = 0;
int i;
while (1) {
    i = read(fd, buf, max); /* HERE is where the debbuger gets stuck */
    if (i == 0 && flag == 1) //nothing to read
        continue;
    if (i == 0 && flag == 0)
        return READ_WRITE_SUCCESS;
    if (i < 0){
        return READ_WRITE_FAILURE;
    if (i > 0 && read_size != NULL)
        *read_size += i;
    }
    flag = 0;
    max -= i;
    buf = (char*) (buf) + i;
}
return READ_WRITE_SUCCESS;

}

4

1 に答える 1

8

0 を返す場合readは、ファイルの終わりの状態に達したことを意味します。ソケットまたはパイプの場合、これは読み取るものが何もないことを意味します。これまで。したがってcontinue;、この場合に実行することは、あなたがやりたいことではありません。

于 2013-01-27T22:20:23.687 に答える