C语法简记,轻松解决Windows系统棘手问题

XMPP-TLS和SASL握手,XMPP-TLSSASL握手

ca88手机版登录,Windows XP是目前大家普遍使用的操作系统,其稳定性和易用性不容置疑。但是它也像人一样会闹个头疼脑热,出现点“感冒”症状,严重时得了重感冒一病不起也是不鲜见的事,这时很多人就会想到重装系统,但重装系统有一个最大的麻烦,就是需要之前备份,否则恢复到以前的使用习惯很难,一旦遇到一系统启动不起来,想备份也没了机会,这时你该怎么办呢?笔者在这里给你一个比较好的答案。
  一、Windows环境下

Objective-C语法简记,objective-c简记

  开始学习iPhone开发了,虽然现在已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,现在来学Objective-C,这篇只是一些很简略的笔记,不算是语法书。

TLS


  如果你的计算机还可以进入Windows环境中,那么恭喜你,这种情况下即使系统出现了问题,仍然不会是大问题。在这种情况通常会出现以下几种方法:

代码文件

Objective-C的代码文件有3种,“*.h”的头文件;”*.m”是普通的源代码文件,里面可包含Objective-C和C的代码;“*.mm”也是源文件的一种,里面可包含Objective-C,C和C 的代码。

概览

  XMPP包含的一个保证流安全的方法(传输层安全协议[TLS]的频道加密方法)来防止篡改和偷听.

  一个给定域的管理员可以要求客户端和服务器通信以及服务器之间通信时使用TLS,或者两者都要求。客户端应该在尝试完成 SASL握手之前使用 TLS,服务器应该在两个域之间使用 TLS 以保证服务器间通信的安全。

使用规则:

  1.从安装光盘解压缺少的一些重要文件

最简单的HelloWorld

1 #import <UIKit/UIKit.h>
2 #import "HGAppDelegate.h"
3 
4 int main(int argc, char *argv[])
5 {
6     printf("Hello worldn");
7     NSLog(@"Hello world");
8 }

取代了以前熟悉的#include预处理命令,换成了#import,但尖括号“<”,“>”还有双引号的意义与以前一样,printf语句依然能输入那句经典的Hello world,在Objective-C中就有了一种新的方式——NSLog(@"Hello world");大凡以NS前缀开头的类都是系统预先定义好的类,比如字符串NSString,后来的NSArray等。NSLOG传入了参数也是“Hello world”,但前面多加了一个@,这个是Objective-C字符串的写法,如果要声明一个字符串的变量并附初值@”Hello world”,则是

NSString *[email protected]”Hello world”;

简要描述

  当一个初始化实体用TLS保护一个和接收实体之间的流,其步骤如下:

  如果WindowsXP已经进入,但却发现少了某些文件,其中最常见的是Rundll32.exe的丢失。下面就以恢复这个文件为例来说明:单击“开始”/“运行”,在该窗口中输入expand x:i386Rundll32..ex_ c:windowssystem32Rundll32.exe(x代表光驱盘符,rundll.ex_代表需要解压的文件,c:windowssystem32指的是目标文件夹,这些都要根据具体情况来定),即可将丢失的文件恢复至系统。当然也可以直接从其他正常运行的机器复制该文件至本机的相应目录下。

基本数据类型

  Objective-C的基本数据类型和C中的一样的,int是整形,char是字符,float是单精度浮点数,double是双精度浮点数,与C有点区别的在于short和long,这两种在Objective-C写法是short int和long int,在这里多了一个长双精度的类型long double。无符号的在前面多加了一个unsigned,写法如unsigned int。

具体步骤(客户端-服务器)

  步骤1:客户端初始化流给服务器

<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' to='example.com' version='1.0'>

   步骤2:服务器发送一个流标签给客户端作为应答

<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='c2s_123' from='example.com' version='1.0'>

  步骤3:服务器发送 STARTTLS 范围给客户端(包括验证机制和任何其他流特性)

<stream:features>
     <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'>
       <required/>
     </starttls>
     <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
       <mechanism>DIGEST-MD5</mechanism>
       <mechanism>PLAIN</mechanism>
     </mechanisms>
</stream:features>

   步骤4:客户端发送 STARTTLS 命令给服务器

<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>

  步骤5:服务器通知客户端可以继续进行

<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>

  步骤 5 (或者): 服务器通知客户端 TLS 握手失败并关闭流和TCP连接

<failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
</stream:stream>

  步骤 6: 客户端和服务器尝试通过已有的TCP连接完成 TLS 握手.

  步骤 7: 如果 TLS 握手成功, 客户端初始化一个新的流给服务器

