精华内容
下载资源
问答
  • 适合下列人员: 云迁移架构师 云解决方案架构师 云应用设计师及资深工程师 大学计算机系和软件学院学生
  • 适合下列人员: 云迁移架构师 云解决方案架构师 云应用设计师及资深工程师 大学计算机系和软件学院学生
  • Software Testing_软件测试基础知识

    千次阅读 2020-09-19 17:01:41
    1.1_软件测试背景 软件缺陷给我们的生产和生活造成了大量的损失,这些惨痛的教训时刻警醒着世人要更加重视软件测试,不断提高软件的质量。 1.1.1_软件故障案例 1.1.2 _软件缺陷定义 软件缺陷,即计算机软件或程序中...

    你好,我是阿Ken
    开学新加了软件测试这门课,故因此特意整理出一个新专栏,
    参考学校有关教材并进行整理和删减,属于课程相关笔记,重点以考试考点为主,其次为简单了解软件测试。

    在这里插入图片描述

    人总归不能活的太矫情
    希望在一塌糊涂的时候你也能鼓励自己坚持下去
    悲喜自渡,他人难悟

    1.1_软件测试背景

    软件缺陷给我们的生产和生活造成了大量的损失,这些惨痛的教训时刻警醒着世人要更加重视软件测试,不断提高软件的质量。

    1.1.1_软件故障案例

    1.1.2 _软件缺陷定义

    软件缺陷,即计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。

    缺陷的存在会导致软件产品在某种程度上不能满足用户的需要。IEEE729-1983 对缺陷有一个标准的定义:从产品内部看,缺陷是软件产品开发或维护过程中存在的错误、毛病等各种问题;从产品外部看,缺陷是系统所需要实现的某种功能的失效或违背。

    对于软件缺陷的定义,通常有以下 5 项规则描述,如符合任意一项,便称为“软件缺陷”:

    (1) 软件未达到产品说明书中已标明的功能。

    (2) 软件出现了产品说明书中指明不会出现的错误。

    (3) 软件未达到产品说明书中虽未指出但应达到的目标。

    (4) 软件功能超出了产品说明书中指明的范围。

    (5) 软件测试人员认为软件难以理解,不易使用、运行速度缓慢,或者最终用户认为该软件使用效果不佳。

    1.2_软件开发过程

    1.2.1_软件产品的组成

    1. 软件产品需要各种开发投入
    2. 客户需求
    3. 产品说明书
    4. 进度表
    5. 软件设计文档
    6. 测试文档

    1.2.2_软件项目组成员

    软件项目的开发需要大量人员的团结协作,下面的清单列出了主要人员及其职责。

    ① 项目管理员、程序管理员或者监制人:始终驱动整个项目,负责编写产品说明书、管理进度,进行重大决策和取舍。

    ② 设计师或者系统工程师:是软件小组的技术专家,设计整个系统架构或软件构思。

    ③ 程序员、开发人员或者代码制作者:设计、编写并修复软件中的缺陷。

    ④ 测试员或者质量评判员:负责找出并报告软件产品的问题。

    ⑤ 技术作者、用户手册、用户培训专员、手册编号人员或者文案专员:编制软件产品附带的文件和联机文档。

    ⑥ 软件管理员或者制作人员:负责把程序员编写的全部文档资料合成一个软件包。

    1.2.3_软件开发模式

    从最初构思到公开发行软件产品的过程称为软件开发模式。

    1. 快速原型模型

    快速原型模型允许在需求分析阶段,对软件的需求进行初步的非完全的分析和定义。

    2. 增量模型

    采用随着日程时间的进展而交错的线性序列,每一个线性序列产生软件的一个可分布的“增量”。

    3. 原型模型

    原型模型也称样品模型,它采用逐步求精的方法完善模型。

    4. 喷泉模型

    喷泉模型是以用户需求为动力,以对象为驱动的模型,不要用于面向对象技术的软件开发项目。

    5. 螺旋模型

    螺旋模型适合用于需求经常变化的项目,适用于大型复杂的系统。

    6. 瀑布模型

    从本质来讲,瀑布模型是一个软件开发架构重复应用的模型,其核心思想是按工序交问题化简,将功能的实现与设计分开,便于分工协作,即采用结构化的分析与设计方法,将逻辑实现与物理实现分开。

    1.3_软件测试基本理论

    1.3.1_软件测试的基本概念

    1. 软件测试的定义

    _
    软件测试就是使用人工或者自动化工具按照测试方案流程对产品进行测试的过程。
    _
    有时需要编写不同的测试工具,设计和维护测试系统,对测试方案可能出现的问题进行分析和评估。执行测试用例后,需要跟踪故障,以确保开发的产品适合用户的需求。
    _
    软件测试是帮助识别开发完成 (中间或最终的版本) 的计算机软件 (整体或部分) 的正确度、完全度和质量的软件过程,是SQA ( Sofware Quality Assurance) 的重要子域。

    2. 测试原则

    _
    (1)软件开发人员及程序员应当避免测试自己的程序。自己软件的测试要别人来进行反而更有效。
    (2)应尽早和不断地进行软件测试。
    (3)对测试用例要有正确的态度。在设计测试用例时,不仅要考虑合理的输入条件,更要注意不合理的测试条件。
    (4)人以群分,物以类聚。充分注意20—80原则,不要以为发现几个错误并且解决这些问题后,就不需要进行测试了。
    (5)严格执行测试计划,排除测试的随意性。
    (6)应当对每一个测试结果进行全面检查。
    (7)妥善保存测试计划、测试用例、测试报告和最终分析报告,以备回归测试及维护之用。

    3. 测试目标

    _
    软件测试的目的决定了如何去组织测试。如果测试的目的是为了尽可能多地找出错误,那么测试就应该直接针对软件比较复杂的部分或是以前出错比较多的位置进行。如果测试目的是为了给最终用户提供具有一定可信度的质量评价,那么测试就应该直接针对在实际应用中会经常用到的商业假设。
    _
    不同的机构会有不同的测试目的;相同的机构也可能有不同测试目的,可能是测试不同区城或是对同一区域的不同层次的测试。

    1.3.2_软件测试的基本技术

    1. 软件测试的基本方法

    _
    对于软件测试技术,可以从不同的角度加以分类:
    _
    从是否需要执行被测软件的角度,可分为静态测试和动态测试:
    _
    从测试是否针对系统的内部结构和具体实现算的角度来看,可分为白盒测试和黑盒测试
    _

    (1) 黑盒测试

    _
    黑盒测试也称功能测试数据驱动测试,它是在已知产品所应具有的功能的前提下,通过测试来检测每个功能是否都能正常使用
    在测试时,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。黑盒测试方法主要有等价类划分法、边界值分析法、因果图法、错误推测法等,主要用于软件确认测试。
    _
    “ 黑盒 ” 法着眼于程序外部结构,不考虑内部逻辑结构,针对软件界面和软件功能进行测试。“黑盒” 法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无有多个,人们不仅要测试所有合法的输入,面且还要对那些不合法但是可能的输入进行测试。
    _

    (2) 白盒测试

    _
    白盒测试也称结构测试逻辑驱动测试,它是在已知产品内部工作过程的前提下,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都能按预定要求正确工作,而不顾它的功能。白盒测试的主要方法有逻辑覆盖法、基本路径法等,主要用于软件验证
    “ 白盒 ” 法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。“ 白盒 ” 法是穷举路径测试。在使用这一方案时, 测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试绝不能查出程序违反了设计规范,即程序本身就是个错误的程序; 第二,穷举路径测试不可能查出程序中因遗漏路径而出的错; 第三,穷举路径测试可能发现不了一些与数据相关的错误。

    2. 软件测试的复杂性与经济性

    人们常常以为开发一个程序是困难的,测试一个程序则比较容易。这其实是种误解。

    3. 测试过程及组织

    首先,测试人员要仔细阅读有关资料,做好测试前的准备工作。
    测试过程分成几个阶段:
    1 代码会审
    2 单元测试(集中检查软件设计的最小单位–模块上)
    3 集成测试(将模块按照设计要求组装起来同时进行测试)
    4 确认测试(目的是向未来的用户表明系统能够像预定要求那样工作)
    5 系统测试(软件开发完成后,最终还要与系统中其他部分配套运行)

    1.4_软件质量 与质量模型

    1.4.1_软件质量的定义

    软件质量:即国际化标准组织 ISO ISOIEO9126 中将软件质量定义为反映软件产品满足规定需求潜在需求能力的特征和特征的总和。

    MJ. Fisher 将软件质量定义为所有描述计算机软件优秀程度的特性的组合。也就是说,为了满足软件的各项精确定义的功能、性能要求,符合文档化的开发标准,需要相应地给出或设计一些质量特性及其组合,要得到高质量的软件产品,就必须满足这些质量特性。

    按照 ANSI/IEEE Std 1061.1992 中的标准,软件质量定义为:与软件产品满足需求所规定的和隐含的能力有关的特征或特性的全体。具体包括:

    (1) 软件产品中所能满足用户给定需求的全部特性的集合;

    (2) 软件具有所有的各种属性组合的程度;

    (3) 用户主观得出的软件是否满足其综合期望的程度;

    (4) 决定所用软件在使用中将满足其综合期望程度的合成特性。

    目前,对软件质量特性有多种提法,但实际上是大同小异。ISOIEC 9126 国际标准中定义的软件质量特性为以下6项:功能性、可靠性、易使用性、效率、可维护性和可移植性。

    1.4.2_影响软件质量的因素

    软件本身的特点和目前软件开发模式的些缺陷,使软件内部的质量问题有时不可能完全避免。

    (1) 软件本身的特点。 软件只有复杂性、 一致性、可变性和不可见性。

    (2) 开发环节多跟据传统的瀑布模型,增加了成本。

    (3) 选择支持工具。在软件的整个开发过程中,能够得到的开发工具或管理工具都十分有限。

    (4) 测试的局限性。测试只能在一定程度上把错误减少到最低限度。

    1.4.3_软件质量控制

    1. 软件质量控制的定义

    _
    在IEEE中对软件质量控制的定义是:用以评价开发或生产的软件产品质量的一系列活动。质量控制是质量管理的一部分, 是为保证每一件产品都满足对它的需求而应用于整个开发周期中的一系列审查和测试。
    _
    软件质量控制是指监视项目的具体结果,以确定其是否符合相关的质量标准,并判断如何杜绝造成不合格结果的根源。这就是说,软件质量控制是以软件质量为目的,以软件质量评估为度量,以软件质量控制为核心手段,高效地运作软件开发的过程。
    _
    高质量的软件离不开有效的管理和控制。J.M.Juran 认为,质量控制是一个常规的过程,通过它度量实际的质量性能并与标准比较,当出现差异时采取行动。由此,Donald Refer给出软件质量控制定义:软件质量控制是系列的验证活动,在软件开发过程之中的任何一点进行评估开发的软件产品是否在技术上符合该阶段指定的规约。
    _
    由此,我们给出软件质量管理的定义是:软件质量管理是一系列的验证活动,通过这些活动,我们可以判断软件开发各个阶段是否符合既定的要求,对发生的软件缺陷和软件错误是否给出及时的修正和纠正。

    2. 软件质量管理方法

    _
    软件的开发至今仍不能自动化地进行,而以人工开发方式为主。针对软件的特点,对软件的质量控制,更应该注重对软件过程的控制,通过完善质量管理体系以适应软件质量管理要求。

    1.4.4_软件质量评估的标准与度量

    软件质量有与硬件不同的评价方法,根据软件产品的特性,评估一个软件的质量需要有一个评价标准、一个评价准则和一种度量。

    1. 标准

    _
    软件的质量标准就是软件质量的 6 个特性,如下所述。
    _
    (1) 功能性:
    指软件所实现的功能满足用户需求的程度。
    _
    (2) 可靠性:
    指在规定的时间和条件下,软件所能维持其应有性能水平的程度。它除了反映软件满足用户需求正常运行的程度,而且反映了在故障发生时能继续运行的程度。
    _
    (3) 易用性:
    指对于一个软件, 用户学习、操作时所做的努力程度。易用性反映了软件与用户的友善性。
    _
    (4) 效率:
    指在指定的条件下,软件实现某种功能所需要的计算机资源(CPU、内存、接口、外设等)时间的有效程度。效率反映了在完成功能要求时,有没有浪费资源。
    _
    (5) 可维护性:
    指在一个运行的软件中,为了满足用户需求、环境改变或软件发生错误时,进行相应修改所做的努力程度。可维护性反映了在用户需求、环境发生变化或软件发生错误时,对软件进行修改的容易程度。
    _
    (6) 可移植性:
    指从一个计算机系统或环境移植到另一个计算机系统或环境的容易程度。可移植性反映了软件在不同环境的适应程度,评价了软件的质量。

    2. 准则

    _
    对不同类型的软件、软件的各个开发阶段,评价准则要进行不同的有机组合,方可反映出该软件的质量要素。

    3. 度量

    _
    在软件开发不同的生命周期,对不同类型的软件在每一个阶段制定相应的评价内容,以实现软件开发过程的质量控制。

    1.4.5_软件度量的方法体系

    1. 项目度量
      _
      项目度量是针对软件开发项目的特定度量。

    2. 规模度量
      _
      规模度量是估算软件项目工作量、编制成本预算、策划合理项目进度的基础。

    3. 成本度量
      _
      主要指软件开发项目所需的财务性成本的估算。

    4. 顾客满意度度量

    5. 软件质量的生命周期及其度量

    6. 过程度量
      _
      过程度量是对软件开发过程的各个方面进行度量

    课后提醒

    以上内容应了解:
    软件缺陷的定义
    原型法开发模式的优缺点
    软件测试的几大原则
    软件质量的六个特性
    测试的过程及组织

    • 简述原型法开发模式的优缺点
      原型模型的优点如下:

      _
      (1) 开发人员和用户在“原型” 上达成一致。这样一来,可以减少设计中的错误和开发中的风险,也减少了对用户培训的时间,而提高了系统的实用、正确性以及用户的满意程度。
      _
      (2) 缩短了开发周期,加快了工程进度。
      _
      (3) 降低成本。
      _
      原型模型的缺点如下:
      _
      (1) 当重新生产该产品时,难以让用户接收,给工程继续开展带来不利因素。
      _
      (2) 不宜利用原型系统作为最终产品。采用原型模型开发系统,用户和开发者必须达成一致。

    • 简述测试的过程及组织
      当设计工作完成以后,就应该着手测试的准备工作了,一般来讲, 由一位对整个系统设计熟悉的设计人员编写测试大纲,明确测试的内容和测试通过的准则,设计完整合理的测试用例,以便系统实现后进行全面测试。

      _
      在实现组将所开发的程序经验证后,提交测试组,由测试负责人组织测试,测试一般可按下列方式组织:
      _
      (1) 首先,测试人员要仔细阅读有关资料,包括规格说明、设计文档、使用说明书及在设计过程中形成的测试大纲、测试内容及测试的通过准则,全面熟悉系统,编写测试计划,设计测试用例,作好测试前的准备工作。
      _
      (2) 为了保证测试的质量,将测试过程分成几个阶段,即:代码审查、单元测试、集成测试、确认测试和系统测试。
      _
      (3) 代码会审。
      代码会审是由组人通过阅读、讨论和争议对程序进行静态分析的过程。会审小组在充分司读待审程序文本、控制流程图及有关要求、规范等文件基础上,召开代码会审会,程序员逐句讲解程序的逻辑,并展开热烈的讨论甚至争议,以揭示错误的关键所在。实践表明,程序负在讲解过程中能发现许多自己原来没有发现的错误,而讨论和争议则进步促使了问题的暴露。

      _
      (4) 单元测试。
      单元测试集中在检查软件设计的最小单位模块上,通过测试发现实现该模块的实际功与定义该模块的功能说明不符合的情况,以及编码的错误。

      _
      (5) 集成测试。
      集成测试是将模块按照设计要求组装起来同时进行测试,主要目标是发现与接口有关的问题。如数据穿过接口时可能丢失;一个模块与另一个模块可能有由于疏忽的问题而造成有害影响;把子功能组合起来可能不产生预期的主功能;个别看起来是可以接受的误差可能积累到不能接受的程度;全程数据结构可能有错误等。

      _
      (6) 确认测试。
      确认测试的目的是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性, 这就是确认测试的任务,即软件的功能和性能如同用户所合理期待的那样。

      _
      (7) 系统测试。
      软件开发完成以后,最终还要与系统中其他部分配套运行,进行系统测试。包括恢复测试、安全测试、强度测试和性能测试等。

      _
      经过上述的测试过程对软件进行测试后,软件基本满足开发的要求,测试宣告结束,经验收后,将软件提交用户。

    在这里插入图片描述

    记得前几年上高中的时候,有个同学在讲台上说过一句话,
    “你没有输,你只不过是还没有赢而已”
    他本来成绩好像还前三前五稳稳的,
    甚至后来最差的时候都能十几名,
    但他最后是攥着一张双一流的大学录取通知书去的北京某校…
    平凡很烦
    但你不能烦
    找到自己的节奏懂得迎难而上
    有了自己的节奏坚持下去总归是没错的

    我是阿Ken
    欢迎下次来访

    展开全文
  • 应用程序将显示一条错误信息,指示用户重新配置网络软件(这是一种可能要使用 szSystemStatus 文本的场合)。显然无法保证某个应用程序能够真正分配 iMaxSockets 个 socket ,因为可能有其它 WindowsSockets 应用...

    =====================================================

    FFmpeg的库函数源代码分析文章列表:

    架构图】

    FFmpeg源代码结构图解码

    FFmpeg源代码结构图编码

    【通用】

    FFmpeg 源代码简单分析:av_register_all()

    FFmpeg 源代码简单分析:avcodec_register_all()

    FFmpeg 源代码简单分析:avformat_network_init ()

    FFmpeg 源代码简单分析:内存的分配和释放(av_malloc()av_free()等)

    FFmpeg 源代码简单分析:常见结构体的初始化和销毁(AVFormatContextAVFrame等)

    FFmpeg 源代码简单分析:avio_open2()

    FFmpeg 源代码简单分析:av_find_decoder()av_find_encoder()

    FFmpeg 源代码简单分析:avcodec_open2()

    FFmpeg 源代码简单分析:avcodec_close()

    【解码】

    图解FFMPEG打开媒体的函数avformat_open_input

    FFmpeg 源代码简单分析:avformat_open_input()

    FFmpeg 源代码简单分析:avformat_find_stream_info()

    FFmpeg 源代码简单分析:av_read_frame()

    FFmpeg 源代码简单分析:avcodec_decode_video2()

    FFmpeg 源代码简单分析:avformat_close_input()

    【编码】

    FFmpeg 源代码简单分析:avformat_alloc_output_context2()

    FFmpeg 源代码简单分析:avformat_write_header()

    FFmpeg 源代码简单分析:avcodec_encode_video()

    FFmpeg 源代码简单分析:av_write_frame()

    FFmpeg 源代码简单分析:av_write_trailer()

    【其它】

    FFmpeg源代码简单分析:日志输出系统(av_log()等)

    FFmpeg源代码简单分析:结构体成员管理系统-AVClass

    FFmpeg源代码简单分析:结构体成员管理系统-AVOption

    FFmpeg源代码简单分析:libswscalesws_getContext()

    FFmpeg源代码简单分析:libswscalesws_scale()

    FFmpeg源代码简单分析:libavdeviceavdevice_register_all()

    FFmpeg源代码简单分析:libavdevicegdigrab

    【脚本】

    FFmpeg源代码简单分析:makefile

    FFmpeg源代码简单分析:configure

    H.264

    FFmpegH.264解码器源代码简单分析:概述

    =====================================================

     

    Avformat.h (libavformat)

    Utils.c (libavformat)

     

    #include "libavformat/avformat.h"

    /**

    * Do global initialization of network components. This is optional,

    * but recommended, since it avoids the overhead of implicitly

    * doing the setup for each session.

    *

    * Calling this function will become mandatory if using network

    * protocols at some major version bump.

    */

    int avformat_network_init(void);

     

    1.加载socket库以及网络加密协议相关的库,为后续使用网络相关提供支持

     

    PS:

    OpenSSL Open Secure Sockets Layer 开放式安全套接层协议

    是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

    OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的网站使用名为OpenSSL开源软件包。OpenSSL漏洞不仅影响以https开头的网站,黑客还可利用此漏洞直接对个人电脑发起"心脏出血"Heartbleed)攻击。据分析,Windows上有大量软件使用了存在漏洞的OpenSSL代码库,可能被黑客攻击抓取用户电脑上的内存数据

    GnuTLS 是一个加密协议库,实现了 SSLTLS  DTLS 协议和相关技术,提供了简单的 C 语言编程接口用来访问这些安全通讯协议,提供解析和读写 X.509PKCS #12OpenPGP 和其他相关结构。特点是可移植性和高效。虽然不像之前传出重大漏洞的OpenSSL函数库那么流行,不过GnuTLS的使用范围也相当广泛,包含在Red HatUbuntuDebianLinux操作系统及350种相关软件

    打开网络流的话,前面要加上函数avformat_network_init()

    ES:socket编程

     

     

     

    源代码:

    1. int avformat_network_init(void)  
    2. {  
    3. #if CONFIG_NETWORK  
    4.     int ret;  
    5.     ff_network_inited_globally = 1;  
    6.     if ((ret = ff_network_init()) < 0)  
    7.         return ret;  
    8.     if ((ret = ff_tls_init()) < 0)  
    9.         return ret;  
    10. #endif  
    11.     return 0;  
    12. }  

     

    1. int ff_network_inited_globally;  
    2.    
    3. int ff_network_init(void)  
    4. {  
    5. #if HAVE_WINSOCK2_H  
    6.     WSADATA wsaData;  
    7. #endif  
    8.    
    9.     if (!ff_network_inited_globally)  
    10.         av_log(NULL, AV_LOG_WARNING, "Using network protocols without global "  
    11.                                      "network initialization. Please use "  
    12.                                      "avformat_network_init(), this will "  
    13.                                      "become mandatory later.\n");  
    14. #if HAVE_WINSOCK2_H  
    15.     if (WSAStartup(MAKEWORD(1,1), &wsaData))  
    16.         return 0;  
    17. #endif  
    18.     return 1;  
    19. }  
    20.  
    21.  
    22.  
    23.  
    24.  
    25. int ff_tls_init(void)  
    26. {  
    27. #if CONFIG_TLS_OPENSSL_PROTOCOL  
    28.     int ret;  
    29.     if ((ret = ff_openssl_init()) < 0)  
    30.         return ret;  
    31. #endif  
    32. #if CONFIG_TLS_GNUTLS_PROTOCOL  
    33.     ff_gnutls_init();  
    34. #endif  
    35.     return 0;  
    36. }  

     

    关于WSAStartup分析如下:

     

    WSAStartup( )

    这里用通俗的语言解释一下这个函数,就类似于opencv一样,要添加链接库函数,cv.lib等,要添加到附加依赖项,或者通过#pragma comment(lib,"cv.lib")一样,然后才能包含头文件进行各种函数的调用。当然了,socket编程要调用各种socket函数,但是需要库Ws2_32.lib和头文件Winsock2.h,这里的WSAStartup就是为了向操作系统说明,我们要用哪个库文件,让该库文件与当前的应用程序绑定,从而就可以调用该版本的socket的各种函数了。

    头文件 header  Winsock2.h

    library      Ws2_32.lib
    原型:
    int   PASCAL   FAR  WSAStartup ( WORD  wVersionRequested, LPWSADATA   lpWSAData );
    参数:wVersionRequestedWindows Sockets API提供的调用方可使用的最高版本号。高位字节指出副版本(修正)号,低位字节指明主版本号
            lpWSAData 
    是指向WSADATA数据结构指针,用来接收Windows Sockets实现的细节

    WSADATA数据类型:这个结构被用来存储 WSAStartup函数调用后返回的 Windows Sockets数据。它包含Winsock.dll执行的数据。

      结构原型:  

    struct WSAData {

      WORD wVersion;

      WORD wHighVersion;

      char szDescription[WSADESCRIPTION_LEN+1];

      char szSystemStatus[WSASYSSTATUS_LEN+1];

      unsigned short iMaxSockets;

      unsigned short iMaxUdpDg;

      char *lpVendorInfo;};

      WSADATA结构被用来保存函数WSAStartup返回的Windows Sockets初始化信息。

      成员:

      wVersion

      Windows Sockets DLL期望调用者使用的Windows Sockets规范的版本。 高位字节存储副版本号, 低位字节存储主版本号,可以用WORD MAKEWORD(BYTE,BYTE ) 返回这个值,例如:MAKEWORD(1,1)

      wHighVersion

      这个DLL能够支持的Windows Sockets规范的最高版本。通常它与wVersion相同。

      szDescription

      以null结尾的ASCII字符串,Windows Sockets DLL将对Windows Sockets实现的描述拷贝到这个字符串中,包括制造商标识。文本(最多可以有256个字符)可以包含任何字符,但是要注意不能包含控制字符和格式字符,应用程序对其最可能的使用方式是把它(可能被截断)显示在在状态信息中。

      szSystemStatus

      以null结尾的ASCII字符串,Windows Sockets DLL把有关的状态或配置信息拷贝到该字符串中。Windows Sockets DLL应当仅在这些信息对用户或支持人员有用时才使用它们,它不应被作为szDescription域的扩展。

      iMaxSockets

      单个进程能够打开的socket的最大数目Windows Sockets的实现能提供一个全局的socket池,可以为任何进程分配;或者它也可以为socket分配属于进程的资源。这个数字能够很好地反映Windows Sockets DLL或网络软件的配置方式。应用程序的编写者可以通过这个数字来粗略地指明Windows Sockets的实现方式对应用程序是否有用。例如,X Windows服务器在第一次启动的时候可能会检查iMaxSockets的值:如果这个值小于8,应用程序将显示一条错误信息,指示用户重新配置网络软件(这是一种可能要使用szSystemStatus文本的场合)。显然无法保证某个应用程序能够真正分配iMaxSocketssocket,因为可能有其它WindowsSockets应用程序正在使用。

      iMaxUdpDg Windows Sockets应用程序能够发送或接收的最大的用户数据包协议(UDP)的数据包大小,以字节为单位。如果实现方式没有限制,那么iMaxUdpDg为零。在Berkeley sockets的许多实现中,对于UDP数据包有个固有的限制(在必要时被分解),大小为8192字节。Windows Sockets的实现可以对碎片重组缓冲区的分配作出限制。对于适合的WindowsSockets 实现,iMaxUdpDg的最小值为512。注意不管iMaxUdpDg的值是什么,都不推荐你发回一个比网络的最大传送单元(MTU)还大的广播数据包。(Windows Sockets API 没有提供发现MTU的机制,但是它不会小于512个字节)WinSock2.0版中已被废弃。

      lpVendorInfo 指向销售商的数据结构的指针。这个结构的定义(如果有)超出了WindowsSockets规范的范围。WinSock2.0版中已被废弃。

    其实说白了wsastartup主要就是进行相应的socket库绑定。

    WSAStartup() - 功能

    一、WSAStartup函数 
    int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData ); 
    使用Socket的程序在使用Socket之前必须调用WSAStartup函数。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
    二、WSACleanup函数 
    int WSACleanup (void); 
    应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。

      

    WSAStartup() - 使用方法

    当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0 
    例:假如一个程序要使用2.1版本的Socket,那么程序代码如下 
    wVersionRequested = MAKEWORD( 2, 1 ); 
    err = WSAStartup( wVersionRequested, &wsaData );

    二、WSACleanup函数 
    int WSACleanup (void); 
    应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。 

     Socket接口的检索有关域名、通信服务和协议Internet信息的数据库函数,如

    gethostbyaddrgethostbynamegethostnamegetprotolbyname

    getprotolbynumbergetserverbynamegetservbyport 
    1
    gethostname()

    函数原型】int PASCAL FAR gethostname (char FAR * name, int namelen);

    【使用说明】该函数可以获取本地主机的主机名,其中:

      name:用于指向所获取的主机名的缓冲区指针

      Namelen:缓冲区的大小,以字节为单位。

      返回值:若无错误,返回0;否则,返回错误代吗。 
    2
    gethostbyname()

      【函数原型】

    struct hostent FAR * PASCAL FAR gethostbyname(const char FAR * name);

      【使用说明】

      该函数可以从主机名数据库中得到对应的"主机"

      该函数唯一的参数name就是前面调用函数gethostname()得到的主机名。若无错误,刚返回一个指向hostent结构的指针,它可以标识一个"主机"列表。

            

    本协议允许Windows Sockets DLLWindows Sockets应用程序共同支持一定范围的Windows Sockets版本.如果版本范围有重叠,应用程序就可以成功地使用Windows Sockets DLL.下列的图表给出了WSAStartup()在不同的应用程序和Windows Sockets DLL版本中是如何工作的:
    应用程序版本  DLL版本  wVersionRequested   wVersion   wHighVersion  最终结果
    1.1             1.1             1.1             1.1             1.1             use 1.1
    1.0 1.1         1.0             1.1                 1.0             1.0             use 1.0 
    1.0             1.0 1.1         1.0                 1.0             1.1             use 1.0
    1.1             1.0 1.1         1.1                 1.1             1.1             use 1.1
    1.1             1.0             1.1                 1.0             1.0            
     失败
    1.0             1.1             1.0                 
    -             -    WSAVERNOTSUPPORTED
    1.0 1.1         1.0 1.1         1.1                 1.1             1.1             use 1.1
    1.1 2.0         1.1             2.0                 1.1             1.1             use 1.1
    2.0             1.1             2.0                 1.1             1.1            
     失败

       
     下列代码段给出了只支持Windows Sockets 1.1版本的应用程序是如何进行WSAStartup()调用的:
    WORD wVersionRequested;
    WSADATA wsaData;

    int err;
    wVersionRequested = MAKEWORD( 1, 1 );

     err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
                    
                   
                    return;
                 }

     

      

     
     
     
     if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )

    {
     
     
     WSACleanup( );
     return;

     }

    下面的代码段示例了只支持1.1版的Windows Sockets DLL是如何进行WSAStartup()协商的:
    if ( LOBYTE( wVersionRequested ) < 1 || ( LOBYTE( wVersionRequested ) == 1 &&
        HIBYTE( wVersionRequested ) < 1 ) )

    {
     return WSAVERNOTSUPPORTED;

     }

     lpWsaData->wVersion = MAKEWORD( 1, 1 );
     lpWsaData->wHighVersion = MAKEWORD( 1, 1 );
           
     一旦应用程序或DLL进行了一次成功的WSAStartup()调用,它就可以继续进行其它所需的Windows Sockets API调用.当它完成了使用该Windows Sockets DLL的服务后,应用程序或DLL必须调用WSACleanup()以允许Windows Sockets DLL释放任何该应用程序的资源.
    错误代码:
    WSASYSNOTREADY      指出网络通信依赖的网络子系统还没有准备好.
    WSAVERNOTSUPPORTED  所需的Windows Sockets API的版本未由特定的Windows Sockets实现提供.
    WSAEINVAL    应用程序指出的Windows Sockets版本不被该DLL支持.
    参见:
            send(), sendto(), WSACleanup()

    Windows下,Socket是以DLL的形式实现的。在DLL内部维持着一个计数器,只有第一次调用WSAStartup才真正装载DLL,以后的 调用只是简单的增加计数器,而WSACleanup函数的功能则刚好相反,每调用一次使计数器减1,当计数器减到0时,DLL就从内存中被卸载!因此,你 调用了多少次WSAStartup,就应相应的调用多少次的WSACleanup. 

     

    展开全文
  • TS高清封装提取工具tsMuxeR_1.10.6绿色汉化版

    千次下载 热门讨论 2011-01-24 10:18:41
    现在有了这个TSMUXER就简单啦,按下列四步就完全可以自己的REMUX版,赶紧下载软件来制作自己的第一步REMUX版吧。 看图,下图中加入的视频为蓝光版本的“大开眼戒”,其中一个最大的为34.8G,从图中可以看到视频格式...
  • TS高清容器封装提取工具tsMuxeR_1.10.6绿色汉化版

    千次下载 热门讨论 2010-06-29 05:21:39
    现在有了这个TSMUXER就简单啦,按下列四步就完全可以自己的REMUX版,赶紧下载软件来制作自己的第一步REMUX版吧。 看图,下图中加入的视频为蓝光版本的“大开眼戒”,其中一个最大的为34.8G,从图中可以看到视频格式...
  • tpm_emulator 搭建 TPM 仿真环境

    千次阅读 2019-04-16 21:33:37
    该程序是由 IBM 创建和发布的开源 TCG 软件栈。 6.1. 编译和安装 Trousers Tips: 如果直接解压 trousers 的压缩包,它的各种文件会分散在父目录里面,所以要在解压时为其指定一个解压目录。当然,如果不小心...

    1. 平台环境

    1.1. 系统平台

    宿主机系统:Windows 10 Pro
    虚拟机工具:VMware® Workstation 15 Pro
    虚拟机系统:CentOS Linux release 7.6.1810 (Core) 64位
    本文在 centos 虚拟机上搭建 TPM 仿真环境。

    1.2. TPM 仿真环境结构

    下面是TPM仿真环境软件包依赖关系图,搭建环境应该是由下至上按部就班的安装。
    在这里插入图片描述

    2. cmake

    2.1. cmake 简介

    CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。CMake 提供了比 autoconfig 更简洁的语法。在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
    (1)编写 CmakeLists.txt。
    (2)执行命令“cmake PATH”或者“ccmake PATH”生成 Makefile ( PATH 是 CMakeLists.txt 所在的目录 )。
    (3)使用 make 命令进行编译。

    2.2. 安装 cmake

    [root@linuxprobe:~]# yum -y install cmake
    

    3. m4

    3.1. m4 简介

    m4 是一种宏处理器,它扫描用户输入的文本并将其输出,期间如果遇到宏就将其展开后输出。宏有两种,一种是内建的,另一种是用户自定义的,它们能接受任意数量的参数。除了做展开宏的工作之外,m4 内建的宏能够加载文件,执行 Shell 命令,做整数运算,操纵文本,形成递归等等。m4 可用作编译器的前端,或者单纯作为宏处理器来用。

    3.2. 安装 m4

    [root@linuxprobe:~]# yum -y install m4
    

    4. GNU MP Library

    4.1. GMP 简介

    gmp是一个可以进行任意精度算术的自由库,可以操作有符号整数、有理数和浮点数。除了运行gmp的机器中可用内存所暗示的精度外,没有实际限制。gmp有一套丰富的功能,这些功能有一个常规的接口(本文不研究这个接口)。
    gmp的主要目标应用是密码学应用与研究、互联网安全应用、代数系统、计算代数研究等。
    gmp基于m4,所以在安装gmp之前要先安装m4。

    4.2. 安装 GMP

    下载地址:http://gmplib.org

    我下载的版本:gmp-6.1.2.tar.bz2

    执行下列命令进行编译和安装:

    [root@linuxprobe:~]# tar -jxvf gmp-6.1.2.tar.bz2
    [root@linuxprobe:~]# cd gmp-6.1.2
    [root@linuxprobe:~/gmp-6.1.2]# ./configure
    [root@linuxprobe:~/gmp-6.1.2]# make
    [root@linuxprobe:~/gmp-6.1.2]# make check
    [root@linuxprobe:~/gmp-6.1.2]# make install
    

    Tips:
    还有 gmp-6.1.2.tar.lz 版本的压缩包,它是使用 lzip 工具生成的,需要使用 lunzip 工具进行解压。
    lzip下载地址:http://www.nongnu.org/lzip/lzip.html
    lunzip下载地址:http://www.nongnu.org/lzip/lunzip.html

    5. TPM_Emulator

    下载地址:https://github.com/PeterHuewe/tpm-emulator/releases

    我下载的版本:tpm-emulator-0.7.5.tar.gz

    该程序主要包含三个部分:
    (1)tpmd:实现 TPM 仿真器的用户空间应用程序,可以通过 Unix 域套接字(Unix)或命名管道(Windows)进行访问。
    (2)tpmd_dev:一个内核模块,它提供设备 /dev/tpm 以实现向后兼容,并将收到的命令转发给 tpmd(仅限Unix和Mac OS X)。

    向后兼容(Backward Compatibility),又称作向下兼容(Downward Compatibility)。在计算机中指在一个程序或者类库更新到较新的版本后,用旧的版本程序创建的文档或系统仍能被正常操作或使用,或在旧版本的类库的基础上开发的程序仍能正常编译运行的情况。

    (3)tddl:TPM 仿真器的 TSS 符合设备驱动程序库。
    在这里插入图片描述

    5.1. 编译和安装 TPM_Emulator

    TPM 仿真器包的编译和安装基于 CMake 构建环境(2.6或更高版本),并要求在您的系统上正确安装 GNU MP 库(版本4.0或更高版本)。因为前面已经安装过了,所以这里直接执行下列命令进行编译和安装:

    [root@linuxprobe:~]# tar –zxvf tpm-emulator-0.7.5.tar.gz
    [root@linuxprobe:~]# cd tpm-emulator-0.7.5
    [root@linuxprobe:~/tpm-emulator-0.7.5]# mkdir build
    [root@linuxprobe:~/tpm-emulator-0.7.5]# cd build
    [root@linuxprobe:~/tpm-emulator-0.7.5/build]# cmake ../
    [root@linuxprobe:~/tpm-emulator-0.7.5/build]# make
    [root@linuxprobe:~/tpm-emulator-0.7.5/build]# make install
    

    我在执行 make 时遇到的错误:

    [root@linuxprobe:~/tpm-emulator-0.7.5/build]# make
    ...省略部分输出...
    [ 97%] Generating linux/tpmd_dev.ko
    make: *** /lib/modules/3.10.0-957.10.1.el7.x86_64/build: 没有那个文件或目录。 停止。
    make[3]: *** [all] 错误 2
    make[2]: *** [tpmd_dev/linux/tpmd_dev.ko] 错误 2
    make[1]: *** [tpmd_dev/CMakeFiles/tpmd_dev.dir/all] 错误 2
    make: *** [all] 错误 2
    

    原因:

    提示 /lib/modules/3.10.0-957.10.1.el7.x86_64/build 软链接没有指向正确的 kernel source,后来知道因为那个文件根本就不存在,我们需要下载它。

    解决方法:
    (1)看一下 build 软链接指向哪个文件:

    [root@linuxprobe:~]# cd /lib/modules/3.10.0-957.10.1.el7.x86_64/
    [root@linuxprobe:/lib/modules/3.10.0-957.10.1.el7.x86_64]# ll
    total 3244
    lrwxrwxrwx.  1 root root     43 Mar  21 15:03 build -> /usr/src/kernels/3.10.0-957.10.1.el7.x86_64
    

    在 centos 7.x 下 build -> /usr/src/kernels/3.10.0-957.10.1.el7.x86_64 不停地闪烁,说明 /usr/src/kernels/3.10.0-957.10.1.el7.x86_64 不存在。

    (2)进入 /usr/src/kernels/ 目录,看一下有没有相应的内核开发包 3.10.0-957.10.1.el7.x86_64:

    [root@linuxprobe:~]# cd /usr/src/kernels/
    [root@linuxprobe:/usr/src/kernels]# ll
    total 0
    

    没有则下载。

    (3)下载 3.10.0-957.10.1.el7.x86_64 内核开发包:

    [root@linuxprobe:/usr/src/kernels]# yum -y install kernel-devel-$(uname -r)
    [root@linuxprobe:/usr/src/kernels]# ll
    total 4
    drwxr-xr-x. 22 root root 4096 Apr 16 17:43 3.10.0-957.10.1.el7.x86_64
    

    再次执行 make 就没问题了。


    5.2. 初始化 TPM_Emulator

    TPM的启动模式(参见TPM规范第1部分)由启动模式参数定义,可以设置为clear,save(默认)或deactivated,对应的中文意思分别是清除,保存和停用。 下面简单介绍tpmd的用法以及参数的含义:

    usage: tpmd [-d] [-f] [-s storage file] [-u unix socket name]
                [-o user name] [-g group name] [-h] [startup mode]
    参数的含义:
    d:启用调试模式
    f:强制应用程序在前台运行
    s:要使用的存储文件(默认值:/var/lib/tpm/tpm_emulator-1_2_0_7)
    u:要使用的unix套接字名称(默认值:/var/run/tpm/tpmd_socket:0)
    o:应用程序运行的有效用户
    g:应用程序应运行的有效组
    h:打印此帮助信息
    startup mode:必须是“clear”,“save”(默认)或“deactivated”
    

    如果模拟器以“save”模式启动并且无法加载先前存储的TPM状态,则它将进入“fail-stop”模式并且必须重新加载。 因此,第一次启动TPM仿真器时,参数必须设置为“clear”。 想要恢复处于“fail-stop”模式的TPM仿真器,首先将其停用,然后以“clear”模式重新加载,我们执行下列命令进行初始化:

    [root@linuxprobe:~]# tpmd deactivated
    [root@linuxprobe:~]# killall tpmd
    [root@linuxprobe:~]# tpmd clear
    

    5.3. 启动 TPM_Emulator

    要想在 Unix 或 Mac OS X 上使用 TPM 仿真器,必须先启动 TPM 仿真器的守护程序(tpmd)并加载 TPM 设备转发模块(tpmd_dev)。 我们执行下列命令进行启动:

    [root@linuxprobe:~]# modprobe tpmd_dev
    [root@linuxprobe:~]# tpmd -f -d
    

    注释:
    (1)若在执行第一条命令时遇到:Module tpmd_dev not found,则执行命令:depmod -a

    (2)modprobe命令:
    modprobe命令用于智能地向内核中加载模块或者从内核中移除模块。
    modprobe可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。

    (3)depmod命令:
    depmod命令可产生模块依赖的映射文件,在构建嵌入式系统时,需要由这个命令来生成相应的文件,由modprobe使用。


    启动时遇到的错误:

    [root@linuxprobe:~]# tpmd -f -d
    ...省略部分输出...
    tpmd.c:313: Error: bind(/var/run/tpm/tpmd_socket:0) failed: Address already in use
    

    解决方法:

    [root@linuxprobe:~]# rm -f /var/run/tpm/tpmd_socket:0
    

    再次启动 tpmd 就没有问题了。


    6. TSS 协议栈

    下载地址:https://sourceforge.net/projects/trousers/files/

    我下载的版本:trousers-0.3.14.tar.gz

    该程序是由 IBM 创建和发布的开源 TCG 软件栈。

    6.1. 编译和安装 Trousers


    Tips:
    如果直接解压 trousers 的压缩包,它的各种文件会分散在父目录里面,所以要在解压时为其指定一个解压目录。当然,如果不小心直接解压了,也可以使用下列命令撤销解压操作:

    [root@linuxprobe:~]# tar -zxvf trousers-0.3.14.tar.gz #解压
    [root@linuxprobe:~]# tar -tf trousers-0.3.14.tar.gz | xargs rm -rf #撤销解压
    

    我们先为 trousers 创建一个目录,再将其进行解压:

    [root@linuxprobe:~]# mkdir trousers-0.3.14
    [root@linuxprobe:~]# tar -zxvf trousers-0.3.14.tar.gz -C trousers-0.3.14
    [root@linuxprobe:~]# cd trousers-0.3.14
    

    看一下 README 文件,并按要求安装如下的依赖包:

    automake > 1.4
    autoconf > 1.4
    pkgconfig
    libtool
    gtk2-devel
    openssl-devel >= 0.9.7
    pthreads library (glibc-devel)
    

    安装完上述的依赖包后再执行下面的命令进行编译和安装:

    [root@linuxprobe:~/trousers-0.3.14]# sh bootstrap.sh #没有则不用执行
    [root@linuxprobe:~/trousers-0.3.14]# ./configure
    [root@linuxprobe:~/trousers-0.3.14]# make
    [root@linuxprobe:~/trousers-0.3.14]# make install
    

    Tips:
    网上有说需要修改 Makefile.amMakefile.in 文件,但那些都是 trousers-0.3.8 版本的教程,那个版本会遇到 Werror、ld 链接库等报错的问题。本文使用 trousers-0.3.14 版本,没有修改 Makefile.* 文件,直接编译安装成功无报错。

    6.2. 启动 TCSD

    Tips:
    在执行下列命令之前需要先启动 TPM_Emulator,否则会提示找不到设备。

    [root@linuxprobe:~]# tcsd -e -f
    

    启动时遇到的错误:

    [root@linuxprobe:~]# tcsd -e -f
    ...省略部分输出...
    TCSD TCS ERROR: TCS GetCapability failed with result = 0x1c
    

    解决方法:
    带上 clear 参数重启 tpm-emulator:

    [root@linuxprobe:~]# tpmd -d -f clear
    

    再次启动 tcsd 就没有问题了。

    7. tpm-tools

    7.1. tpm-tools 简介

    tpm-tools 是一组管理和利用可信计算组织的 TPM 硬件的工具。 TPM 硬件可以安全地创建,存储和使用 RSA密钥(不会暴露在内存中),使用加密哈希等来验证平台的软件状态。该程序包含的工具允许平台管理员管理和诊断平台的 TPM 硬件。 此外,该程序还包含命令,以利用 openCryptoki 项目中实现的 TPM PKCS#11 接口中提供的某些功能。

    7.2. 安装 tpm-tools

    [root@linuxprobe:~]# yum -y install tpm-tools
    

    8. 测试 TPM 环境是否搭建成功

    (1)先启动 tpmd
    (2)再启动 tcsd
    (3)最后使用 tpm-tools 工具的命令加以验证:

    [root@linuxprobe:~]# tpm_version
    [root@linuxprobe:~]# tpm_getpubek
    [root@linuxprobe:~]# tpm_takeownership
    

    要运行 tpm-tools 工具的命令,必须先启动 tpmd 和 tcsd,缺一不可。

    9. 运行测试程序

    9.1. 在 tpm-emulator-0.7.5/tddl/ 目录下有测试程序

    在编译时链接 libtddl.a 静态库,编译时没有问题,运行时出现如下错误:

    [root@linuxprobe:~/tpm-emulator-0.7.5/tddl] # ll
    total 36
    -rw-rw-r--. 1 root root 1150 Sep 16  2018 CMakeLists.txt
    -rw-rw-r--. 1 root root 8129 Sep 16  2018 tddl.c
    -rw-rw-r--. 1 root root 7313 Sep 16  2018 tddl-tpm-emulator.h
    -rw-rw-r--. 1 root root 2245 Sep 16  2018 tddl_unix.h
    -rw-rw-r--. 1 root root 2202 Sep 16  2018 tddl_windows.h
    -rw-rw-r--. 1 root root 4887 Sep 16  2018 test_tddl.c
    [root@linuxprobe:~/tpm-emulator-0.7.5/tddl] # gcc -o test_tddl test_tddl.c -ltddl
    [root@linuxprobe:~/tpm-emulator-0.7.5/tddl] # ll
    total 56
    -rw-rw-r--. 1 root root  1150 Sep 16  2018 CMakeLists.txt
    -rw-rw-r--. 1 root root  8129 Sep 16  2018 tddl.c
    -rw-rw-r--. 1 root root  7313 Sep 16  2018 tddl-tpm-emulator.h
    -rw-rw-r--. 1 root root  2245 Sep 16  2018 tddl_unix.h
    -rw-rw-r--. 1 root root  2202 Sep 16  2018 tddl_windows.h
    -rwxr-xr-x. 1 root root 18424 Apr 17 20:08 test_tddl
    -rw-rw-r--. 1 root root  4887 Sep 16  2018 test_tddl.c
    [root@linuxprobe:~/tpm-emulator-0.7.5/tddl] # ./test_tddl 
    Error: Tddli_GetStatus() failed: unknown error (1006)
    
    PS:解决后再更新???

    9.2. 对TSS协议栈进行测试

    9.2.1. 测试程序
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <tss/platform.h>
    #include <tss/tss_error.h>
    #include <tss/tss_defines.h>
    #include <tss/tss_structs.h>
    #include <tss/tss_typedef.h>
    #include <tss/tss_error_basics.h>
    #include <tss/tspi.h>
    #include <trousers/tss.h>
    #include <tss/tpm.h>
    
    const char *get_error(TSS_RESULT res)
    {
        switch(ERROR_CODE(res))
        {        
            case 0x0001L:
                return "Authentication failed";
            case TSS_SUCCESS:
                return "success";
            case TSS_E_INVALID_HANDLE:
                return "hContext or phObject is an invalid handle";
            case TSS_E_BAD_PARAMETER:
                return "persistentstoragetype is not valid/One or more parameters is incorrect";
            case TSS_E_INTERNAL_ERROR:
                return "an error occurred internal to the TSS";
            case TSS_E_PS_KEY_NOTFOUND:
                return "NOT FOUND SRK";
            case TSS_E_INVALID_ATTRIB_FLAG:
                return "attribflag is incorrect";
            case TSS_E_INVALID_ATTRIB_SUBFLAG:
                return "subflag is incorrect";
            case TSS_E_INVALID_ATTRIB_DATA:
                return "ulAttrib is incorrect";
            case TSS_E_KEY_ALREADY_REGISTERED:
                return "UUID used";
            case TSS_E_KEY_NOT_LOADED:
                return "the addressed key is currently not loaded";
            default:
                return "unknown error";
        }
    }
    
    int main(int argc,char *argv)
    {
        TSS_RESULT result;
        TSS_HTPM hTPM;
        TSS_HCONTEXT hContext;
        TSS_HPOLICY hownerpolicy,hSRKPolicy;
        TSS_HKEY hSRK;
        TSS_HKEY hkey,hkey2;
        TSS_UUID SRK_UUID=TSS_UUID_SRK;
        TSS_FLAG initFlags;            //密钥标记
        TSS_UUID bindkeyUUID=TSS_UUID_USK1;    //用户的绑定密钥
    
        printf("创建上下文对象......\n");
        result=Tspi_Context_Create(&hContext);
        if(result!=TSS_SUCCESS)
        {
            printf("Context_Create ERROR:%s(%04x)\n",get_error(result),result);
        }
        result=Tspi_Context_Connect(hContext,NULL);
        if(result!=TSS_SUCCESS)
        {
            printf("Context_Connect ERROR:%s(%04x)\n",get_error(result),result);
        }
    
        printf("创建TPM对象......\n");
        result=Tspi_Context_GetTpmObject(hContext,&hTPM);
        if(result!=TSS_SUCCESS)
        {
            printf("Tspi_Context_GetTpmObject ERROR:%s(%04x)\n",get_error(result),result);
        }
        result=Tspi_GetPolicyObject(hTPM,TSS_POLICY_USAGE,&hownerpolicy);
        if(result!=TSS_SUCCESS)
        {
            printf("Tspi_GetPolicyObject ERROR:%s(%04x)\n",get_error(result),result);
        }
        result=Tspi_Policy_SetSecret(hownerpolicy,TSS_SECRET_MODE_POPUP,0,NULL);
        if(result!=TSS_SUCCESS)
        {
            printf("Tspi_Policy_SetSecret ERROR:%s(%04x)\n",get_error(result),result);
        }
        printf("载入SRK密钥......\n");
        result=Tspi_Context_LoadKeyByUUID(hContext,TSS_PS_TYPE_SYSTEM,SRK_UUID,&hSRK);
        if(result!=TSS_SUCCESS)
        {
            printf("Tspi_Context_LoadKeyByUUID ERROR:%s(%04x)\n",get_error(result),result);
        }
        printf("获取SRK的策略对象......");
        result=Tspi_GetPolicyObject(hSRK,TSS_POLICY_USAGE,&hSRKPolicy);
        if(result!=TSS_SUCCESS)
        {
            printf("Tspi_GetPolicyObject ERROR:%s(%04x)\n",get_error(result),result);
        }
        printf("设置SRK的策略授权......");
        result=Tspi_Policy_SetSecret(hSRKPolicy,TSS_SECRET_MODE_POPUP,0,NULL);
        if(result!=TSS_SUCCESS)
        {
            printf("Tspi_Policy_SetSecret ERROR:%s(%04x)\n",get_error(result),result);
        }
        printf("创建绑定密钥......\n");
        initFlags=TSS_KEY_TYPE_BIND|TSS_KEY_SIZE_512|TSS_KEY_NO_AUTHORIZATION;                //设置密钥标记
        result=Tspi_Context_CreateObject(hContext,TSS_OBJECT_TYPE_RSAKEY,initFlags,&hkey);        //创建绑定密钥
        if(result!=TSS_SUCCESS)
        {
            printf("Tspi_Context_CreateObject ERROR:%s(%04x)\n",get_error(result),result);
        }
    
        printf("在TPM产生密钥前,设置填充类型......\n");
        result=Tspi_SetAttribUint32(hkey,TSS_TSPATTRIB_KEY_INFO,TSS_TSPATTRIB_KEYINFO_ENCSCHEME,TSS_ES_RSAESPKCSV15);
        if(result!=TSS_SUCCESS)
        {
            printf("Tspi_SetAttribUint32 ERROR:%s(%04x)\n",get_error(result),result);
        }
        printf("产生密钥,该密钥不合PCR绑定\n");
        result=Tspi_Key_CreateKey(hkey,hSRK,0);
        if(result!=TSS_SUCCESS)
        {
            printf("Tspi_Key_CreateKey ERROR:%s(%04x)\n",get_error(result),result);
        }                
    
        printf("装载绑定密钥到UUID......\n");
        result=Tspi_Context_RegisterKey(hContext,hkey,TSS_PS_TYPE_USER,bindkeyUUID,TSS_PS_TYPE_SYSTEM,SRK_UUID);
        if(result!=TSS_SUCCESS)
        {
            if(ERROR_CODE(result)==TSS_E_KEY_ALREADY_REGISTERED)
            {
                printf("UUID已被使用,注销此密钥......\n");
                result=Tspi_Context_UnregisterKey(hContext,TSS_PS_TYPE_USER,bindkeyUUID,&hkey);
                if(result!=TSS_SUCCESS)
                    printf("UUID注销失败 Tspi_Context_UnregisterKey ERROR :%s(%04x)\n",get_error(result),result);
    
                result=Tspi_Context_RegisterKey(hContext,hkey,TSS_PS_TYPE_USER,bindkeyUUID,TSS_PS_TYPE_SYSTEM,SRK_UUID);
                if(result!=TSS_SUCCESS)
                    printf("Tspi_Context_RegisterKey ERROR:%s(%04x)\n",get_error(result),result);
            }
        }
        printf("SUCCESS!\n");
        Tspi_Context_Close(hContext);
        return 0;
    }
    
    9.2.2. 该程序实现的操作

    创建上下文对象…
    创建TPM对象…
    载入SRK密钥…
    获取SRK的策略对象…
    设置SRK的策略授权…
    创建绑定密钥…
    装载绑定密钥到UUID…

    9.2.3. 编译和执行

    Tips:
    要先启动 tpmd 和 tcsd 进程,再运行测试程序的可执行文件。

    [root@linuxprobe:~/test-tpm-tss] # gcc -o generate_key generate_key.c -ltspi
    [root@linuxprobe:~/test-tpm-tss] # ll
    total 24
    -rwxr-xr-x. 1 root root 13288 Apr 17 10:57 generate_key
    -rw-r--r--. 1 root root  5267 Apr 17 10:56 generate_key.c
    [root@linuxprobe:~/test-tpm-tss] # ./generate_key 
    创建上下文对象......
    创建TPM对象......
    载入SRK密钥......
    获取SRK的策略对象......设置SRK的策略授权......创建绑定密钥......
    在TPM产生密钥前,设置填充类型......
    产生密钥,该密钥不合PCR绑定
    TSS Authentication Dialog
    Enter PIN:
    Tspi_Key_CreateKey ERROR:persistentstoragetype is not valid/One or more parameters is incorrect(0003)
    装载绑定密钥到UUID......
    UUID已被使用,注销此密钥......
    SUCCESS!
    

    遇到如下的错误:
    Tspi_Key_CreateKey ERROR:persistentstoragetype is not valid/One or more parameters is incorrect(0003)

    PS:解决后再更新???
    展开全文
  • 您可以安装32位客户端软件,但是不能安装32位数据库软件。 详见 note 1173433.1  How to Install Oracle 10.2.0.5 on MS Windows 7 / Windows 2008R2 * 一个已知的问题 Bug 8277395 : WINDOWS 2008 X64 10.2.0.4 ...

    Microsoft Windows 环境中NLS_LANG的正确设置 (文档 ID 1577370.1)

    适用于:

    Oracle Database - Enterprise Edition - 版本 8.0.3.0 和更高版本
    Oracle Database - Personal Edition - 版本 8.0.3.0 和更高版本
    Oracle Database - Standard Edition - 版本 8.0.3.0 和更高版本
    Oracle Database Cloud Schema Service - 版本 N/A 和更高版本
    Oracle Database Exadata Express Cloud Service - 版本 N/A 和更高版本
    Microsoft Windows x64 (64-bit)
    Microsoft Windows (32-bit)
    Microsoft Windows Itanium (64-bit)

    用途

     综述在Microsoft Windows平台如何正确的定义NLS_LANG变量。

    适用范围

    DBA在任意Microsoft Windows desktop/server平台上配置Oracle RDBMS客户端。(不包括 Microsoft Windows Mobile/CE/tablet)。

    详细信息

    要调试显示问题 (当您看到奇怪的符号或字符,如 "?" , "¿" 或 "ÃÂÃÂÂ") 请首先使用 Oracle SQL Developer 进行调试。
    Oracle SQL Developer 是一款无需在客户端进行 Oracle NLS 配置的“已知的可用客户端”。

    检查配置 Oracle SQL Developer 的文档及截屏请参见note 1628060.1 How to diagnose losing characters , getting "funny" output when inserting or selecting other than A-Z,a-z data ( = non English data like Chinese, Russian, Hebrew , insert any language here to the list that is not English) CHAR, VARCHAR2, LONG or CLOB

    1. 主要概念/术语:

    此文档涵盖了NLS_LANG的字符集部分, 也提供了Note:158577.1 NLS_LANG Explained (How does Client-Server Character Conversion Work?)之外更多的与 Microsoft Windows平台相关信息

    NLS_LANG的组成: NLS_LANG=<NLS_LANGUAGE>_<NLS_TERRITORY>.<客户端字符集>
    例如: AMERICAN_AMERICA.WE8MSWIN1252

    其中:
    NLS_LANGUAGE 指定:
    - Oracle(错误)信息的语言
    - 日和月份的名称

    注意:NLS_LANGUAGE与插入和查询的*数据*的语言无关。

    NLS_TERRITORY 指定:
    - 货币和数字格式
    - 计算星期和天数的范围和惯例
     

    注意:NLS_TERRITORY与插入和查询的*数据*的语言无关。

    客户端字符集(CLIENT CHARACTERSET):

    - 定义Oracle客户端,客户应用使用的编码
    * 或者它要符合您Microsoft Windows代码页 (GUI工具的ACP, 命令提示符的CHCP 值)
    * 或者为Unicode WIN32应用设置为UTF8/AL32UTF8

    四个重要附注:

    * 设置NLS_LANG为数据库(NLS_CHARACTERSET)的字符集,可能正确但不是总是正确的。请不要断定NLS_LANG需要与数据库字符集一致,这是不正确的
    * NLS_LANG定义的字符集不更改您客户端的字符集,NLS_LANG只是让Oracle知道您客户端使用的字符集,所以Oracle可以在NLS_CHARACTERSET和客户端编码间转化。
    您不能只是设置NLS_LANG为您期望的字符集。如您想在Cyrillic windows上显示希伯来文(例如),Windows系统首先要更改为支持1255 编码(参见第三点),之后,在Windows上配置NLS_LANG。
    只是设定nls_lang为Hebrew不能满足您检索和存储希伯来文的需求。
    * 另一个谣言是如果您不设置客户端的NLS_LANG,它会使用服务器端NLS_LANG的值。这也是不正确的!NLS_LANG的字符集参数不会从服务器端继承。
    * 注意字符在数据库保存(insert)或查询(select)与NLS_LANGUAGE 和 NLS_TERRITORY无关。如NLS_LANG 设置为JAPANESE_JAPAN.WE8MSWIN1252不能够存储日文,因为WE8MSWIN1252不包含日文字符

    但是如果NLS_LANG设置为AMERICAN_AMERICA.JA16SJIS, 那么你可以存储日文(如果数据库也使用了可以存储日文的NLS_CHARACTERSET,比如UTF8或者JA16SJIS,并且客户端确实是一个日文的Windows系统).
    对于NLS_LANG中NLS_Language 和 NLS_Territory部分,请参见 Note 241047.1 The Priority of NLS Parameters Explained(NLS参数优先级的解释)。

    1.1 Microsoft Windows系统的代码页:

    Microsoft Windows操作系统中,非unicode应用程序的编码模式(字符集)由代码页指定。代码页支持特定的语言或语言组,共享常见的书写系统。
    从Oracle的角度代码页和字符集是等价的。

    注意非中文-日文-韩文环境中,Microsoft Windows GUI和命令提示符不使用相同的代码页 (!)

    Microsoft Windows对ANSI (像sqlplusw.exe这样的非unicode GUI程序) 和 OEM (命令提示符 - sqlplus.exe)环境使用2种不同的字符集。

    举例说明这个问题:

    打开写字板, 输入一些 “特殊字符” 如“é?èà”, 另存文件为 c:\test.txt
    (确认当另存文件时,编码设置为ANSI)
    打开命令提示符
    开始 – 运行 - cmd - ok
    然后输入

    C:\Documents and Settings\user>edit c:\test.txt

    您将看到其他的字符而不是写字板中输入的

    这里您看到的是“ANSI”编码(写字板)在OEM (命令提示符)环境中显示。这清晰的展示了windows在ANSI和命令提示符环境中使用不同的字符集。 
    Microsoft Windows命令提示符使用MS-DOS (OEM)传统代码页不是“gui” 交互使用的ANSI代码页。
    更多关于这方面的问题,请咨询Microsoft。

    请一定要区分GUI sqlplusW.exe 和 "命令提示符" sqlplus.exe

    1.2 字体:

    字体是字形(从“象形文字”)的集合,有着共同的外观(字型,字符大小)。操作系统使用字体把数字值转换成屏幕上的图形结构。
    一个字体不一定包含您所使用代码页中定义的所有数值的图形表示。这就是为什么当您更改字体,如果新的字体没有对应的符号表示,您有时会看到屏幕上的黑色方块。
    Microsoft Windows “Character Set Map”实用程序可以被用作查看字体包含何种字形。
    在Microsoft Windows 2000中:

    开始 -> 所有程序 -> 附件 -> 系统工具 -> Character Map
    或者
    开始 -> 运行...
    输入 "charmap", 然后点击 "ok"

    字体可以实现一个特定的代码页或者代码页集合。例如,Arial字体可以实现代码页 1252, 1250, 1251, 1253, 1254, 1257。
    有关字体更深入的信息,请参加本文档第8点。

    2. 如何设置我的 NLS_LANG:

    为指定您客户端Oracle软件的locale信息,您必须设置NLS_LANG参数。它设置了客户端的语言,地域和字符集信息。
    简单的说,它使用下面的格式:
    NLS_LANG=NLS_Language_NLS_Territory.客户端字符集
    例如:AMERICAN_AMERICA.WE8MSWIN1252

    2.1 注册表中:

    默认情况下,windows上的Oracle安装使用注册表来定义这个设置。
    通用安装程序设置的默认值取决于安装时Microsoft Windows操作系统的ACP值。

    您的每个Oracle Home中会有一个NLS_LANG注册表subkey,您能简单的通过Windows注册表编辑器来修改subkey的值:
    开始 -> 运行...
    输入 “regedit”, 点击 “ok”
    编辑下面的注册表条目:

    版本 7:

    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE

    版本 8 , 8i and 9i:

    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx\

    “x”为定义Oracle home的唯一值。HOME0是首次安装

    版本 10g 及以上:

    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<oracle_home_name>

    这里您会看到一个条目名为NLS_LANG

    在64位windows平台上安装32位软件,会使用32位兼容性路径

    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_<oracle_home_name>

    注意:
    * 32位软件安装在Microsoft Windows64位操作系统上将没有以下路径

    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<oracle_home_name>

    Microsoft Windows会重定向到“32位兼容性路径”
    * Oracle不支持将32位数据库软件安装在Microsoft Windows 64位操作系统上。您可以安装32位客户端软件,但是不能安装32位数据库软件。 详见note 1173433.1 How to Install Oracle 10.2.0.5 on MS Windows 7 / Windows 2008R2
    * 一个已知的问题Bug 8277395: WINDOWS 2008 X64 10.2.0.4 INSTALLATION DOESN'T SET NLS_LANG REGISTRY , windows x64 bit在安装时没有设置NLS_LANG

    当启动Oracle工具,如sqlplusw.exe (或 sqplus.exe), 它将读取相同路径下oracle.key文件的内容,来决定哪个注册表树将被使用,进而哪个NLS_LANG subkey将被使用。

    注意:有时候人们会发现即使没有安装版本7, HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE的NLS_LANG也会被设为“NA”。这是因为向后兼容性的需要,您可以忽略或者移除它。对于8.0, 8i 和 9i您需要在HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx\下设置NLS_LANG

    2.2 系统属性中作为系统或者用户变量:

    尽管注册表是Microsoft Windows设置的主要存储位置,它不是唯一可以设置参数的地方。
    虽然不推荐,但您可以设置NLS_LANG为系统属性中的系统或者用户变量。这个设置会被所有Oracle home使用。
    查看和更改:

    右击 '我的电脑' 图标 -> '属性'
    选择 '高级' 项 -> 点击 '环境变量'

     “用户变量”列表包含目前登陆用户的设置,“系统变量”是操作系统级别所有用户的变量。

    因为这些环境变量比注册表中已经设置的参数级别高,所以除非您有非常好的理由否则不要在这个位置设置Oracle参数。
    请注意"ORACLE_HOME"参数在Unix中被设置为环境变量,但是如果有多个Oracle安装,在Windows下不应该设置其为环境变量。

    2.3 在命令提示符中设置为环境变量:

    如果您在命令行中设置NLS_LANG为环境变量,它将覆盖注册表和系统属性中的NLS_LANG的定义。
    在命令提示符中,使用“set”命令,例如:

    C:\> set NLS_LANG=American_America.WE8PC850

    3. 基于Microsoft Windows 代码页为非unicode程序正确设置NLS_LANG:

    NLS_LANG反映了Microsoft Windows对非unicode应用程序的"locale"设置,如果Windows的"locale"设置不是您需要的,那么您需要修改。
    ACP(Ansi代码页)和缺省 OEM(命令提示符代码页)是由Windows“缺省 locale”定义的,如果您有一个UK Microsoft Windows 2000 客户端,需要输入Cyrillic (俄语),您需要更改ACP (更改“default locale”)从而能够输入俄语。
    请参见 Document 199926.1 How to change the ANSI Code Page (ACP) on Microsoft Windows.

    不是所有的语言都有ANSI编码,Windows的sqlplus只支持ANSI 和 OEM字符集。

    下面的链接提供了Microsoft Windows Xp及以后版本每种言语的缺省代码页列表: http://msdn.microsoft.com/en-gb/goglobal/bb896001.aspx

    OEM = 命令提示符codepage, ANSI = gui代码页

    列表中ANSI代码页为0意味着Microsoft windows只在Unicode层支持这种语言,没有ANSI 代码页

    列表中OEM 代码页为1意味着Microsoft windows只在Unicode层支持这种语言,没有OEM 代码页

    如果您想要在windows客户端中查看/插入有0 或 1值的语言,您需要使用Unicode客户端。Sqlplusw.exe 或者 sqlplus.exe 不是Unicode客户端(但是它们能连接到Unicode数据库),不能对这种语言使用。.

    您能在Microsoft Windows NT, 2000 和 XP可以使用UTF8/AL32UTF8作为Oracle客户端字符集(NLS_LANG),但是限制是只能在客户端程序支持这种配置的时候使用。

    依赖于ANSI Win32 API的程序,如SQL*Plus (sqlplusW.exe),旧版本的Oracle Forms等等。不能设置NLS_LANG 为 UTF8 / AL32UTF8。

    http://msdn.microsoft.com/en-gb/goglobal/bb964653.aspx 提供了Microsoft Windows ANSI 和 OEM代码页的定义。
     

    对于如sqlloader等工具,您需要设置NLS_LANG为您需要加载文件的字符集。

    Document 227330.1 Character Sets & Conversion - Frequently Asked Questions
    18. What is the best way to load non-US7ASCII characters using SQL*Loader?

    对于导入/导出请参见: Document 227332.1 NLS considerations in Import/Export

    对于 Honk Kong HKSCS 请参见 Document 787371.1 Oracle Database Server support for HKCSC 1999, 2001 and 2004 character sets.

    3.1 判断您的 Windows ACP 代码页 (使用 sqlplusW.exe):

    您能在注册表中看到它的值:
    开始 -> 运行...
    输入 “regedit”, 点击 “ok”
    查看下面的注册表条目:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\

    您能看到一个条目名为ACP。这个ACP值为您目前的GUI 代码页,查看下面列表3.2可以对应到oracle名字。
    由于有很多注册表条目名称与其类似,请确认查看的是正确的路径。

    如果您需要修改“ACP”请参见: Document 199926.1 How to change the ANSI Code Page (ACP) on Windows NT 4.0 and Windows 2000 / XP
    不要简单的只在注册表中修改它,这将出现问题并导致错误的结果。

    3.2 找出对应的Oracle客户端字符集:

    依照3.1中的ACP在下面的表中找到Oracle客户端字符集。
    注意对于一个ACP只有一个正确的值
    请参考note 282336.1 Charts of most current mono-byte Character sets来查看一些字符集中具体存储了哪些字符


    ANSI并不支持所有的脚本/语言。Microsoft Windows中ANSI不支持下面的语言:
    Armenian, Divehi, Georgian, Gujarati, Hindi, Kannada, Oriya, Konkani, Marathi, Punjabi, Sanskrit, Syriac, Tamil and Telugu. (此部分只为示例, 请参见本文档 3.1)

    ANSI代码页(ACP) - Oracle 客户端字符集 (NLS_LANG的第三部分)

    1250 - EE8MSWIN1250
    1251 - CL8MSWIN1251
    1252 - WE8MSWIN1252
    1253 - EL8MSWIN1253
    1254 - TR8MSWIN1254
    1255 - IW8MSWIN1255
    1256 - AR8MSWIN1256
    1257 - BLT8MSWIN1257
    1258 - VN8MSWIN1258
    874  - TH8TISASCII
    932  - JA16SJIS
    936  - ZHS16GBK
    949  - KO16MSWIN949
    950  - ZHT16MSWIN950 - except for Hong kong.
    950  - (Hong Kong) ZHT16HKSCS31 / ZHT16HKSCS .
           只在Microsoft Windows 2000 和 XP上有, Vista 和 7没有,
           参见 Document 787371.1 Oracle Database Server support for HKCSC 1999, 2001 and 2004 character sets.

    这是windows开始菜单中GUI sqlplus (sqlplusW.exe/ plus80W.exe / plus33W.exe )使用的字符集。
    请一定要区别GUI sqlplusW.exe 和命令提示符sqlplus.exe(参见本文档第4点)

    3.3 在注册表中设置:

    使用Windows注册表编辑器在Oracle Home中设置您刚找到的NLS_LANG的值。2.1部分详细的介绍了如何使用注册表编辑器。

    4. 命令提示符OEM 代码页的正确NLS_LANG(sqlplus.exe使用) :

    4.1 Microsoft Windows缺省配置

    命令提示符模式(除了一些例外如中日韩语言),是一个不同的代码页 (叫做 OEM 代码页)而不是Microsoft Windows GUI (ANSI 代码页)。

    大多数命令提示符OEM 代码页不支持Euro symbol (€),请参见:Document 68790.1 RDBMS Support for the Euro Currency Symbol请参考note 282336.1 Charts of most current mono-byte Character sets来查看一些字符集中具体存储了哪些字符

    在命令提示符使用命令行工具如SQL*Plus (sqlplus.exe/ plus80.exe / plus33.exe ) svrmgrl之前,您需要手动设置NLS_LANG参数为环境变量。

    对于日文,韩文,简体中文,和繁体中文,命令提示符OEM 代码页 (CJK)被定义为ANSI 代码页,意味着您不需要在命令提示符中设置NLS_LANG参数。

    OEM并不支持所有的脚本/语言。Microsoft Windows中OEM不支持下列语言:
    Armenian, Divehi, Georgian, Gujarati, Hindi, Kannada, Oriya, Konkani, Marathi, Punjabi, Sanskrit, Syriac, Tamil and Telugu. (此部分只为示例, 请参见本文档 3.1)

    在其他的情况下,您需要设置NLS_LANG来覆盖注册表中已经匹配ANSI 代码页的NLS_LANG。命令提示符专有NLS_LANG需要匹配命令提示符中输入chcp后显示的命令提示符OEM 代码页

    C:\> chcp
    Active code page: 437
    C:\> set NLS_LANG=American_America.US8PC437
    C:\> sqlplus.exe /nolog

    如果命令提示符模式的NLS_LANG没有被正确的设置,错误信息和数据将因为不正确的字符集转换而损坏。

    使用下面的列表找到在您的locale 系统中满足命令提示符代码页 的Oracle字符集:
     

    命令提示符 代码页 - Oracle 客户端字符集 (NLS_LANG的第三部分)
    437 - US8PC437
    720 - AR8DOS720
    737 - EL8PC737
    850 - WE8PC850
    852 - EE8PC852
    857 - TR8PC857
    858 - WE8PC858
    861 - IS8PC861
    862 - IW8PC1507
    865 - N8PC865
    866 - RU8PC866
    -- 和ANSI相同 :
    1258 - VN8MSWIN1258
    874  - TH8TISASCII
    932  - JA16SJIS
    936  - ZHS16GBK
    949  - KO16MSWIN949
    950  - ZHT16MSWIN950 - except for Hong kong.
    950  - (Hong Kong) ZHT16HKSCS31 / ZHT16HKSCS .
           只在Microsoft Windows 2000 和 XP上有, Vista 和 7没有,
           参见 Document 787371.1 Oracle Database Server support for HKCSC 1999, 2001 and 2004 character sets.

    对于如sqlloader等工具,您需要设置NLS_LANG为您需要加载文件的字符集。
    Document 227330.1 Character Sets & Conversion - Frequently Asked Questions
    18. What is the best way to load non-US7ASCII characters using SQL*Loader?

    对于导入/导出请参见: Document 227332.1 NLS considerations in Import/Export

    4.2 更改Microsoft windows命令提示符环境使用ANSI 字符集 如 1252

    可以配置命令提示符使用ANSI编码。要在console窗口中使用ANSI字符集,您需要使用“Lucida Console”因为“raster fonts”只识别OEM代码页
    右击标题栏,选择属性,找到字体项,选择Lucida Console。点击“ok”之后选择“Save properties for future windows with same title”。
    之后我们可以执行,例如“chcp 1252”来切换到WE8MSWIN1252字符集。
     

    注意:
    * “Unicode” “chcp 65001” 和 “chcp 65000”不支持sqlplus.exe。
    * “chcp”不是永久生效的,所以需要每次修改或者设定快捷方式。如果您打开一个新的命令提示符窗口,默认情况下,它会使用这个Windows系统缺省OEM代码页定义。
       一种可能的解决办法是在注册表的命令处理器中添加所需的chcp为自动运行

    REGEDIT4
    ;
    ; 当打开命令提示符,自动运行chcp
    ;
    ; 针对当前用户:
    [HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
    "Autorun"="chcp 1252"
    ; 针对所有用户:
    ;[HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor]
    ;"Autorun"="chcp 1252"

     有关如何更改缺省的chcp的更多信息,请咨询Microsoft。

    5. 如何检查NLS_LANG的值

    检查NLS_LANG,您需要打开命令提示符,在命令行中运行sqlplus.exe。

    首先参见在环境中是否设置:

    SQL> host echo %NLS_LANG%

    如果返回的是%NLS_LANG%,这个变量在环境中没有被设置。如果返回如ENGLISH_UNITED KINGDOM.WE8PC850说明已被设置。

    如果NLS_LANG在环境中没有被设置,您应该参见注册表中的值:

    SQL> @.[%NLS_LANG%].

    如果您得到:

    unable to open file ".[ENGLISH_UNITED KINGDOM.WE8MSWIN1252]."

    在‘[]'中的“文件名”是注册表参数的值。(这不是一个错误只是得到NLS_LANG值的“窍门”)

    如果您得到:

    unable to open file ".[%NLS_LANG%]."

    说明NLS_LANG参数在注册表中也没有被设置。

    注意:@.[%NLS_LANG%]。通过“窍门” 在sqlplus可执行文件中获得NLS_LANG,它不会读注册表本身。但您仍然不知道它是在环境中还是注册表中被设置。这是我们先使用host命令参见的原因。

    6. Microsoft Windows注册表中常用NLS_LANG的列表:

    注意:这是GUI sqlplus版本的正确设置,(sqlplusW.exe/ plus80W.exe / plus33W.exe )

    ANSI并不支持所有的脚本/语言。
    Microsoft Windows中ANSI不支持下面的语言:
    Armenian, Divehi, Georgian, Gujarati, Hindi, Kannada, Oriya, Konkani, Marathi, Punjabi, Sanskrit, Syriac, Tamil and Telugu. (此部分只为示例, 请参见本文档 3.1)

    操作系统Locale              ANSI gui的NLS_LANG值

    Arabic (U.A.E.)            ARABIC_UNITED ARAB EMIRATES.AR8MSWIN1256
    Bulgarian                  BULGARIAN_BULGARIA.CL8MSWIN1251
    Catalan                    CATALAN_CATALONIA.WE8MSWIN1252
    Chinese (PRC)              SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    Chinese (Taiwan)           TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950
    Chinese (Hong Kong HKCS)   TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS
    Chinese (Hong Kong HKCS31) TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS31 (new in 10gR2)
             HKSCS 只在Microsoft Windows 2000 和 XP上有, Vista 和 7没有,
             参见 Document 787371.1 Oracle Database Server support for HKCSC 1999, 2001 and 2004 character sets.
    Croatian                   CROATIAN_CROATIA.EE8MSWIN1250
    Czech                      CZECH_CZECH REPUBLIC.EE8MSWIN1250
    Danish                     DANISH_DENMARK.WE8MSWIN1252
    Dutch (Belgium)            DUTCH_BELGIUM.WE8MSWIN1252
    Dutch (Netherlands)        DUTCH_THE NETHERLANDS.WE8MSWIN1252
    English (United Kingdom)   ENGLISH_UNITED KINGDOM.WE8MSWIN1252
    English (United States)    AMERICAN_AMERICA.WE8MSWIN1252
    Estonian                   ESTONIAN_ESTONIA.BLT8MSWIN1257
    Finnish                    FINNISH_FINLAND.WE8MSWIN1252
    French (Canada)            CANADIAN FRENCH_CANADA.WE8MSWIN1252
    French (France)            FRENCH_FRANCE.WE8MSWIN1252
    German (Germany)           GERMAN_GERMANY.WE8MSWIN1252
    Greek                      GREEK_GREECE.EL8MSWIN1253
    Hebrew                     HEBREW_ISRAEL.IW8MSWIN1255
    Hungarian                  HUNGARIAN_HUNGARY.EE8MSWIN1250
    Icelandic                  ICELANDIC_ICELAND.WE8MSWIN1252
    Indonesian                 INDONESIAN_INDONESIA.WE8MSWIN1252
    Italian                    ITALIAN_ITALY.WE8MSWIN1252
    Japanese                   JAPANESE_JAPAN.JA16SJIS
    Korean                     KOREAN_KOREA.KO16MSWIN949
    Latvian                    LATVIAN_LATVIA.BLT8MSWIN1257
    Lithuanian                 LITHUANIAN_LITHUANIA.BLT8MSWIN1257
    Norwegian                  NORWEGIAN_NORWAY.WE8MSWIN1252
    Polish                     POLISH_POLAND.EE8MSWIN1250
    Portuguese (Brazil)        BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252
    Portuguese (Portugal)      PORTUGUESE_PORTUGAL.WE8MSWIN1252
    Romanian                   ROMANIAN_ROMANIA.EE8MSWIN1250
    Russian                    RUSSIAN_CIS.CL8MSWIN1251
    Slovak                     SLOVAK_SLOVAKIA.EE8MSWIN1250
    Spanish (Mexico)           MEXICAN SPANISH_MEXICO.WE8MSWIN1252
    Spanish (Spain)            SPANISH_SPAIN.WE8MSWIN1252
    Spanish (Venezuela)        LATIN AMERICAN SPANISH_VENEZUELA.WE8MSWIN1252
    Swedish                    SWEDISH_SWEDEN.WE8MSWIN1252
    Thai                       THAI_THAILAND.TH8TISASCII
    Turkish                    TURKISH_TURKEY.TR8MSWIN1254
    Ukrainian                  UKRAINIAN_UKRAINE.CL8MSWIN1251
    Vietnamese                 VIETNAMESE_VIETNAM.VN8MSWIN1258


    *需要注意的是NLS_LANGUAGE和NLS_TERRITORY和数据库是否能存储(插入)或检索(选择)某种语言的字符无关。
    在设置为1252(US/West Eruopean Windows客户端)上设置NLS_LANG为 JAPANESE_JAPAN.WE8MSWIN1252将不允许您存储日文,因为WE8MSWIN1252不支持日文字符。
    日文的Windows客户端使用AMERICAN_AMERICA.JA16SJIS将允许你存储或检索日文(如果NLS_CHARACTERSET也支持日文)

    7. Microsoft Windows命令提示符中常用NLS_LANG的列表:

    注意:这是命令提示符sqlplus 版本的正确设置 (sqlplus.exe/ plus80.exe / plus33.exe )

    OEM并不支持所有的脚本/语言。
    Microsoft Windows中OEM不支持下面的语言:
    Armenian, Divehi, Georgian, Gujarati, Hindi, Kannada, Oriya, Konkani, Marathi, Punjabi, Sanskrit, Syriac, Tamil and Telugu. (此部分只为示例, 请参见本文档 3.1)
    大多数命令提示符EM 代码页不支持Euro symbol (€)

    操作系统Locale              命令提示符的NLS_LANG值

    Arabic (U.A.E.)            ARABIC_UNITED ARAB EMIRATES.AR8DOS720
    Bulgarian                  BULGARIAN_BULGARIA.RU8PC866
    Catalan                    CATALAN_CATALONIA.WE8PC850
    Chinese (PRC)              SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    Chinese (Taiwan)           TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950
    Chinese (Hong Kong HKCS)   TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS
    Chinese (Hong Kong HKCS31) TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS31 (new in 10gR2)
             HKSCS 只在Microsoft Windows 2000 和 XP上有, Vista 和 7没有,
             参见 Document 787371.1 Oracle Database Server support for HKCSC 1999, 2001 and 2004 character sets.
    Croatian                   CROATIAN_CROATIA.EE8PC852
    Czech                      CZECH_CZECH REPUBLIC.EE8PC852
    Danish                     DANISH_DENMARK.WE8PC850
    Dutch (Belgium)            DUTCH_BELGIUM.WE8PC850
    Dutch (Netherlands)        DUTCH_THE NETHERLANDS.WE8PC850
    English (United Kingdom)   ENGLISH_UNITED KINGDOM.WE8PC850
    English (United States)    AMERICAN_AMERICA.US8PC437
    Estonian                   ESTONIAN_ESTONIA.BLT8PC775
    Finnish                    FINNISH_FINLAND.WE8PC850
    French (Canada)            CANADIAN FRENCH_CANADA.WE8PC850
    French (France)            FRENCH_FRANCE.WE8PC850
    German (Germany)           GERMAN_GERMANY.WE8PC850
    Greek                      GREEK_GREECE.EL8PC737
    Hebrew                     HEBREW_ISRAEL.IW8PC1507
    Hungarian                  HUNGARIAN_HUNGARY.EE8PC852
    Icelandic                  ICELANDIC_ICELAND.WE8PC850
    Indonesian                 INDONESIAN_INDONESIA.WE8PC850
    Italian                    ITALIAN_ITALY.WE8PC850
    Japanese                   JAPANESE_JAPAN.JA16SJIS
    Korean                     KOREAN_KOREA.KO16MSWIN949
    Latvian                    LATVIAN_LATVIA.BLT8PC775
    Lithuanian                 LITHUANIAN_LITHUANIA.BLT8PC775
    Norwegian                  NORWEGIAN_NORWAY.WE8PC850
    Polish                     POLISH_POLAND.EE8PC852
    Portuguese (Brazil)        BRAZILIAN PORTUGUESE_BRAZIL.WE8PC850
    Portuguese (Portugal)      PORTUGUESE_PORTUGAL.WE8PC850
    Romanian                   ROMANIAN_ROMANIA.EE8PC852
    Russian                    RUSSIAN_CIS.RU8PC866
    Slovak                     SLOVAK_SLOVAKIA.EE8PC852
    Spanish (Mexico)           MEXICAN SPANISH_MEXICO.WE8PC850
    Spanish (Spain)            SPANISH_SPAIN.WE8PC850
    Spanish (Venezuela)        LATIN AMERICAN SPANISH_VENEZUELA.WE8PC850
    Swedish                    SWEDISH_SWEDEN.WE8PC850
    Thai                       THAI_THAILAND.TH8TISASCII
    Turkish                    TURKISH_TURKEY.TR8PC857
    Ukrainian                  UKRAINIAN_UKRAINE.RU8PC866
    Vietnamese                 VIETNAMESE_VIETNAM.VN8MSWIN1258

    8. Windows上为Unicode应用程序设置正确的NLS_LANG:

    支持Unicode程序的例子
    * NT 4.0上Oracle Forms 版本5及以上版本. Document 105809.1 Character Set Support for Developer Tools

    * iSqlplus.
    Document 231231.1 Quick setup of iSQL*Plus 9.2 as Unicode (UTF8) client on windows.
    Document 281847.1 How do I configure or test iSQL*Plus 10i?

    Windows使用UTF16(Little Endian)作为Unicode的编码,但是NLS_LANG需要被设置为UTF8或者AL32UTF8,而不是UTF16。
    Oracle客户端类库会做相应的转换(字节移位操作,非常快)将Windows UTF16转换成Oracle的AL32UTF8,或者数据库的NLS_CHARACTERSET。
    只有当某些使用了Oracle预编译器的时候UTF16才会被使用。如果您有进一步关于编写Windows Unicode程序的问题,请联系微软。MSDN上有一篇介绍http://msdn.microsoft.com/en-us/library/dd374081(VS.85).aspx

    Windows上有些连接方式同NLS_LANG的设置无关,比如:

    • Oracle ODBC / OLE 驱动不使用NLS_LANG来做Unicode调用的转换。参见文档:"OCI Unicode binding and defining features are used by the ODBC and OLE DB drivers to handle Unicode data. OCI Unicode data binding and defining features are independent from NLS_LANG. This means Unicode data is handled properly, irrespective of the NLS_LANG setting on the platform."
    • Oracle Thin JDBC 驱动也不使用NLS_LANG,一个使用thin JDBC的例子就是Oracle SQL Developer,这里可以下载http://www.oracle.com/technetwork/developer-tools/sql-developer
    • Oracle 10g及以上版本的Thick JDBC 驱动同样默认不使用NLS_LANG,而使用JVM locale中的Language, Territory及characterset。参见文档note 115001.1 NLS_LANG Client Settings and JDBC Drivers

    9. Windows如何使用字体来显示不同的字符集:

    假设您有一个AL32UTF8数据库并正确的存储AL32UTF8代码点。

    Windows中有两类工具/应用:


    1)完全支持Unicode的应用程序,它接受Unicode的代码点,并可以使它们。处理Unicode是应用程序的职责,Windows只是提供了Unicode API,但它的GUI系统本身“缺省”不是Unicode。
    完全支持Unicode的应用程序对于一个给定的Unicode代码点只能显示一个字形。因此,它不会产生歧义,这个应用程序同时需要使用一个完整支持Unicode的字体。如果你有一个完全支持Unicode的应用程序,你可以设置NLS_LANG为AL32UTF8

    请注意,目前没有很多的应用程序是这样的,如果它没有由供应商明确提到,它最有可能为ANSI应用程序(见下文)。所以如果您不确定,不要设置NLS_LANG为AL32UTF8!

    ISQLPLUS是数据库中Unicode的客户端。请参见Document 231231.1 Quick setup of iSQL*Plus as Unicode client on windows. 还有就是SqlDeveloper。

    2) 一个标准ANSI应用(如sqlplusw.exe),不能使用Unicode代码点。因此,存储在数据库中的Unicode代码点需要被转换成ANSI代码点。这是通过设置NLS_LANG来完成(在本文档中有进一步描述)。这使Oracle映射Unicode到客户端的字符集(如sqlplus),(这是棘手的部分)但这和字体不同。

    例如你想显示阿拉伯语,你需要设置Windows的LOCALE为阿拉伯。这样,Windows知道什么是正确的代码点,并且可以使用字体引擎来显示代码点(这个字形)。
    Windows传递代码点和 “页”到翻译引擎。这个阿拉伯语“页”定义了字符集/代码页的代码点的字形。

    ANSI应用程序,一个字体通常包含不同语言的字形,这个“页”用来选择一个字体(例如)包含西里尔文,阿拉伯文和西欧文的所有字形, 是阿拉伯文“页”。

    因此,您有一个阿拉伯文的设置,您手动更改字体“页”,并要求显示字形为ANSI代码点XX。 2件事中的1件可能发生:

    1) “页”的字符集有这个字符,字体的创建者已经预览到字形,它被显示(但是它不是想要的因为它将作为不同的字符存储在数据库!)。

    2) “页”的字符集没有这个字符,字体的创建者没有预览到字形,你会得到黑色方块。 (通常你应该看到一个(黑色)方块,但一些字体中为? 或 ?也有可能,这依赖于字体中定义的错误处理)。

    您也可能在一个非Unicode字符集的数据库中看到上述情形。

    10. 更新/更改注册表中的NLS_LANG为正确的值:

    例如可以通过导入.reg文件,它将删除旧的插入新的注册表值

    如:

    REGEDIT4

    [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\]
    "NLS_LANG"=-
    [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0]
    "NLS_LANG"=-
    "NLS_LANG"="DUTCH_BELGIUM.WE8MSWIN1252"

    参考

    NOTE:199926.1 - How to change the ANSI Code Page (ACP) on Windows NT 4.0 and Windows 2000 / XP

    展开全文
  • 软件: nRF SKD Ver 15.2, S140 SoftDevice API 蓝牙 Central 扫描函数 uint32_t sd_ble_gap_scan_start (ble_gap_scan_params_t const * p_scan_params,ble_data_t const * p_adv_report_buffer) 开始或连续...
  • WM_DEVICECHANGE实现USB设备热插拔

    千次阅读 2016-03-24 10:13:41
    对于提供了软件控制功能,如弹出和锁定的设备,操作系统通常发送一条DBT_DEVICEREMOVEPENDING消息,以便使应用程序和设备驱动程序停止对设备的使用。 如果操作系统强行清除了一个设备,它可能不会发送DBT_...
  • ORACLE_CMD命令(最全的)

    千次阅读 2013-04-20 20:18:10
    启动Oracle,在cmd模式下依次启动: net start oracleservice服务名  lsnrctl start 启动监听程序 关闭服务为: lsnrctl stop net stop oracleserviceData 1. Oracle安装完成后的初始口令?...syste
  • 软件开发的过程中我们经常与键盘打交道,以下是我查MSDN 所得希望对各位有帮助。  可在代码中的任何地方用下列值代替键盘上的键:  值 描述  0x1 鼠标左键  0x2 鼠标右键  0x3 CANCEL 键  0x4 ...
  • 当您执行完下列操作后: 1) 正确配置 LC_ALL  2) 确认所使用的 locale 已安装 3) 配置好 telnet/ssh 客户端 然后您就可以使用 NLS_LANG 匹配 locale。 NLS_LANG 的构成为:NLS_LANG=<NLS_LANGUAGE>_...
  • 这是一个简单的SaaS定义:一种软件分发模型,服务提供商在该模型中为客户托管应用程序,并通过Internet将其提供给这些客户。 SaaS以及基础架构即服务(IaaS)和平台即服务(PaaS)是云服务的三大类之一。 [在...
  • 拥有美丽的外观,软件就成功了一半。界面由控件、工具栏、菜单、窗体等元素组成,对他们进行美化就能得到一个美丽的界面。 目前界面编程技术包括MFC、win32 SDK 、CJLibrary、WTL以及一些界面开发包。文本介绍MFC...
  • 软件环境 Python变量调用的过程 数值型 删除一个数值类型对象 布尔型 Bool 标准整型 Int 长整型 双精度浮点型 Float 复数 数值类型对象的内建功能函数 absNumber 求Number的绝对值 coercex y 将x y转换为同一种数值...
  • LOCAL_JNI_SHARED_LIBRARIES

    千次阅读 2017-05-08 11:05:43
     一个Android.mk file用来向编译系统描述你的源代码。具体来说:该文件是GNU Makefile的一小部分,会...每个模块属下列类型之一:  1)APK程序,一般的Android程序,编译打包生成apk文件  2)Java库,java类
  • 黑客也开始向手机应用转移, 原因有下列3点: 手机系统各式各样, 缺乏统一的标准. 许多程序员缺乏手机应用开发经验. 更严重的是, 通过手机应用, 黑客可以得到手机用户的隐私数据, 如:日程安排, 联系
  • 数据挖掘概念与技术_第三版_课后习题

    万次阅读 多人点赞 2020-04-23 14:26:13
    写在前面 该文为数据挖掘概念与技术第三版课后习题的答案,部分参考了第二版的英文答案,由于个人水平...2) 它是一种从数据库、统计学、机器学习和模式识别发展而来的技术的简单转换或应用吗? 3) 我们提出了一种...
  • 基于CMSIS应用程序的基本结构 ▪ CMSIS软件包详细目录 3使用步骤 1百科名片编辑 [1] ARM Cortex™ 微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cort
  •  动态连接库,dynamic-link libraries(DLL),是微软公司提供的一项软件技术。它实质上是包含了一些函数和数据的可执行模块,它可以被应用程序(.EXE)或其它DLL 调用。这种技术有以下好处:共享资源、节省内存、...
  • 【数据结构】链式队列 Linked_queue

    千次阅读 多人点赞 2012-07-17 17:44:39
    08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205 链式队列各种基本运算算法的实现 ...
  • 【Android】Android UI 开发_习题

    千次阅读 2020-04-14 23:41:46
    下列表示Toast较长时间显示的是()。 A、Toast.LENGTH_LONG B、Toast.LONG C、Toast.LENGTH_SHORT D、Toast.SHORT 在相对布局文件中,把控件显示在另外一个控件的右侧使用的属性是() A、layout_toRightOf B、...
  • 就Apache网站服务器而言,即便不是...作者:布加迪编译来源:51CTO.com|2014-09-29 09:01收藏分享有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研网站服务器安全是个大话题;说到什么是加固某一台网站服务...
  • ---------------- 必备软件安装.D盘 ---------------- 360流量监控提取包打开,让网络监控服务注册到system32目录下。 // 可将此工具放在C盘 "金山卫士"绿化打开,自动安装了"金山毒霸"。 //杀软用微软...
  • inet_ntoa、 inet_aton、inet_addr

    万次阅读 2011-01-21 16:13:00
     Internet地址用“.”间隔的地址可有下列几种表达方式:  a.b.c.d,a.b.c,a.b,a  当四个部分都有定值时,每个都解释成一个字节数据,从左到右组成Internet四字节地址。请注意,当一个Internet地址在Intel机器上...
  • 考虑到与软件的兼容性,应按规定进行使用。 对一个三部分地址,最后一部分解释成16位数据并作为网络地址的最右两个字节。这样,三部分地址便很容易表示B组网络地址,如“128.net.host”. 对一个两部分地址,最后一...
  • windows消息-WM_SYSCOMMAND与WM_COMMAND

    千次阅读 2018-08-23 08:59:25
    尤其是最大化和最小化窗口的时候,比如现在软件的流行的点关闭按钮,不是退出而是隐藏的情况,就可以在这里来实现。 参考: https://blog.csdn.net/autumn20080101/article/details/7577619 ...
  • 本例要求学会使用yum命令安装及卸载应用软件,完成下列任务: 安装/卸载软件 安装 httpd、wireshark-gnome 软件包,观察执行过程 检查这两个软件包的安装结果 卸载 httpd 软件包,检查卸载结果 通过重装软件修复...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 124,424
精华内容 49,769
关键字:

下列______属于应用软件