# tcp **Repository Path**: exileduyi/tcp ## Basic Information - **Project Name**: tcp - **Description**: TCP/IP Socket编程练习 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2014-03-29 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #TCP/IP课程实验练习 ##实验一 Linux 内核通用链表的使用 ###一、实验目的 学习Linux 内核通用链表的设计原理,熟练掌握Linux 内核通用链表的使用。 ###二、实验内容 1. 掌握Linux 通用链表的创建 2. 掌握通用链表添加元素、删除元素和遍历链表的方法 ###三、实验要求 1. 待创建的链表头变量名为`user_queue`。 2. 作为链表的宿主节点类型定义如下: struct user { int id; /* user id */ struct list_head list; }; 3. 针对上述`user_queue` 链表,要求以队列方式向其中依次添加10个类型为 `struct user` 的宿主节点,并要求这10 个宿主节点的id 依次为1—10 4. 依次遍历输出这10 个宿主节点的id 5. 从链表中删除首个宿主节点,然后依次遍历该队列并输出余下各宿主节点的id ###四、实现原理 Linux 的内核源文件list.h 提供了所有的链表定义,以及各类链表的操作接口和实 现。其中创建链表的方法如下: LIST_HEAD(my_list); 源文件list.h 中定义了如下若干接口,用于对通用链表进行各种操作: (1)在指定的head 后插入新节点,常用于堆栈数据结构的实现 // @newsk:即将添加的新链表节点 // @head:在此节点后添加 list_add(struct list_head *new, struct list_head *head); (2)在指定的head 前插入新节点,常用于队列数据结构的实现 // @newsk:即将添加的新链表节点 // @head:在此节点前添加 list_add_tail(struct list_head *new, struct list_head *head ); (3)从链表中删除一个指定节点 // @entry:要从链表中删除的节点 list_del(struct list_head *entry); (4)根据当前链表节点指针ptr 获得宿主节点指针 // @ptr:`struct list_head` 类型的指针 // @type:链表节点所在的宿主节点的类型 // @member:嵌入宿主的链表节点的变量名 list_entry(ptr, type, member); (5)遍历链表 // @pos:遍历链表时用于指示正在遍历的链表节点的指针 // @head:链表头 list_for_each(pos, head);