<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' from='example.com' id='c2s_234' version='1.0'>
   <stream:features>
     <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
       <mechanism>DIGEST-MD5</mechanism>
       <mechanism>PLAIN</mechanism>
       <mechanism>EXTERNAL</mechanism>
     </mechanisms>
</stream:features>

  步骤 9: 客户端继续 SASL 握手

  另外,对于丢失的dll链接文件,还可以通过Regsvr32这个程序文件来恢复,恢复的时候需要在运行窗口中输入Regsvr32 a.dll(a.dll代表丢失的链接文件),回车后即会在注册表中注册该文件,然后在弹出的对话框中点“确定”即可。

特有数据类型

  • Id 是指针类型,它的作用与C#/Java的Object类型很类似,可以指向任何引用类型的引用。
  • BOOL 这类型只有两个值YES和NO,就代表着1和0。在C中这两个值也代表true和false。
  • SEL 指向函数的指针,定义并附上初值的形式如下
SEL [email protected](方法签名)

SEL sel=NSSelectorFromString(方法名的字符串)

调用的时候则是以下形式

[obj performSelector:sel withObject: nil];

上面obj是对象的实例,sel则是SEL类型的变量,nil则是obj对象的默认值,如果保险起见,调用前要先判断obj对象有没有那个方法,则调用下面的方法,它会返回布尔值,ture就是存在,反之则不存在。

[obj respondsToSelector:sel]:

如果要获取SEL变量所指向的方法的方法名时,可以调用下面的方法,它返回的是一个字符串。

NSStringFromSelector(sel变量):
  • nil,NiL和NSNull nil与C的NULL一样,是指向空的指针,它算是一个对象,一个什么都没有的对象;Nil则是代表空的类,是一个Class来的;NSNull出现在集合中,它代表着集合中空的元素。

具体步骤(服务器-服务器)

  步骤1:Server1 初始化流给 Server2

<stream:stream xmlns='jabber:server' xmlns:stream='http://etherx.jabber.org/streams' to='example.com' version='1.0'>

  步骤2:Server2 发送一个流标签给 Server1 作为应答

<stream:stream xmlns='jabber:server' xmlns:stream='http://etherx.jabber.org/streams' from='example.com' id='s2s_123' version='1.0'>

  步骤3:Server2 发送 STARTTLS 范围给 Server1 ,包括验证机制和任何其他流特性

<stream:features>
     <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'>
       <required/>
     </starttls>
     <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
       <mechanism>DIGEST-MD5</mechanism>
       <mechanism>KERBEROS_V4</mechanism>
     </mechanisms>
</stream:features>

  步骤 4: Server1 发送 STARTTLS 命令给 Server2

<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>

  步骤5:Server2 通知 Server1 允许继续进行

<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>

  步骤 6: Server1 和 Server2 尝试通过 TCP 完成 TLS 握手.

  步骤 7: 如果 TLS 握手成功, Server1 初始化一个新的流给 Server2

<stream:stream xmlns='jabber:server' xmlns:stream='http://etherx.jabber.org/streams' to='example.com' version='1.0'>

  步骤7(或者): 如果 TLS 握手不成功, Server2 关闭 TCP 连接.

  步骤8 : Server2 发送一个包含任何可用流特性的流头信息给 Server1 

<stream:stream xmlns='jabber:server' xmlns:stream='http://etherx.jabber.org/streams' from='example.com' id='s2s_234' version='1.0'>
   <stream:features>
     <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
       <mechanism>DIGEST-MD5</mechanism>
       <mechanism>KERBEROS_V4</mechanism>
       <mechanism>EXTERNAL</mechanism>
     </mechanisms>
</stream:features>

  步骤9:Server1 继续进行 SASL 握手

  2.DLL文件的恢复

流程控制语句

  这里讲两种语句switch和foreach,因为这个在C#和Java之间都会有所区别。

  • Switch,switch语句与C中里面的switch一样,每个case之后可以不需要用break;结束并跳出switch语句,它会顺序执行下一个case里面的代码,直到遇到了break或者到达语句末尾为止。这里的case后面与Java一样不能跟字符串。
  • Foreach foreach语句与C#的形式很相像,也是foreach(元素类型 item in 集合的变量名)。在循坏体里面与C#不一样的是它能够去对被遍历的集合进行修改,但是由于更改后枚举器不会做相应的更新,所以如果删除了某些元素刚好被遍历到,有可能会出现空引用的异常。

