第一篇:实验八,华南师范大学实验报告
华南师范大学实验报告
姓名:课件密码:29379
学号:实验题目:液晶材料的合成及其应用
组别:第三组实验时间:2012.3.22
【前言】
1、实验目的① 了解液晶材料的结构特点、制备方法与应用
② 掌握DCC法合成胆固醇丙酸酯液晶材料的操作技术。
2、文献综述与总结
2.1 液晶是某些物质在熔融态或在溶液状态下形成的有序流体的总称。液晶的发现可以追溯到1888年, 奥地利植物学家F Reinitzer 发现, 把胆甾醇苯酸脂(Cho-lesteryl Benzoate, C6H5CO2C27H45 , 简称CB)晶体加热到145.5℃会熔融成为混浊的液体, 145.5℃ 就是该物质的熔点。继续加热到178.5℃, 混浊的液体会突然变成清亮的液体, 而且这种由混浊到清亮的过程是可逆的。O Lehmann 经过系统地研究指出, 在一定的温度范围内, 有些物质的机械性能与各向同性液体相似;但是它们的光学性质却和晶体相似, 是各向异性的。因此, 这些介于液体和晶体之间的相被称为液晶相。
2.2液晶态既可以通过加热纯的化合物获得,也可以通过改变双亲性分子在水溶液(或者更复杂的多组分体系)中的浓度和温度得到;前者被称为热致液晶,后者被称为溶致液晶。在热致液晶中,分子形状的各向异性(如棒状分子或盘状分子)及分子内不同化学结构单之间的微相分离作用(如刚性核与柔性链之间的不相容性)是形成液晶态的主要驱动力。形状各向异性的分子倾向于平行地排列起来,从而最有效地占据空间,这样既获得了长程的取向序,如向列相,分子仅表现出取向序,而又不具有长程的位置序。进一步,当分子内化学结构不同的各部分之间的微相分离作用使得分子内性质不同的结构单元彼此分离地聚集起来,便形成了具有一维、二维乃至三维位置序的复杂液晶态结构,如各种近晶相及结构更为复杂的立方相等。
2.3液晶显示器件的研究与应用现状:液晶是具有广泛用途的功能材料, 主要是用来制作电、光显示器件的, 其应用范围包括各种类型的显示器和光阀, 生命过程, 生物膜及信息传递等。液晶已被广泛应用到高新技术领域中, 在电子工业中作为显示材料, 液晶显示与其它显示相比, 有低耗能、准确性高、灵敏度高、色调柔和、无X 射线、安全可靠的特点, 由于消耗功率极小, 一般在10-100μw/cm2 的数量级, 因此不需要庞大的电源就可制造显示面积大而体积小的器件, 可实现大屏幕显示, 也可制造微型器件。液晶已经被广泛地应用到人们的日常生活中,如计算器的显示屏, 笔记本电脑的显示屏, 液晶电视等。液晶的应用主要有以下几个方面: 液晶平板显示、生物膜理论、液晶温度传感器、液晶压力传感器, 液晶在分析化学中的应用等。
2.4液晶材料的其他潜在应用:人工肌肉——Gennes 首先提出液晶弹性体作为人工肌肉的设想: 通过温度变化使其发生向列相到各相同性态之间的相变, 引起弹性体薄膜沿指向矢方向单轴收缩, 因此可以用来模拟肌肉的行为。然而其局限性在于液晶弹性体薄膜自身具有的低导热性和导电性, 因而对外
界刺激响应比较缓慢。对于以上缺陷, 可以通过掺杂导热导电物质的方法来提高其响应能力。Shenoy 等[ 7] 报道了通过液晶弹性体表面涂覆碳涂层, 使用红外二极管激光器产生光吸收, 从而可以大大缩短反应时间, 而且弹性体薄膜的机械性能未受影响;纳米机械——1973 年, Shibayer 等首先从理论上预料Sc * 相液晶可能具有铁电性, 并于同年首次合成了具有铁电能具有铁电性, 并于1984 年首次合成了具有铁电性的手性液晶聚合物。Vallerien 小组采用10-1 ~ 109 Hz的介电谱研究了网络聚合物和线性材料的铁电性, 结果证实了在某些具有Sc* 相的网络中确实存在铁电性。Brehmer 等合成了第一个毫秒级短开关时间的铁电液晶弹性体。通过铁电性液晶弹性体的大的侧向电收缩实现电能转化为机械能, 可以改变目前纳米尺寸的制动, 主要用某种晶体(如石英)和智能陶瓷中的线性压电效应来实现, 但是应变却很小(小于0.1%)的状况。Lehmann 等报道了铁电液晶弹性体作为薄膜型液晶纳米器件的研究结果, 在硅氧烷主链上含手性侧基和交联度为10% 的液晶弹性体在115 mV/cm 的电场下表现了垂直电场方向的收缩率为4% 的反压电效应。与过去所用的偏氟乙烯共聚物同样数量级的电诱导应变需用的电场相比低2个数量级;人工智能——Yu Yanlei 等报道了改变偏振光的波长和方向能使液晶弹性体在不同方向上进行可逆地卷缩和舒展的机械效应, 可望用于微米或纳米尺寸的高速操控器,如微型机器人和光学微型镊子;形状记忆——Rousseau 等报道了近晶C 型液晶弹性体的形状记忆效应, 与传统形状记忆聚合物相比具有恢复精度高(99.1%)、在低温下(-120℃)仍保持橡胶结构等优点, 可在低于室温条件下应用。这种液晶弹性体可以通过不同单体组成复合来定制转变恢复温度。
【实验部分】
1、实验仪器与药品
1.1实验仪器
有机合成实验玻璃仪器一套(必须含蒸馏、抽滤设备)、磁力搅拌器、薄层检测用荧光仪、显微熔点仪、红外光谱仪
1.2实验药品
胆固醇、二环己基碳二亚胺、丙酸、N,N-二甲基苯胺、二氯甲烷、石
油醚、薄层检测用硅胶GF254、乙醚、HCl溶液(1mol/L)、NaOH溶液
(1mol/L)、蒸馏水、无水乙醇、无水MgSO42、实验原理
胆固醇脂类液晶为热致胆甾型液晶,其在一定条件下,会随温度、磁场、电场、机械应力、气体浓度的变化,而发生色彩的变化,可用于制作液晶温度计、气敏元件、电子元件、变色物质等,还可用于无损探伤、微波测量、疾病诊断、定向反应等化学、化工、冶金、医学等领域。
长期以来,在胆固醇脂类液晶的合成中,多采用操作复杂、路线较长的酰卤路线,而采用操作温和、路线短的二环己基碳二亚胺,简称DCC所合法仅有少量报道。
在二环己基碳二亚胺(DCC)缩合法合成胆固醇脂类液晶过程中,多使用3级有机碱进行催化,特别吡啶的衍生物,如4-二甲氨基吡啶(简称DMAP)、4-吡咯烷基吡啶。不足的是,DMAP等吡啶的衍生物价格昂贵,随刻依据其催化机理,用便宜的N,N-二甲基苯胺作为3级有机碱进行替代,但耗时长、产率低。
3、实验步骤
DCC法合成胆固醇丙酸酯
① 加料在干燥的带有磁力搅拌子、干燥管的圆底烧瓶中,加入胆固醇(1.93g)、脱水剂二环己基碳二亚胺(1.24g)、丙酸(0.4ml)、催化剂(除水促进剂)N,N-二甲基苯胺(0.15ml)、溶剂二氯甲烷(100ml),在常温下搅拌,固体先溶解,后逐渐有白色沉淀生成。
② 反应监测搅拌下反应20~24h后,以30份石油醚和1份乙醚混合液为展开剂,薄层检测反应终点。
③ 后处理反应结束后抽滤,出去未反应玩的二环己基碳二亚胺和生成的酰脲,用HCl溶液、NaOH溶液、蒸馏水分别洗涤滤液后,然后加入MgSO4干燥。
④ 产品精制蒸馏除去溶剂二氯甲烷后的黄色油状粗产品,加入无水乙醇重结晶三次(每次8~10ml),抽滤,干燥,得到白色针状晶体。
⑤ 产物鉴定称量,计算产率,测定熔点等。
4、实验现象与结果
测定Rf值为:2.1/4.3=0.488,按照文献值应该为0.54,明显比较少,可以看出产品的制备并不是理想的,有可能并未能生成该物质。
产品的外观性状:胆甾醇(胆固醇)丙酸酯为白色晶体,胆甾醇(胆固醇)酯的熔点测定数值为92℃~110℃,文献值为102℃,以上数据均为其他同学的产品制得,我们本小组的实验并没有成功作出该产品来。
【结果与讨论】
DCC 法具有反应条件温和、合成路线短等优点,在胆甾醇酯合成的报道中用得最多。该方法主要是用有机酸和胆甾醇,在脱水剂DCC作用下合成胆甾醇酯,通常还加入除水促进剂。除水促进剂可大大加速反应的速度,同时提高反应的产率。DCC法中用到的除水促进剂有4-二甲基吡啶(DMAP)、4-吡咯烷基
吡啶、2,4,6-三甲基吡啶盐酸盐、N,N-二甲基苯胺等。其中DMAP 最常见,但其价格昂贵。为了有利于脱水缩合,DCC法合成胆甾醇酯时一般采用无水二氯甲烷作为反应的溶剂。
根据文献资料知:用N,N-二甲基苯胺作除水促进剂也可以合成胆甾醇丙酸酯,但是产率不高,且反应时间较长,反应24h基本检测不到产物,只有在反应72h后才能检测到产物,产率16.4%.用N,N-二甲基苯胺作除水促进剂合成胆甾醇苯甲酸酯时,可能由于苯甲酸中苯环存在较大的空间位阻,反应72h也未能得到胆甾醇苯甲酸酯。另外,以N,N-二甲基苯胺为除水促进剂,用于DCC脱水缩合法合成酯类化合物鲜见于文献报道,常用的除水促进剂多为吡啶的衍生物,如4-吡咯烷基吡啶,DAMP,2,4,6-三甲基吡啶盐酸盐等,其价格昂贵。
因为其他小组做的是用DAMP作为除水剂,通过两个用不同除水促进剂的实验对比,发现用DAMP作除水促进剂合成胆甾醇丙酸酯的反应时间和产率都要比用N,N-二甲基苯胺作除水促进剂要好,24h后胆甾醇丙酸酯的产率即可20.4%.【参考文献】
[1] 陈经佳,汪朝阳,郑绿茵等.DCC法合成胆甾醇酯.浙江化工.2005,36:(2).[2] 王瑾菲,蒲永平,杨公安.高分子液晶材料的应用及发展趋势.陶瓷.2009,3
[3] 王海涛,白炳莲,李敏.几类非常规液晶材料的研究进展.化学通报.2012,75:(1)
[4] 宋秀美,汪朝阳,毛郑州.胆甾醇酯的合成研究进展.广州化学.2008,33:(1)
第二篇:华南师范大学增城学院实验报告
华南师范大学增城学院实验报告
系部会计系
专业班级会计学(09财务管理)2班课程名称成本会计实训
实验教师范时云
学号
学生姓名
实验项目名称产品成本计算(品种法)
实验日期
实验地点会计综合模拟实验室(A505)
成绩
制表单位:华南师范大学增城学院会计系
华南师范大学增城学院实验报告
说明:实验报告应包含实验目的和要求,主要仪器设备、试剂或材料,实验方法与步
骤,实验数据记录、处理及结果分析,心得体会。
特别注意:
字数1000字以上,字体:宋体,字号:小四号,实验数据记录必须写相关重要计算过程。
学生签名:
实验教师评语及评分:
教师签名:
第三篇:实验八
实
验
报
告
课程名称:
SQL
Server
数据库基础
任课教师:
池宗琳
实验名称:
存储过程
年级、专业:
2018级电子信息工程
学
号:
20181060093
姓
名:
马
信
日期:
2019
年
月
日
云南大学
信息学院
一、实验目的1、掌握使用SELECT语句实现对数据库的简单查询
2、掌握使用SELECT语句实现对数据库的多表链接查询和子查询
二、实验内容、方法、步骤、结果与分析
完成以下各题功能,保存或记录实现各题功能的Transact-SQL语句。
1.在数据库HrSystem中创建存储过程avg._wage,用于求所有员工的平均工资,并通过输出参数返回该平均工资。要求在创建存储过程之前要首先判断该存储过程是否已经存在,如果存在,则将其删除。
USE
Hrsystem
GO
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'avg_wage')
DROP
PROC
avg_wage
GO
CREATE
PROC
avg_wage
@AVWAGE
AS
FLOAT
AS
SELECT
@AVWAGE
=
AVG(Wage)
FROM
Employees
@AVWAGE
GO
2.执行第1题创建的存储过程avg_
wage,打印员工平均工资。
USE
Hrsystem
GO
DECLARE
@avg
AS
FLOAT
EXEC
avg_wage
@avg
3.在数据库HrSystem中创建存储过程max_
wage,根据指定的部门名称(输人参数)返回该部门的最高工资(输出参数)。要求在创建存储过程之前要首先判断该存储过程是否已经存在,如果存在,则将其删除。
USE
Hrsystem
GO
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'max_wage')
DROP
PROC
avg_wage
GO
CREATE
PROC
max_wage
@Dename
varchar(20),@MAX_wage
FLOAT
OUTPUT
AS
SELECT
@MAX_wage
=
MAX(Wage)
FROM
Employees
WHERE
Dep_id
IN(SELECT
Dep_id
FROM
Departments
WHERE
Dep_name
=
@Dename)
GROUP
BY
Dep_id
4.执行第3题创建的存储过程max
wage,指定部门为“财务部”,打印该类部门的最高工资。
USE
Hrsystem
GO
DECLARE
@MAX_wage
FLOAT
EXEC
max_wage
'财务部',@MAX_wage
OUTPUT
@MAX_wage
5.删除存储过程avg_
wage和I
max_
wage。
USE
Hrsystem
GO
DROP
PROCEDURE
max_wage
GO
DROP
PROCEDURE
avg_wage
(二)触发器
创建一个“学生信息”数据库,包含“学生基本信息”表、“专业”表和“系”表,各表包含的字段如下。
“学生基本信息”表:学号;姓名;性别;班级;出生日期;专业编号。
“专业”表:专业编号;专业名称;系编号。
“系”
表:系编号;系名称;系简介。
各字段类型按其实际含义自行定义,输人-
-些数据,要求数据要有代表性。
以下操作要求全部在SQL
Server
Management
Studio
中完成,保存或记录实现各题功能的Transcat-SQL语句(包括测试相应触发器是否生效的相关语句及测试结果)。
1.在“专业”表上创建一个INSERT触发器“TRG1”。当发生插入专业表操作时,将显示插入的记录。
USE
学生信息
GO
CREATE
TRIGGER
TRG1
ON
专业
FOR
INSERT
AS
DECLARE
@depid
INT
DECLARE
@depname
varchar(50)
DECLARE
@number
INT
SELECT
@depid
=
专业编号
FROM
inserted
SELECT
@number
=
系编号
FROM
inserted
SELECT
@depname
=
专业名称
FROM
inserted
PRINT('系名:'+STR(@depid)+'专业名:'+STR(@depname)+'系的编号:'+str(@number))
INSERT
INTO
专业
(专业编号,专业名称,系编号)
VALUES(@depid,@depname,@number)
2.在“专业”表上创建一个DELETE触发器“TRG2”,当发生删除操作时,将给出警告、列出删除的记录并撤销删除。
USE
学生信息
GO
CREATE
TRIGGER
TRG2
ON
专业
FOR
DELETE
AS
PRINT('警告!禁止删除')
ROLLBACK
TRANSACTION
3.在“专业”表上创建一个UPDTAE触发器“TRG3”,当发生更新“专业名称”字段的操作时,给出警告并撤销更新
USE
学生信息
GO
CREATE
TRIGGER
TRG3
ON
专业
FOR
UPDATE
AS
DECLARE
@temp_proid
INT
DECLARE
@temp_xiid
INT
DECLARE
@temp_porna
varchar(50)
SELECT
@temp_porna
=
专业名称
FROM
inserted
IF
@temp_porna
IS
not
NULL
BEGIN
PRINT('禁止修改专业名称')
ROLLBACK
TRANSACTION
END
ELSE
BEGIN
SELECT
@temp_porna
=
专业名称
FROM
deleted
SELECT
@temp_xiid
=
系编号
FROM
deleted
SELECT
@temp_proid
=
专业编号
FROM
deleted
UPDATE
专业
SET
专业编号
=
@temp_proid,系编号
=
@temp_xiid
WHERE
专业名称
=
@temp_porna
END
4.在“学生基本信息”表上创建一
一个更新触发器“TRG4“,当发生更新“学号”或“姓名”字段的操作时给出警告,并撤销更新。
USE
学生信息
GO
CREATE
TRIGGER
TRG4
ON
学生基本信息
FOR
UPDATE
AS
DECLARE
@temp_stunum
char(11)
DECLARE
@temp_name
char(10)
DECLARE
@temp_gender
BIT
DECLARE
@temp_class
varchar(10)
DECLARE
@temp_date
DATETIME
DECLARE
@temp_proID
INT
SELECT
@temp_name
=
姓名
FROM
inserted
SELECT
@temp_stunum
=
学号
FROM
inserted
IF
@temp_name
IS
NOT
NULL
OR
@temp_stunum
IS
NOT
NULL
BEGIN
PRINT('禁止修改学号或者姓名')
ROLLBACK
TRANSACTION
END
ELSE
BEGIN
SELECT
@temp_stunum
=
学号
FROM
deleted
SELECT
@temp_name
=
姓名
FROM
deleted
SELECT
@temp_gender
=
性别
FROM
inserted
SELECT
@temp_class
=
班级
FROM
inserted
SELECT
@temp_date
=
出生日期
FROM
inserted
SELECT
@temp_proID
=
专业编号
FROM
inserted
UPDATE
学生基本信息
SET
性别
=
@temp_gender,班级
=
@temp_class,出生日期
=
@temp_date,专业编号
=
@temp_proID
WHERE
学号
=
@temp_stunum
END
5.删除以
上各题创建的所有触发器。做好“学生信息”数据库的备份,以备第10章、第章上机操作时使用。
USE
学生信息
GO
DROP
TRIGGER
TRG1
DROP
TRIGGER
TRG2
DROP
TRIGGER
TRG3
DROP
TRIGGER
TRG4
三、实验小结【对自己而言,通过实验学到的关键技术方法】
掌握了触发器的一些基本方法:
1.创建触发器
2.分清了触发器的种类,但是还是需要深入了解dml触发器中三个种类触发器的不同。
3.了解了触发器在我们实际操作中的作用
4.
第四篇:交换机实验 实验报告
交换机实验II 实验目的
1.理解掌握环路对网络造成的影响,掌握环路的自检测的配置; 2.理解路由的原理,掌握三层交换设备路由的配置方法 3.掌握DHCP的原理以及其配置方法
实验步骤
配置交换机的IP地址,及基本的线路连接等; 实验1:
①.用独立网线连接同一台交换机的任意两个端口时期形成自环
②.对交换机的两个端口进行配置,开启所有端口的环路检测功能、设置检测周期等属性 实验2:
①.按图1方式对三层交换机的VLAN、端口进行配置
②.在交换机中分别对VLAN的IP地址进行配置
③.启动三层交换机的IP路由
④.设置PC-A、PC-B的IP地址,分别将它们的网关设置为所属三层交换机VLAN的IP地址
⑤.通过Ping验证主机A、B之间的互通状况 实验3:
三层交换机作为DHCP服务器,两台PC-A和PC-B,分别从交换机上获取IP地址。PC-C手动配置IP地址。
①.按图2方式建立主机A、B、C与三层交换机间的连接,配置交换机的IP地址
②.配置三层交换机的DHCP地址池属性
③.启动DHCP服务
④.(1)查看主机A、B能否正确的获取到给定范围内IP地址,通过Ping查看网关、交换机之间的互通情况;(2)拔掉主机B的网线,将主机C的IP地址设置为主机B所获取的到的IP地址,然后再插上B机网线,查看其是否能获取到不同的IP地址;(3)分别重启主机A、B及交换机,查看A、B获取到的IP地址是否和前一次相同。
图1.三层路由连接图
图2.DHCP连接图
实验结果
实验1:环路测试
交换机出现环路的自检测结果:
实验2:路由配置:
主机A连接交换机端口2,划分为vlan10,端口IP地址为192.168.1.1。主机IP地址192.168.1.23;
主机B连接交换机端口10,划分为vlan20,端口IP地址为192.168.2.1。主机IP地址192.168.2.27;
在未设置IP routing之前主机A、B分属于不同网段,因此它们不能互通,设置后通过路由则可相互联通:
实验三:DHCP配置和验证:
主机A、B、C分别连接到交换机的端口2,端口18和端口10上。其中主机A、B的IP地址自动获取,主机C的IP地址则手动配置。
主机A通过DHCP获取的IP地址(192.168.1.211)
主机B通过DHCO获取到的IP地址(192.168.1.210)
测试主机A与主机C的互通性(可连通)
测试主机B与主机A、C之间的互通性(可连通)
当主机C配置为主机B获取到的IP地址是会产生IP地址冲突的错误提示:
配置的主机C的IP地址与主机B的IP地址相冲突
主机B网线重新连接后获取到的新的IP地址
交换机重新启动后A、B主机自动获取到的IP地址信息:
主机A自动获取的IP地址
主机B自动获取的IP地址
DHCP可分配IP地址池内IP数目小于申请的主机数目时实验验证情况:(可分配的IP地址为192.168.1.210 — 192.168.1.212),此时连接主机A、B、C、D。
主机D自动获取IP地址的结果
实验与结果分析
环路问题:
分为第二层环路和第三层环路,所有环路的形成都是由于目的路径不明确导致混乱而造成的。例如第二层,一个广播信息经过两个交换机的时候会不断恶性循环的产生广播造成环路,而第三层环路则是原路由意外不能工作,造成路由通告错误,形成一个恶性循环。传统的二层预防技术主要有STP(Spanning tree)来预防,STP在不断的修改和更新中,产生了诸如STP/RSTP/MSTP等多个版本,大家可根据各自的组网规划来选择应用,但是STP的配置复杂度,以及协议本身的开销通常都是网络管理人员比较头痛的事情。
解决因环路(自环或外环)对网络造成的影响,能够提高网络的自检错性、容错性和健壮性。环路检测的过称为:对交换机的每个端口周期性的发送回路检测(Loopback-detection)数据包;交换机查看端口收到包的CPUMAC字段,如果其中存的是本交换机的MAC,则本交换机的某些端口形成环路,否则将其丢弃,出现环路后,交换机会关闭端口号较大的端口以消除环路。图1中反映了在交换机开启所有端口的环路检测功能后每隔30秒检测到的信息以及对端口的关闭等操作信息。
三层路由意义和工作过程: 实现不同VLAN间主机的通信,通过配置VLAN能够有效地控制广播域的大小。在同一VLAN内的主机间的通信不需要经过交换机的路由处理可直接到达目的主机,当不同VLAN间通讯时,数据包先转发至路由器,由路由器查询其路由转发表选择正确的端口间数据包转发到目的VLAN的交换机,再由目的VLAN内交换机将数据包转发至目的主机。其中扮演主要角色的即为交换机的路由功能,如果没有设置相关属性则不同VLAN间不能通讯。
因此在图3的验证实验中,通过路由器的转发功能实现了分别位于VLAN10和VLAN20中主机A、B之间的通信,在未配置IP Routing之前VLAN10和VLAN20分属不同网段(A、B也属于不同网段),因此不能实现通信,配置之后路由器(三层交换设备)可通过内部路由转发表实现数据的转发和通信。
DHCP工作过程与实验分析:
即动态主机配置协议(Dynamic Host Configuration Protocol),是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,是使内部网络管理员能够集中管理(从中心结点监控)和自动分配IP 网络地址的通信协议。当某台计算机移到网络中的其它位置时,能自动收到新的IP 地址。DHCP 服务器从地址池中为客户端选择并分配IP 地址及其他相关参数当作为DHCP服务器的设备收到客户端发来的DHCP 请求时,将从地址池中挑选一个空闲的IP 地址。
DHCP工作过程:
当 DHCP客户端第一次登录网络的时候,也就是客户发现本机上没有任何 IP 数据设定,它会向网络发出一个 DHCP DISCOVER封包(广播包)。因为客户端还不知道自己属于哪一个网络,所以封包的来源地址会为 0.0.0.0,而目的地址则为 255.255.255.255,然后再附上 DHCP discover 的信息,向网络进行广播。如果都没有得到DHCP服务器的响应,客户端则会显示错误信息,宣告 DHCP discover 的失败。之后,基于使用者的选择,系统会继续在 5 分钟之后再重复一次 DHCP discover 的过程。
当 DHCP服务器监听到客户端发出的 DHCP discover 广播后,它会从那些还没有租出的地址范围内,选择最前面的空置 IP,连同其它 TCP/IP 设定,响应给客户端一个 DHCP OFFER封包。由于客户端在开始的时候还没有 IP 地址,所以在其 DHCP discover封包内会带有其 MAC 地址信息,并且有一个 XID 编号来辨别该封包,DHCP服务器响应的 DHCP offer 封包则会根据这些资料传递给要求租约的客户。根据服务器端的设定,DHCP offer封包会包含一个租约期限的信息。
如果客户端收到网络上多台 DHCP 服务器的响应,只会挑选其中一个 DHCP offer 而已(通常是最先抵达的那个),并且会向网络发送一个DHCP request广播封包,告诉所有 DHCP 服务器它将指定接受哪一台服务器提供的 IP 地址。同时,客户端还会向网络发送一个 ARP封包,查询网络上面有没有其它机器使用该 IP 地址;如果发现该 IP 已经被占用,客户端则会送出一个 DHCPDECLINE 封包给 DHCP服务器,拒绝接受其 DHCP offer,并重新发送 DHCP discover 信息。事实上,并不是所有 DHCP客户端都会无条件接受 DHCP服务器的 offer,尤其这些主机安装有其它 TCP/IP 相关的客户软件。客户端也可以用 DHCP request 向服务器提出 DHCP 选择,而这些选择会以不同的号码填写在 DHCP Option Field 里面。
当 DHCP服务器接收到客户端的 DHCP request 之后,会向客户端发出一个DHCPACK 响应,以确认 IP 租约的正式生效,标志着一次DHCP的工作过程完成。
图4—6反映了主机A、B通过自动获取IP地址方式由三层交换机动态分配IP后,各自得到的IP地址,由于A、B、C连接与同一台交换设备上,由没有VLAN划分等因素,所以它们之间不论是自动获取IP地址还是手动配置IP地址(不冲突的前提下)都能相互连通。当为主机C配置成已得到自动分配IP地址的主机B的IP地址时,自然会出现IP地址冲突的出错信息提示。当B网线重新链接时,相当于重新加入的客户端,交换机会从地址池中顺序选择下一个未分配的IP地址给新的请求用户。因此主机B会获得新新的IP地址,并且其值是主机C的IP地址的下一个邻接IP地址(在未超出可分配的IP地址范围条件下)。图7 —10中反映了上述描述的结果。
图11中显示了一种造成IP地址动态分配失败的情形:可分配的IP地址数仅有3个,而由4台主机请求分配IP地址,当可分配地址全部分配给主机A、B、C后,主机D的请求不能得到满足,因此未得到给定范围内的合理IP地址。
第五篇:实验一 实验报告
网 络 程 序 设 实验报告
实验名称:Winsock编程接口实验 实验类型: 验 证 型
计
一、实验目的
掌握Winsock的启动和初始化;
掌握gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的使用。
二、实验设计
实验内容:
1、编写程序能同时实现对多个域名的解析。比如在控制台输入:getip www.xiexiebang.com对应的IP地址列表。
2、编写程序获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址。
根据实验内容编写程序:
1、对相关域名进行解析,利用gethostbyname()完成解析,用到的结构体为:
struct hostent{ char FAR*
h_name;char FAR* FAR* h_aliases;short
h_addrtype;short
h_length;char FAR* FAR* h_addr_list;}
得到的IP地址列表由h_addr_list存储;
2、利用GetAdaptersInfo()函数获得本地主机的相关信息,通过IP_ADAPTER_INFO结构体返回所需信息。
IP_ADAPTER_INFO的定义如下: typedef struct _IP_ADAPTER_INFO {
struct _IP_ADAPTER_INFO* Next;
DWORD ComboIndex;
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
UINT AddressLength;
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
DWORD Index;
UINT Type;
UINT DhcpEnabled;
PIP_ADDR_STRING CurrentIpAddress;
IP_ADDR_STRING IpAddressList;
IP_ADDR_STRING GatewayList;
IP_ADDR_STRING DhcpServer;
BOOL HaveWins;
IP_ADDR_STRING PrimaryWinsServer;
IP_ADDR_STRING SecondaryWinsServer;
time_t LeaseObtained;
time_t LeaseExpires;
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
三、实验过程(包含实验结果)
1、分析题目,编写程序;
2、将编写的程序进行编译、运行,输入题目给定的内容,完成题目要求; 结果如下:
第1题:
第2题:
四、讨论与分析
思考题:
1、Winsock初始化的作用:只有调用了WSAStartup()进行初始化之后,应用程 序才能调用其他Windows Sockets API函数,实现网络通信;
2、函数原型为:
DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo,//接受数据的缓冲区
PULONG pOutBufLen
// 数据的长度大小);
3、域名解析时出现域名对应多个IP,原因:该域名存在于多个服务器。
五、实验者自评
通过本次实验,我掌握了Winsock的启动和初始化以及gethostname(),gethostbyname(),GetAdaptersInfo()等函数查询的使用,加深了以前对课本知识的认识程度。
六、附录:关键代码(给出适当注释,可读性高)
第1题代码:
////////////////////////////////////////////////// // GetAllIps.cpp文件
//#include “../common/InitSock.h” #include
using namespace std;
#pragma comment(lib, “WS2_32”)// 链接到WS2_32.lib //CInitSock initSock;// 初始化Winsock库
void main(){
char szMessage[256];// 取得本地主机名称
// 初始化
WSADATA wsaData;if(WSAStartup(MAKEWORD(2,2), &wsaData)!= 0){
exit(0);}
// 通过主机名得到地址信息
printf(“ Get IP::”);gets(szMessage);
// 获取主机信息
hostent *pHost = ::gethostbyname(szMessage);
// 打印出所有IP地址
in_addr addr;for(int i = 0;;i++){
char *p = pHost->h_addr_list[i];
if(p == NULL)
break;
memcpy(&addr.S_un.S_addr, p, pHost->h_length);
char *szIp = ::inet_ntoa(addr);
printf(“ 服务器 %s IP地址:%s n ”,szMessage, szIp);
printf(“服务器名字: %s n”,pHost->h_name);}
/////////////////////////// ::WSACleanup();
}
第2题代码:
// 获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址
#include
void main(){ // 定义变量
IP_ADAPTER_INFO *pAdapterInfo;ULONG ulOutBufLen;DWORD dwRetVal;PIP_ADAPTER_INFO pAdapter;
pAdapterInfo =(IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));ulOutBufLen = sizeof(IP_ADAPTER_INFO);// 第一次获取适配器信息,得到ulOutBufLen的实际大小
if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)!= ERROR_SUCCESS){
free(pAdapterInfo);
pAdapterInfo =(IP_ADAPTER_INFO *)malloc(ulOutBufLen);} // 第二次获取适配器信息,获得了pAdapterInfo信息
if(dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)!= ERROR_SUCCESS){
cout<<“GetAdapterInfo Error!”< // 打印MAC地址信息、子网掩码以及网关 pAdapter = pAdapterInfo;while(pAdapter){ cout<<“MAC Address: ”; for(int i=0;i AddressLength;i++) { if(i ==(pAdapter->AddressLength-1)) { cout< } else { cout< } } cout< cout<<“IP 地址:”< IpAddressList.IpAddress.String< cout<<“子网掩码 :”< IpAddressList.IpMask.String< cout<<“网关 :”< IpAddressList.IpAddress.String< cout<<“****************************************”< pAdapter = pAdapter->Next;} // 释放资源 if(pAdapterInfo){ free(pAdapterInfo);} cout< }