Я пытаюсь сделать простой сервис чата (программирование сокетов) в 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
В дополнение к двум уже полученным ответам убедитесь, что ваша функция удаления принимает мьютекс.Ваша функция вставки делает это, ваша функция удаления тоже должна. – Celada