SASL


  DLL文件的名称为动态链接库文件,一般存在于Windowssystem32文件夹下,该文件丢失或者被替换,一般也可进入Windows,但是执行应用程序时往往会出现系统报错。这种错误通常可以通过Sfc(系统文件检查器)。sfc是一个命令行程序,必须在WindowsXP的“命令提示符”窗口下才能运行,为了实现多种功能,sfc提供了多个参数,使用格式为:sfc/参数1 /参数2……,各个参数之间要用一个空格隔开。下面介绍一下其几个主要的参数,以方便大家使用:

  Objective-C类的定义分声明与实现两个操作,感觉和接口的定义与实现很像。

  • 类声明
@interface ClassName : NSObject
{
    //字段定义
}
    //方法,属性等其他成员的声明
@end 
  • 类的实现
@implementation ClassName
    //方法,属性等其他成员的实现
@end 

概览

  XMPP 有一个验证流的方法,即XMPP特定的SASL(简单验证和安全层)[SASL]。SASL提供了一个通用的方法为基于连接的协议增加验证支持,而XMPP使用了一个普通的XML名字空间来满足SASL的需要。

以下规则应用于:

  /scannow:用来扫描所有受保护的系统文件,也是应用比较广的一个参数,它主要是通过正确的系统文件代替错误的系统文件。该参数还可以将最新版本的受保护系统文件放入DLLCache文件夹,而且在操作过程中可能需要WindowsXP的安装光盘,以及其补丁文件,如果你没有该光盘,而是在硬盘上备份了安装文件,可以通过修改注册表来完成该项功能。在运行窗口键入Regedit命令进入注册表编辑器窗口,找到HKey_Local_MachinesoftwareMicrosoftWindowsCurrentVersionsetup项,在右侧的窗口中修改Installation Sources、ServicePacksourcePath和SoutcePath三个键值为硬盘上的系统安装程序路径,这样在修复时就不用再插入WindowsXP安装光盘了。

方法

方法的声明语法如下

 (void)methodName(paraType1)paraName1 and:(paraType2)paraName2; 

代表的是静态方法,-代表的是实例的方法;后面的括号代表的是返回类型,这里例如上面的方法是空返回void;方法名总在参数的前面,Objective-C的方法名很特殊,按上面声明的方法,它的方法名师methodName and;参数则是以 :(ParaType)ParaName的形式,如果没有参数,则方法名后面直接以分号“;”结束。调用则通过以下的形式,objIns则是对象的实例名。

[objIns methodName:value1 and:value2]; 

简要描述

  一个初始化实体使用SASL和接收实体做验证的步骤如下:

这一系列的 挑战/应答 组,持续进行直到发生以下三件事中的一件为止:

  /scanonce:下次启动时执行受保护系统文件的扫描,也需要读取安装光盘和补丁文件。这个命令常常在执行/scannow命令出现错误提示时才使用。

存取方法

对于私有字段而已要对其获取或设置都要通过get/set方法来进行,在Java中通过声明getter/setter方法来实现面向对象编程中的封装性,在Objective-C中也有这类getter/setter方法,称之为存取方法。

例如现在有字段int count,他对应的存取方法是

-(void) setCount: (int)couValue;
-(int) count; 

Setter方法则是以set 对应的字段名,setter直接与字段同名。在调用的时候可以用通常方括号的形式”[” ”]”当不普通方法来调用,可以使用类似C#,Java中点”.”的方式调用,如果点的方式调用,则直接跟上字段的名字则可,如

MyClass.count=12;
Int count=myclass.count; 

SASL 错误

SASL相关的错误条件定义如下:

  • <aborted/> -- 接收实体认可由初始化实体发送的<abort/>元素;在回应一个<abort/>元素时发送。
  • <incorrect-encoding/> -- 由初始化实体提供的数据无法处理,因为[BASE64]编码不正确(例如,因为编码不符合[BASE64]的第三章); 在回应一个包含初始化响应数据的<response/> 元素或<auth/>元素时发送.
  • <invalid-authzid/> -- 由初始化实体提供的授权id是非法的,因为它的格式不正确或初始化实体无权给那个ID授权;在回应一个包含初始化响应数据的<response/> 元素或<auth/>元素时发送。
  • <invalid-mechanism/> -- 初始化实体不能提供一个机制活、或请求一个不被接受实体支持的机制;在回应一个<auth/>元素时发送。
  • <mechanism-too-weak/> -- 初始化实体请求的机制比服务器策略对它的要求弱;在回应一个包含初始化响应数据的<response/> 元素或<auth/>元素时发送。
  • <not-authorized/> -- 验证失败,因为初始化实体没有提供合法的credentials(这包括但不限于未知用户名等情形);在回应一个包含初始化响应数据的<response/> 元素或<auth/>元素时发送。
  • <temporary-auth-failure/> -- 验证失败,因为接收实体出现了临时的错误;在回应一个<response/> 元素或<auth/>元素时发送。

  /scanboot:每次启动系统时都扫描所受保护的系统文件,这可能大大降低启动速度,一般不用,使用情况同/scanonce参数。

