2

私は LinkedLists の経験がほとんどなく、文字列がノードの 1 つにあるかどうかをテストするためのロジックを理解できません。プログラム全体は、クライアントが DNS クエリを送信するのを待ってから、無限ループで応答を返します。私がやりたいことは次のとおりです。

クライアントが要求したホスト名が LinkedList に含まれているかどうかを確認します。そこにない場合は、それを LinkedList に追加し、ルックアップを実行した後、回答を同じノードに保存します。そこにある場合は、すでに検索して に保存した回答をクライアントに提供してanswer[]ください。

コードの簡略化されたセクションを次に示します。

struct queryCache {
    char* hostName;
    uint8_t answer[UDP_RECV_SIZE];
    struct queryCache* next;
};
struct queryCache* qcRoot;

int main (int argc, char** argv) {
    // ...unrelated code

    qcRoot = malloc(sizeof(struct queryCache));
    qcRoot->hostName = 0;
    qcRoot->next = 0;

    while (1) {
        // Wait for client with recvfrom()

        char* cqHostName;
        // Code that malloc()s and strcpy()s the client hostname into cqHostName

        // Determine if cqHostName is in the cache
        int hostNameInCache = 0;
        struct queryCache* currQC = qcRoot;
        while (currQC) {
            if (!strcmp(currQC->hostName, cqHostName)) {
                puts("In the cache");
                hostNameInCache = 1;
                break;
            }
            currQC = currQC->next;
        }

        // If cqHostName is not in the cache add its name
        if (!hostNameInCache) {
            currQC->hostName = malloc(strlen(cqHostName)+1);
            strcpy(currQC->hostName, cqHostName);
            printf("Added HOSTNAME: %s to the cache\n", cqHostName);

            currQC->next = malloc(sizeof(struct queryCache));
            currQC = currQC->next;
            currQC->hostName = 0;
            currQC->next = 0;
        }

        // Code that does a recursive DNS

        // Code that will copy the response into the appropriate answer[] of the LinkedList
    }
}

プログラムは、最初のクライアント要求の後にエラーを発生させることなく終了するようです。LinkedList コードを削除すると問題なく動作するので、文字列が LinkedList にあるかどうかを確認する方法に問題があると確信しています。

4

3 に答える 3

1

が 0 の場合は である可能性がhostNameInCache最も高いため、延期することはできません。currQCNULL

while ループの条件を次のように変更します。

#------------v
while (currQC->next) {
    if (!strcmp(currQC->hostName, cqHostName)) {
            puts("In the cache");
            hostNameInCache = 1;
            break;
        }
        currQC = currQC->next;
}
于 2013-10-23T07:12:50.067 に答える