私は 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 にあるかどうかを確認する方法に問題があると確信しています。