属性

如果声明了一个属性,则系统会自动为其生成getter/setter方法。这个与C#的属性挺类似,但是语法形式大不相同。它与类的定义一样,分别有声明与实现两部分

  • 声明
@property(修饰符) int count;
  • 实现
@synthesize count;

如果在实现的时候要指定这个属性是对那个字段经行封装的,可以通过下面的形式,下面则代表了对count字段的封装,记得指定时有加下划线”_”

@synthesize count=_count; 

在声明的时候可以指定修饰符,修饰符可以用多个,每个间用逗号隔开,修饰符及其作用如下所示

  • Readwirte:可供读写;
  • Readonly:只读;
  • Strong:强引用,就是我们在C#和Java中通常使用的引用,就是指该对象在没有被任何一个字段引用才会被GC;
  • Weak:弱引用,就算该对象有被字段引用着,还有可能会被GC;
  • Copy:赋值的时候只给一个副本,不会给它本身;
  • Assign:在通过setter赋值时不会增加该对象的引用计数器,这针对NSString类型和基础数据类型;
  • Retain:调用时会释放前一个引用的对象,但是引用计数器会加1;
  • Nonatomic:表明这个属性不考虑线程安全问题。

如果不使用系统自动生成的getter或setter方法,可以通过在修饰符的地方指定自己定义的getter方法和setter方法的签名,如

@property(getter=mygetter,setter=mysetter:) int count;

具体步骤(客户端-服务器)

  步骤1:客户端初始化流给服务器

<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' to='example.com' version='1.0'>

  步骤2: 服务器向客户端发送流标签作为应答

<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='c2s_234' from='example.com' version='1.0'>

  步骤3: 服务器通知客户端可用的验证机制

 <stream:features>
     <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
       <mechanism>DIGEST-MD5</mechanism>
       <mechanism>PLAIN</mechanism>
     </mechanisms>
</stream:features>

  步骤4:客户端选择一个验证机制

<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='DIGEST-MD5'/>

  步骤5:服务器发送一个 [BASE64] 编码的挑战给客户端

<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
  cmVhbG09InNvbWVyZWFsbSIsbm9uY2U9Ik9BNk1HOXRFUUdtMmhoIixxb3A9ImF1dGgiLGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNzCg==
</challenge>

  解码后的挑战信息是: 

  realm="somerealm",nonce="OA6MG9tEQGm2hh",
  qop="auth",charset=utf-8,algorithm=md5-sess

  步骤 5 (替代): 服务器返回一个错误给客户端

<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
     <incorrect-encoding/>
</failure>
</stream:stream>

  步骤 6: 客户端发送一个[BASE64]编码的回应这个挑战:

<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
   dXNlcm5hbWU9InNvbWVub2RlIixyZWFsbT0ic29tZXJlYWxtIixub25jZT0i
   T0E2TUc5dEVRR20yaGgiLGNub25jZT0iT0E2TUhYaDZWcVRyUmsiLG5jPTAw
   MDAwMDAxLHFvcD1hdXRoLGRpZ2VzdC11cmk9InhtcHAvZXhhbXBsZS5jb20i
   LHJlc3BvbnNlPWQzODhkYWQ5MGQ0YmJkNzYwYTE1MjMyMWYyMTQzYWY3LGNo
   YXJzZXQ9dXRmLTgK
</response>

  解码后的回应信息是

   username="somenode",realm="somerealm",
   nonce="OA6MG9tEQGm2hh",cnonce="OA6MHXh6VqTrRk",
   nc=00000001,qop=auth,digest-uri="xmpp/example.com",
   response=d388dad90d4bbd760a152321f2143af7,charset=utf-8

  步骤 7: 服务器发送另一个[BASE64]编码的挑战给客户端

<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
   cnNwYXV0aD1lYTQwZjYwMzM1YzQyN2I1NTI3Yjg0ZGJhYmNkZmZmZAo=
