我对LinkedList的经验非常少,无法找出测试某个节点中是否有字符串的逻辑整个程序都在等待客户端发送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中是否有字符串有关。
最佳答案
当hostNameInCache
为0时,很可能currQC
为NULL
,因此您不能推迟它。
将while循环的条件更改为
#------------v
while (currQC->next) {
if (!strcmp(currQC->hostName, cqHostName)) {
puts("In the cache");
hostNameInCache = 1;
break;
}
currQC = currQC->next;
}
关于c - 测试LinkedList中是否存在字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19535019/