0

私はキューを作成し、それを管理しようとしていました。udp 単一サーバー/複数クライアント アプリケーションでアクティブなクライアントの記録を保持するためにキューが必要でした (udp の使用を余儀なくされているため、tcp への移行は提案しないでください)。

単一のサーバーと x 個のクライアントがあります。クライアントが最初のメッセージを送信するたびに、このクライアントの IP 番号とポート番号がキューに push() されます。

次に、5 秒ごとに、サーバーはキューから IP とポート番号を pop() し、この IP とポート番号を使用してクライアントにメッセージを送信します。クライアントが特定の時間内に返信した場合、それは「アクティブ」と見なされますが、タイムアウト内にクライアントから返信を受信しなかった場合、クライアントは停止していると見なされ、キューから削除する必要があります。

問題は、このノードを削除する方法です。1 つのオプションは、単にこのノードの代わりに 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.
           }
        }
   }



}
4

3 に答える 3

1

malloc関数を使用してノードにメモリを割り当てる場合、 free関数を使用してそのメモリを解放できます。ここでは、j ポインターにメモリを割り当てていません。これはバグです。

アプリケーションでは、各要素が 5 分ごとにアクティブかどうかを確認する必要があり、その時点で非アクティブなノードがある場合は、それを削除する必要があります。したがって、FIFO データ構造は必要ないと思います。リンクされたリストのデータ構造を使用することをお勧めします。

于 2013-06-13T06:32:14.783 に答える