Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 客户端-服务器程序的播放器结构_C_Server_Client_Structure - Fatal编程技术网

C 客户端-服务器程序的播放器结构

C 客户端-服务器程序的播放器结构,c,server,client,structure,C,Server,Client,Structure,我正在用C语言实现一个字谜游戏版本。该程序当然是多客户端服务器类型。 所以我几乎完成了所有的程序,只有一件事。我希望我的程序保存每个在服务器上连接和玩游戏的玩家的历史记录(当客户端连接时,其中一个命令行参数是玩家的用户名)。 我不知道该怎么做。我的意思是,实现这一点的更好、更优化的方法是什么。 我是否需要这样的玩家列表: typedef结构播放器 { 字符*用户名; 智力得分; }球员;; 类型定义结构播放列表 { 整数大小; 球员名单; }玩家列表; 还是这样做更好: struct播放器 {

我正在用C语言实现一个字谜游戏版本。该程序当然是多客户端服务器类型。
所以我几乎完成了所有的程序,只有一件事。我希望我的程序保存每个在服务器上连接和玩游戏的玩家的历史记录(当客户端连接时,其中一个命令行参数是玩家的用户名)。
我不知道该怎么做。我的意思是,实现这一点的更好、更优化的方法是什么。
我是否需要这样的玩家列表:

typedef结构播放器
{
字符*用户名;
智力得分;
}球员;;
类型定义结构播放列表
{
整数大小;
球员名单;
}玩家列表;
还是这样做更好:

struct播放器
{
字符*用户名;
智力得分;
玩家*下一个;
};
或者还有比这些更好的方法吗。
当然,我希望将这些数据存储到一个文件中,以便在服务器崩溃时不会丢失数据。

提前谢谢。

我建议您使用Linux内核双链表,因为它的计算复杂度为O(1),而且速度非常快

您可以在中找到提到的用户空间实现

理解它需要一些时间;但在那之后,你将永远不会实现一个老式的链表。例如,你可以看到

其中一些优点是:

  • 无需执行自定义的链表搜索、拉、推等操作。所有用于执行列表操作的操作,如搜索、替换、添加、删除、合并等。。。都已在
    list.h中实现
  • list.h
    的列表操作速度(计算复杂度)为O(1),这意味着链表的结构有多大并不重要;扩大结构时,在整个列表中搜索不会增加
  • 每次您想从头开始添加新的链表,即基于新的
    typedef结构的新链表时,您不再需要执行列表操作(搜索、添加、删除等)。你所需要做的只是在你的新结构中添加一个新行
    struct list\u 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);
    }
}

谢谢你的回答。只有一个问题,我怎样才能在这个列表中添加更多的玩家(我看到你用要点解释了这一点,但你能给我举个例子吗?)因为我只看到头,而不是下一个或上一个。还有一个功能允许我将此列表中的此播放添加到一个文件以保存它们吗?@Mohammadreza使用
list\u add
list\u add\u tail
添加新玩家;请注意,在调用这些函数之前,必须分配新内存;看看我在@Mohammadreza中的例子,你到底是什么意思?!你的意思是保存在数据库里吗?如果是这样,你可以使用sqlite数据库,它是一个基于文件的数据库,也就是说,数据库中的所有表都在一个文件中!使用db还可以防止诸如文件操纵竞争条件、错误情况下的文件恢复等错误。。。。