我一直在制作队列并尝试管理它。我需要一个队列来记录我的 udp 单服务器/多客户端应用程序中的活动客户端(我被迫使用 udp,所以请不要建议转移到 tcp)。
有单个服务器和 x 个客户端。每当客户端发送其第一条消息时,该客户端的 ip 号和端口号都会被 push() 到队列中。
然后,每 5 秒后,服务器将 ip 和端口号从队列中弹出,并使用此 ip 和端口号向客户端发送一条消息。如果客户端在特定时间内回复,则认为它是“活动的”,但如果在超时内没有收到来自客户端的回复,则认为客户端已死,必须从队列中删除。
现在的问题是如何删除这个节点。一种选择是简单地添加 NULL 代替此节点,但我想从队列中完全删除此节点。
任何建议都非常受欢迎。
下面是我的代码:
struct node
{
int rollno;
struct node*n;
};
struct node* create()
{
struct node*q;
q=(struct node*)malloc(sizeof(struct node));
return q;
}
void push(struct node*cur)
{
if(head==NULL)
{
head = cur;
tail = cur;
start = cur; //keeps a track of first node
}
else
{
struct node*f;
f=head;
head->n = cur;
head=head->n; //keep updating head
}
}
struct node* pop()
{
struct node*p;
struct node*s = NULL;p = tail;
if (p == head && tail != head) /*if at the end of list, display starting from first element as Queue is FIFO*/
{
p = start;
tail=p->n;
s = p;
display(s);
return s;
}
if(p == NULL)
{
if (start == NULL) //if no emelemt yet in the Queue
return NULL;
else // if at the End of list, go back to start
{
p = start;
tail=p->n;
s = p;
}
}
else
{
tail=p->n; //keep updating tail
s = p;
}
display(s);
return s;
}
void main()
{
while(1)
{
//if new client
struct node*j;
j = create();
// j= ip and port of client.
j->n=NULL;
push(j);
//after every 5 secs
{
pop();
//if client fails to reply
{
delete node.
}
}
}
}