我有一台服务器和一台客户端。客户端可以通过输入ADD来向ADD发送请求,例如ADD:Joe:2它应该添加到列表中。 Key = Joe Value = 2。
我正在尝试将一个键:值添加到使用最多5个元素的缓冲区的链表中。当链表达到元素(5)的最大大小并输入新键:值时,最旧的元素将被新元素覆盖。
每次添加它似乎都添加正常,但是当达到最大尺寸并尝试删除第一个KEY:VALUE时它会崩溃。
添加到列表:
void push_item(struct item** Front,struct item** Rear,char *new_key,char *new_value,int newsockfd)
{
char buffer [50] = {0};
struct item* new_node = malloc(sizeof(struct item));
strcpy(new_node->value,new_value);
strcpy(new_node->key,new_key);
//new_node->next = NULL;
if(p_size==5)
{
char *itemVal;
char *itemKey;
/* if queue is empty */
if ( *Front == NULL )
{
printf ( "List is empty");
}
else
{
if (*Front == *Rear)
{
strcpy(itemVal,(*Front)->value);
strcpy(itemKey,(*Front)->key);
free(*Front);
*Front = NULL ;
*Rear = NULL ;
}
else
{
//delete node
new_node = *Front;
strcpy(itemVal,new_node->value);
strcpy(itemKey,new_node->key);
*Front=(*Front)->next;
(*Rear)->next=*Front;
free(new_node);
}
printf("Node deleted Key: %s Value: %s",itemKey,itemVal);
}
}
else
{
*Rear=new_node;
(*Rear)->next=new_node;
if(*Front==NULL)
{
(*Front)=new_node;
p_size++;
}
else
{
(*Rear)->next=new_node;
p_size++;
printf("Elements in List: %d\n",p_size);
}
}
sprintf(buffer,"Added");
int num_bytes = write(newsockfd, buffer, strlen(buffer));
if (num_bytes < 0)
{
fprintf(stderr, "Thread ERROR: write() failed\n");
}
}
服务器:
struct item *Front = NULL;
struct item *Rear = NULL;
char buffer[BUFFER_SIZE] = {0};
void* handle_client(void *socket)
{
int newsockfd = (int)socket;
pthread_t thread_id = pthread_self();
printf("----------\nThread %lu using socket %x\n", (unsigned long)thread_id, newsockfd);
/* Start communicating */
int num_bytes = read(newsockfd, buffer, BUFFER_SIZE-1);
if (num_bytes < 0) {
fprintf(stderr, "Thread %lu ERROR: read() failed\n", (unsigned long)thread_id);
return NULL;
}
printf("Thread %lu recieved request\n", (unsigned long)thread_id);
if(strncmp(buffer,"ADD",3)==0)
{
char* key = buffer+4;
int charIndex;
char *new_value = strchr(buffer+4 , ':')+1;
charIndex = (int)(new_value-buffer)-1;
buffer[charIndex] = '\0';
push_item(&Front,&Rear,key,new_value,newsockfd);
printf("Value:%s Key:%s\n",new_value,key);
}
修改 CMD图片: Left cmd is the client and the right one is the server
p_size表示链表中的当前元素数。 它在进入if条件P_size == 5后崩溃。
答案 0 :(得分:0)
在push_item()
函数中查找if(p_size==5)
时遇到的问题时,错误是在写入要删除的节点的数据时。
错误1 - 临时itemVal
和itemKey
被声明为char *
但从未分配给数组。
// To do
strcpy(itemVal,(*Front)->value);
strcpy(itemKey,(*Front)->key);
// or
strcpy(itemVal,new_node->value);
strcpy(itemKey,new_node->key);
应分配
char *itemVal;
和char *itemKey;
。
// Local variables (STR_SIZE has to be adjusted)
char itemVal[STR_SIZE+1];
char itemKey[STR_SIZE+1];
警告1 - 但解决该问题会导致使用链接列表时环形缓冲区算法出现故障。
在
push_item()
函数中,写入/推送指针*Front
和 读/弹出指针*Rear
是独立管理的。当。。。的时候 环形缓冲区已满(if(p_size==5)
),而是删除新项目 最古老的一个。