2013-03-04 4 views
0

Я пытаюсь сделать простой сервис чата (программирование сокетов) в C. Сервер является параллельным и может принимать несколько соединений. Я использую thread для сервера и связанный список для сохранения идентификатора сокета. Все работает отлично, кроме функции delete, которую я использую для удаления узла из связанного списка. Всякий раз, когда клиент создает DONE, я должен удалить его идентификатор сокета из связанного списка, но он не работает должным образом. Может ли кто-нибудь помочь мне разобраться, что мне нужно делать в функции удаления.Удалить узел из связанного списка в c

вот моя структура:

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; 
     }//else 
    }// while 
}//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 
+0

В дополнение к двум уже полученным ответам убедитесь, что ваша функция удаления принимает мьютекс.Ваша функция вставки делает это, ваша функция удаления тоже должна. – Celada

ответ

4

Вы делаете задание в вашей второй, если не сравнение. Оно должно быть:

if(cur->Next == temp) 

не

if(cur->Next=temp) 
3

Скорее всего из-за тривиальной ошибки только с помощью одного знака равенства при желании два:

if(cur->Next=temp) 

должно быть:

if(cur->Next==temp) 

(Также удалите ext ra аргумент, который не нужен для «del»!)

Совет: если вы используете хороший компилятор, например gcc, и вы включаете все предупреждения -Wall, тогда это даст вам предупреждение, когда вы допустите эту ошибку ,

+0

спасибо. Но это была просто проблема с копией. –

0

Пока вы актуальный вопрос уже был дан ответ, вот несколько дополнительных замечаний по вашей функции удаления:

  1. После того, как вы нашли запись, которую необходимо удалить, нет никаких оснований для продолжения поиска в списке. Я бы добавил оператор break после второго free.
  2. У вас нет инструкции return 0 в конце функции. Таким образом, если запись, которая будет удалена, не находится во главе списка, возвращаемые значения функции будут неопределенными.

Ни один из них не приведет к неисправности вашей программы (если вы не проверяете возвращаемое значение), но они могут быть исправлены.

+0

большое вам спасибо –

+0

мой вопрос еще не дан –

+0

@pejman Ваш код отлично подходит для меня: [Link] (http://codepad.org/yjcG81LL) – ccKep

Смежные вопросы