对于客户端-服务器模型,我想将所有登录的用户及其文件描述符"保存"在链接列表中。我试着做了以下事情:
当用户键入登录命令时,它会返回他或她选择的用户名。然后,它将此用户名添加到链接列表中。
char* username = login(clientSocket, message);
addUser(username, clientSocket);
将用户名和套接字添加到链表中的过程如下:
typedef struct UserSocketNode {
int userSocket;
char* username;
struct UserSocketNode* next;
}UserSocketNode;
UserSocketNode *head = NULL;
void addUser(char* username, int userSocket) {
UserSocketNode *newNode = (UserSocketNode*) malloc(sizeof(UserSocketNode));
newNode->username = (char*)malloc(strlen(username) + 1);
newNode->userSocket = userSocket;
strcpy(newNode->username, username);
newNode->next = head;
head = newNode;
}
每当我打印链接列表的内容时,每个节点都有相同的用户名,我不知道为什么。对我来说,通过为节点分配内存,我不会为保存用户名的char数组分配内存,并且每个节点都指向相同的用户名。我想我通过显式地为用户名分配内存并将char数组的内容复制到newNode->username来解决这个问题,但这不起作用。
有人能告诉我哪里错了吗。
基本上,您的方法没有错。你在其他地方有个bug。
您的链表节点包含两个数据元素和下一个指针
typedef struct UserSocketNode {
int userSocket;
char* username;
struct UserSocketNode* next;
} UserSocketNode;
你有一个UserSocketNode
的列表,称它为指示它是什么的东西;尾部,并在尾部添加,但那是我。
UserSocketNode* UserSocketList = NULL;
我会通过列表(有点像这个/自己(,但嘿。。。无论如何,为什么不使用strdup?
void UserSocketListadd(char* username, int userSocket)
{
//need a new node
UserSocketNode* node = (UserSocketNode*) malloc(sizeof(UserSocketNode));
if( !node ) return; //error...
//initialize
node->userSocket = userSocket;
node->username = strdup(username);
//add to front of list
node->next = UserSocketList;
UserSocketList = node;
}