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

你在第二次做作业,而不是比较。它应该是:

if(cur->Next == temp)

不是

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

很可能是因为在想要两个等号时只使用一个等号的小错误:

if(cur->Next=temp)

应该:

if(cur->Next==temp)

(同时删除“del”不需要的额外参数!)

提示:例如,如果您使用了一个好的编译器,gcc并且您启用了所有警告-Wall,那么当您犯此错误时它会给您一个警告。

于 2013-03-04T01:15:00.743 回答
0

虽然您的实际问题已经得到解答,但这里有一些关于您的删除功能的附加评论:

  1. 一旦找到要删除的条目,就没有理由继续搜索列表。我会break在第二个之后添加一个声明free
  2. return 0您在函数末尾没有声明。因此,如果要删除的条目不在列表的开头,则函数的返回值将是未定义的。

这些都不会导致您的程序发生故障(除非您正在检查返回值),但这些都很好纠正。

于 2013-03-04T01:57:31.653 回答