我正在尝试在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
对于第一个节点,我没有问题,但对于所有其他节点,它不起作用。
我必须添加我的广播功能,我用它来广播从任何clinet到所有的任何消息。 这是广播代码:
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 :(得分:4)
你在第二次做作业,而不是比较。它应该是:
if(cur->Next == temp)
不
if(cur->Next=temp)
答案 1 :(得分:3)
很可能是因为在想要两个时只使用一个等号的微不足道的错误:
if(cur->Next=temp)
应该是:
if(cur->Next==temp)
(同时删除“del”不需要的额外参数!)
提示:如果您使用的是良好的编译器,例如gcc
,并且启用了所有警告-Wall
,那么当您犯这个错误时它会给您一个警告。
答案 2 :(得分:0)
虽然您已经回答了实际问题,但还有一些关于删除功能的其他评论:
break
之后添加free
语句。return 0
语句。因此,如果要删除的条目不在列表的头部,则函数的返回值将是未定义的。这些都不会导致您的程序出现故障(除非您检查返回值),但这些都很难纠正。