0

C で簡単なチャット サービス (ソケット プログラミング) を作成しようとしています。サーバーは同時接続であり、複数の接続を受け入れることができます。サーバーのスレッドとリンクされたリストを使用して、ソケット ID を保存します。リンクされたリストからノードを削除するために使用する削除機能を除いて、すべて正常に動作します。クライアントが を入力するたびに、DONEそのソケット ID をリンク リストから削除する必要がありますが、正しく機能しません。誰かが私が削除機能で何をしなければならないかを理解するのを手伝ってくれませんか.

ここに私の構造があります:

struct ClientList {
    struct ClientList *Next;
    int socket;
    char username[100];
    int count;
    FILE *file;
} ;

ここにノードを追加するための挿入機能があります

void insert(struct ClientList *newItem,int new_s) {
    pthread_mutex_lock(&mymutex);
    struct ClientList *temp = (struct ClientList *) malloc(sizeof(struct ClientList)) ;
    temp->socket = new_s;
    temp->Next = head;
    head = temp;
    pthread_mutex_unlock(&mymutex);
}//insert function

ここに削除機能があります

int del(struct ClientList *temp,struct ClientList *newItem) {
    struct ClientList *cur = head;
    if (temp == head) {
        head = temp->Next;
        free(temp);
        return 0;   
    }//if
    else {
        while (cur) {
            if (cur->Next == temp) {
                cur->Next = temp->Next;
                free(temp);
            }//if
            cur = cur->Next;
        }//while
    }//else
}//del   

最初のノードでは問題はありませんが、他のすべてのノードでは機能しません。

クリネットからすべての人にメッセージをブロードキャストするために使用するブロードキャスト機能を追加する必要があります。ここにブロードキャストコードがあります:

void broadcast(struct ClientList* temp,char buf[MAX_LINE],struct ClientList * newItem) {

    int len;

    pthread_mutex_lock(&mymutex); 

    for(temp = head; temp != NULL; temp  =temp->Next) {
        if (temp->socket ! =newItem->socket) {
            buf[MAX_LINE-1]= '\0';
            len = strlen(buf) + 1;
            send(temp->socket, buf, len, 0);
        }//if
    }//for

    pthread_mutex_unlock(&mymutex);
}//broadcast
4

3 に答える 3

4

比較ではなく、2番目のifで割り当てを行っています。そのはず:

if(cur->Next == temp)

いいえ

if(cur->Next=temp)
于 2013-03-04T01:13:41.347 に答える
3

おそらく、等号が 2 つ必要なときに等号を 1 つだけ使用するという些細な間違いが原因です。

if(cur->Next=temp)

次のようにする必要があります。

if(cur->Next==temp)

(「del」に不要な余分な引数も削除してください!)

ヒント: などの優れたコンパイラを使用していて、gccすべての警告を有効にして-Wallいる場合、この間違いを犯したときに警告が表示されます。

于 2013-03-04T01:15:00.743 に答える
0

実際の質問にはすでに回答がありますが、削除機能に関する追加のコメントがいくつかあります。

  1. 削除するエントリを見つけたら、リストの検索を続行する理由はありません。break2番目の後にステートメントを追加しfreeます。
  2. return 0関数の最後にステートメントがありません。したがって、削除するエントリがリストの先頭にない場合、関数の戻り値は未定義になります。

これらのどちらも(戻り値をチェックしていない限り)プログラムの誤動作を引き起こすことはありませんが、修正するのは良いことです。

于 2013-03-04T01:57:31.653 に答える