</challenge>

  解码后的挑战信息是:

rspauth=ea40f60335c427b5527b84dbabcdfffd

  步骤 7 (或者): 服务器返回一个错误给客户端:

<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
     <temporary-auth-failure/>
   </failure>
</stream:stream>

  步骤 8: 客户端应答这个挑战

<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>

  步骤 9: 服务器通知客户端验证成功

<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>

  步骤 9 (或者): 服务器通知客户端验证失败

<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
     <temporary-auth-failure/>
   </failure>
</stream:stream>

  步骤 10: 客户端发起一个新的流给服务器:

<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' to='example.com' version='1.0'>

  步骤 11: 服务器发送一个流头信息回应客户端,并附上任何可用的特性(或空的features元素)

<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='c2s_345' from='example.com' version='1.0'>
   <stream:features>
     <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/>
     <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
</stream:features>

  /purgecache:用来清除文件缓存(该文件默认情况下是在%systemroot%system32dllcache下)并立即扫描所有受保护的系统文件,常在其后还要加上“/cachesize=x”这个参数,这个参数是用来设置文件缓存大小的,以MB为单位,该参数如果设置较小可以节省硬盘空间,如果设置大一些可以保护系统文件,则可能尽可能地恢复更多的系统文件。

又叫作代码块,声明的语法如下

ReturnType(^BlockName)=^(paraType1 para1,paraType2 para2){ /*代码内容*/ };

等号左边相当于声明块的变量,等号右边相当于块的字面值,块的效果类似于Lumbda表达式,调用时就如C/C#中调用方法那样

BlockName(para1,para2);

具体步骤(服务器-服务器)

  步骤 1: 服务器1 发起一个流给 服务器2 

<stream:stream xmlns='jabber:server' xmlns:stream='http://etherx.jabber.org/streams' to='example.com' version='1.0'>

  步骤 2: 服务器2 回应一个流标签给 服务器1

<stream:stream xmlns='jabber:server' xmlns:stream='http://etherx.jabber.org/streams' from='example.com' id='s2s_234' version='1.0'>

  步骤 3: 服务器2 通知 服务器1 可用的验证机制

<stream:features>
     <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
       <mechanism>DIGEST-MD5</mechanism>
       <mechanism>KERBEROS_V4</mechanism>
     </mechanisms>
</stream:features>

  步骤 4: 服务器1 选择一个验证机制

<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='DIGEST-MD5'/>

  步骤 5: 服务器2 发送一个[BASE64]编码的挑战给 服务器1

 <challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
   cmVhbG09InNvbWVyZWFsbSIsbm9uY2U9Ik9BNk1HOXRFUUdtMmhoIixxb3A9
   ImF1dGgiLGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNz
</challenge>

  解码后的挑战信息是

realm="somerealm",nonce="OA6MG9tEQGm2hh",
qop="auth",charset=utf-8,algorithm=md5-sess

  步骤 5 (替代): 服务器2 返回一个错误给 服务器1

 <failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
     <incorrect-encoding/>
   </failure>
</stream:stream>

  步骤 6: 服务器1 发送一个[BASE64]编码的回应这个挑战

<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
   dXNlcm5hbWU9ImV4YW1wbGUub3JnIixyZWFsbT0ic29tZXJlYWxtIixub25j
   ZT0iT0E2TUc5dEVRR20yaGgiLGNub25jZT0iT0E2TUhYaDZWcVRyUmsiLG5j
   PTAwMDAwMDAxLHFvcD1hdXRoLGRpZ2VzdC11cmk9InhtcHAvZXhhbXBsZS5v
   cmciLHJlc3BvbnNlPWQzODhkYWQ5MGQ0YmJkNzYwYTE1MjMyMWYyMTQzYWY3
   LGNoYXJzZXQ9dXRmLTgK
</response>

  解码后的应答信息是

   username="example.org",realm="somerealm",
   nonce="OA6MG9tEQGm2hh",cnonce="OA6MHXh6VqTrRk",
   nc=00000001,qop=auth,digest-uri="xmpp/example.org",
   response=d388dad90d4bbd760a152321f2143af7,charset=utf-8

  步骤 7: 服务器2 发送另外一个[BASE64]编码的挑战给 服务器1

<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
   cnNwYXV0aD1lYTQwZjYwMzM1YzQyN2I1NTI3Yjg0ZGJhYmNkZmZmZAo=
</challenge>

  解码后的挑战信息是

