客户端服务器程序的播放器结构
Player structure for a client server program
我正在用C实现一个anagram游戏的版本。该程序当然是多客户端服务器类型。
所以我几乎完成了所有的程序,但只有一件事。我希望我的程序保留每个连接并在服务器中玩游戏的玩家的历史记录(当客户端连接时,命令行参数之一是玩家的用户名)。
我不知道我应该怎么做 this.I 意思是什么是更好的方法和更优化的方法来实现这个。
我会用这样的玩家列表来做吗:
typedef struct player
{
char *username;
int score;
} player_t;
typedef struct playerList
{
int size;
player_t* players_list;
} playerList_t;
还是这样更好:
struct Player
{
char *username;
int score;
Player *next;
};
或者还有比这些更好的方法吗?
当然,我想将这些数据存储到一个文件中,这样万一服务器崩溃,我就不会丢失数据。
提前谢谢你。
我推荐你使用Linux内核双向链表,因为它的计算复杂度是O(1),而且速度非常快。
您可以在 Linux kernel doubly linked-list for user space
中找到提到的用户-space 实现
需要一点时间来理解;但在那之后你永远不会实现一个老式的链表。例如,您可以看到
一些优点是:
- 不需要实现你定制的链表搜索,拉,推等。搜索,替换,添加,删除,组合等列表操作的所有东西都有已在
list.h
实施
list.h
的列表操作速度(计算复杂度)为 O(1),这意味着您的链表结构有多大并不重要;当你扩大你的结构时,在整个列表中的搜索不会增长
- 每次你想从头开始添加一个新的链表,即一个新的链表基于一个新的
typedef struct
,你不需要实现列表操作(搜索,添加,删除, ...) 了。您需要做的所有事情就是在您的新结构中添加一个新行 struct list_head myLinkedList
。然后所有其他工作都已经完成:),这是代码扩展的一个很酷的功能
对于你的情况,我推荐这个:
#include "list.h"
struct player
{
char *username;
int score;
struct list_head _list;
};
int main()
{
LIST_HEAD(players_list);
struct player p1 = {.username = "lolo", .score = 100};
list_add_tail(&p1._list, &players_list);
struct player *iter;
list_for_each_entry(iter, &players_list, _list)
{
printf("name = %s, data = %d\n", iter->username, iter->score);
}
}
我正在用C实现一个anagram游戏的版本。该程序当然是多客户端服务器类型。
所以我几乎完成了所有的程序,但只有一件事。我希望我的程序保留每个连接并在服务器中玩游戏的玩家的历史记录(当客户端连接时,命令行参数之一是玩家的用户名)。
我不知道我应该怎么做 this.I 意思是什么是更好的方法和更优化的方法来实现这个。
我会用这样的玩家列表来做吗:
typedef struct player
{
char *username;
int score;
} player_t;
typedef struct playerList
{
int size;
player_t* players_list;
} playerList_t;
还是这样更好:
struct Player
{
char *username;
int score;
Player *next;
};
或者还有比这些更好的方法吗?
当然,我想将这些数据存储到一个文件中,这样万一服务器崩溃,我就不会丢失数据。
提前谢谢你。
我推荐你使用Linux内核双向链表,因为它的计算复杂度是O(1),而且速度非常快。
您可以在 Linux kernel doubly linked-list for user space
中找到提到的用户-space 实现需要一点时间来理解;但在那之后你永远不会实现一个老式的链表。例如,您可以看到
一些优点是:
- 不需要实现你定制的链表搜索,拉,推等。搜索,替换,添加,删除,组合等列表操作的所有东西都有已在
list.h
实施
list.h
的列表操作速度(计算复杂度)为 O(1),这意味着您的链表结构有多大并不重要;当你扩大你的结构时,在整个列表中的搜索不会增长- 每次你想从头开始添加一个新的链表,即一个新的链表基于一个新的
typedef struct
,你不需要实现列表操作(搜索,添加,删除, ...) 了。您需要做的所有事情就是在您的新结构中添加一个新行struct list_head myLinkedList
。然后所有其他工作都已经完成:),这是代码扩展的一个很酷的功能
对于你的情况,我推荐这个:
#include "list.h"
struct player
{
char *username;
int score;
struct list_head _list;
};
int main()
{
LIST_HEAD(players_list);
struct player p1 = {.username = "lolo", .score = 100};
list_add_tail(&p1._list, &players_list);
struct player *iter;
list_for_each_entry(iter, &players_list, _list)
{
printf("name = %s, data = %d\n", iter->username, iter->score);
}
}