rspauth=ea40f60335c427b5527b84dbabcdfffd

  步骤 7 (或者): 服务器2 返回一个错误给 服务器1

<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
     <invalid-authzid/>
   </failure>
</stream:stream>

  步骤 8: 服务器1 回应挑战

 <response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>

  步骤 8 (或者): 服务器1 中止协商

 <abort xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>

  步骤 9: 服务器2 通知 服务器1 验证成功

<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>

  步骤 9 (或者): 服务器2 通知 服务器1 验证失败

<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
     <aborted/>
   </failure>
</stream:stream>

  步骤 10: 服务器1 重新发起一个新的流给 服务器2

<stream:stream xmlns='jabber:server' xmlns:stream='http://etherx.jabber.org/streams' to='example.com' version='1.0'>

  步骤 11: 服务器2 发送一个流头信息应答 服务器1 ,并附上任何可用的特性(或一个空的features元素).:

<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' from='example.com' id='s2s_345' version='1.0'>
<stream:features/>

 

PS:资源文件来自Jabber /XMPP中文翻译计划      

TLS 概览 XMPP包含的一个保证流安全的方法(传输层安全协议[TLS]的频道加密方法)来防止篡改和偷听. 一个...

  一般情况下执行sfc/scannow就可以对系统文件进行恢复了,时间一般在10分钟左右。

协议

语法如下

@protocol ProtocoName

//方法声明

@optional //可选实现

//方法声明

@required//必须实现

//方法声明

@end

这个类似于接口,实现是在类的声明处以下面的形式

@interface ClassName:NSObject<ProtocoName1,…..>

  3.系统还原显身手

类别

语法如下

@interface ClassName(CategoryName)

    //方法声明

@end

    //其他代码

@implementation ClassName(CategoryName)

    //方法声明

@end 

用于给已经定义的类扩展方法,ClassName是已经定义的类,要被扩展的类,CategoryName是类别名,类别中的方法如果遇到方法签名一样的方法,则会覆盖原有的方法;类别中的成员只局限于方法,字段那些是不能定义的;若是覆盖了方法,那么那个覆盖的作用域是整个程序。

  如果用sfc/scannow还是出错的话,则可能想到用系统还原功能来恢复系统。特别是在增删某些软件后出现了系统故障的时候,这种方法就显得尤为方便。

Self与supper

  • Self是类隐藏参数,类似Java与C#的this,调用方法时先向本类搜索方法,没有的话再向父类搜索。
  • Super则是预编译指令,类似C#与Java的super,但是不完全一样,这里的super不代表对父类的引用,只是在调用方法时先从父类搜索,如果没有则再往父类的父类中搜索,只在调用方法时有C#/Java的效果,本质还是对当前类的引用。

  依次单击“开始→所有程序→附件→系统工具→系统还原”,运行“系统还原”命令,打开“系统还原向导”,选择“恢复我的计算机到一个较早的时间”,点击“下一步”,选择好日期后再跟着向导还原即可。

内存管理

在开始时调用

NSAutoreleasePool *pool=[ [NSAutoreleasePool alloc] init]; 

结束的时候

[pool release];

构造对象

[[ClassName alloc] init];

释放对象

[ClassInsName release]; 

规则:1)自己用alloc或者copy创建的对象,在用完的时候要release;2)对不是自己创建的对象,则不要去release;3)retain对象后,要realease,两者要对称,有多少个retain就要有多少个release。

  上文所讲系统还原功能是Windows XP中操作的,如果不能进入Windows XP系统,可以通过如下方法解决:

异常与错误

Objective-C的异常处理与C#和Java差不多,也是由try catch finally语句块组成,抛异常用throw。格式如下

@try
{  }
@catch(NSException *ex)
{
@throw
}
@finally
{

}

和C#的关键字一样的,只是多了个“@”,catch块中的@thorw只是为了演示用。

在Objective-C中NSError让人的感觉与NSException类似,都是与错误有关,但实际上两者在用法上大有不同,NSException是异常,记录异常的信息,异常是在程序出现,会让程序卡住的。NSError是错误,是记录错误的信息,例如调用了某些方法失败后,会在传入方法的NSError对象中填写相关的错误信息,有NSError不会让程序卡死,但出现了NSException不捕捉则会让程序卡死,NSException可以被抛出和捕捉,NSError没有抛出和捕捉这个概念。

开始学习iPhone开发了,虽然现在已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是...

本文由ca88手机版登录发布于ca88手机版,转载请注明出处:C语法简记,轻松解决Windows系统棘手问题

TAG标签: ca88手机版登录
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。