博彦面试题dy_第1页
博彦面试题dy_第2页
博彦面试题dy_第3页
博彦面试题dy_第4页
博彦面试题dy_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、博彦BREW班面试题(2010.11.23)1. 对手机开发的认识?2. 从brew中学到什么?3. 发送同步消息与异步消息的区别?1、同步方式两个通信应用服务之间必须要进行同步,两个服务之间必须都是正常运行的。发送程序和接收程序都必须一直处于运行状态,并且随时做好相互通信的准备。发送程序首先向接收程序发起一个请求,称之为发送消息,发送程序紧接着就会堵塞当前自身的进程,不与其他应用进行任何的通信以及交互,等待接收程序的响应,待发送消息得到接收程序的返回消息之后会继续向下运行,进行下一步的业务处理。2、异步方式两个通信应用之间可以不用同时在线等待,任何一方只需各自处理自己的业务,比如发送方发送消

2、息以后不用登录接收方的响应,可以接着处理其他的任务。也就是说发送方和接收方都是相互独立存在的,发送方只管方,接收方只能接收,无须去等待对方的响应。4. 适配函数的作用?5. 对C+了解多少?6. bese form继承的是什么?调用那些函数7. mobel的作用?8. 你了解send-event和post-event吗?9. buiw了解多少?都学了那些内容?10. Widget的作用?11. 什么是函数指针?什么是变量指针?区别及调用指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针函数指针是指向函数的指针变量,即本质是一个指针变量。要的区别是一个是指针变量,一个是函数

3、。12. 什么是虚函数,什么是函数重载?声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数;同名函数的形式参数(指参数的个数、类型或者顺序)必须不同13. 内联函数?运算符重载?抽象类?内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名;运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能;在C+中,含有纯虚拟函数的类称为抽象类,它不能生成对象14. 对STL了解多少?STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。15. 监

4、探器?设计模式学什么?16. 怎么启动应用程序?17. 回调函数起什么作用?回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。18. 为什么Widget里面要包含一个MODEL?19. 如果w-form收到一个按键消息,接下来怎么做?20. form和contain的关系,怎么把contain放在form?21. BREW里面的内存管理方式是什么?22. C+中内存分配方式,堆与栈的区别?1、 栈区(stack) 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结

5、构中的栈。2、堆区(heap) 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放。-分别是data区,bbs区 4、文字常量区 常量字符串就是放在这里的。 程序结束后由系统释放-coment区5、程序代码区存放函数体的二进制代码。-code区1.从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整

6、个运行期间都存在。例如全局变量,static变量。 2.在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 3.从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。23. static的作用,与全局变量的一些区别?所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。存储在静态数据区的变量会在程序刚

7、开始运行时就完成初始化,也是唯一 的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。(3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。24. 异常处理(用一个实例来记住几个的用法)25. 几种类型转换26. 面向对象的三种基本特征(最好能记住一个实例来说明,特别是多态的实现过程)封装,也就是把客观事物封装成抽象的类,并且类可以把自己的

8、数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。继承概念的实现方式有三类:实现继承、接口继承和可视继承。实现继承是指使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。多态,允许将子类类型的指针赋值给父类类型的指针。实现多态,有二种方式,覆盖,重载。覆盖,是指子类重新定义父类的虚函数的做法。重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。封装性是一种信息隐蔽技术,它体现于类的说明,是对象重要的特性。封装使

9、数据和操作该数据的方法(函数)封装为一个整体,形成独立性很强的模块,使得用户只能看到对象的外部特性(对象可以接受哪些信息,可以进行何种处理),而对象的内部特性(内部private的属性和实现处理能力的算法)用户是看不到的。简言之就是封装使对象的设计者和对象的使用者分开,使用者只要知道对象可以做什么,无需知道是怎么做出来的。借助封装有助于提高类和系统的安全性。继承性继承是一种由已有类创建新类的机制,利用继承,可以先创建一个共有属性的一般类,根据这个一般类再创建具有特殊属性的新类。新类继承一般类的方法并根据需要增加它自己的新方法。有继承而得到的类称为子类,被继承的类称为父类(超类),当然子类也可以

10、成为父类。如下图,由下向上看,双炸飞机类和歼击机类都继承了战斗机类的特点但又分别具有自己新的功能,同样,战斗机类和民用机类都具有飞机类所有的特点也都扩展了属于自己的新功能。也就是说双炸飞机和歼击机既具有飞机的全部特点又拥有战斗机的全部特点。多态性同一个信息被不同的对象接收到时可能产生完全不同行为,这就是多态性。通过继承过程中的方法重写就可以实现多态。多态可以改善程序的组织构架,提高程序的可读性,也是程序更容易扩充。一、Socket简介Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换。几个定义:(1)IP地址:即依照TCP/IP协议分配

11、给本地主机的网络地址,两个进程要通讯,任一进程首先要知道通讯对方的位置,即对方的IP。(2)端口号:用来辨别本地通讯进程,一个本地的进程在通讯时均会占用一个端口号,不同的进程端口号不同,因此在通讯前必须要分配一个没有被访问的端口号。(3)连接:指两个进程间的通讯链路。(4)半相关:网络中用一个三元组可以在全局唯一标志一个进程:(协议,本地地址,本地端口号)这样一个三元组,叫做一个半相关,它指定连接的每半部分。(4)全相关:一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一个完整的网间通信需要一个五元组来标识

12、:(协议,本地地址,本地端口号,远地地址,远地端口号)这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。二、客户/服务器模式在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器(Client/Server, C/S)模式,即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户/服务器模式的建立基于以下两点:(1)首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。(2)其次,网间进程通信完全

13、是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基于客户/服务器模式的TCP/IP。服务器端:其过程是首先服务器方要先启动,并根据请求提供相应服务:(1)打开一通信通道并告知本地主机,它愿意在某一公认地址上的某端口(如FTP的端口可能为21)接收客户请求;(2)等待客户请求到达该端口;(3)接收到客户端的服务请求时,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新

14、进程与客户的通信链路,并终止。(4)返回第(2)步,等待另一客户请求。(5)关闭服务器客户端:(1)打开一通信通道,并连接到服务器所在主机的特定端口;(2)向服务器发服务请求报文,等待并接收应答;继续提出请求.(3)请求结束后关闭通信通道并终止。从上面所描述过程可知:(1)客户与服务器进程的作用是非对称的,因此代码不同。(2)服务器进程一般是先启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。介绍完基础知识,下面就介绍一些API函数:创建套接字socket() 应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段,其调用格式如下:S

15、OCKET PASCAL FAR socket(int af, int type, int protocol);该调用要接收三个参数:af、type、protocol。参数af指定通信发生的区域:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是网际网区域。因此,地址族与协议族相同。参数type 描述要建立的套接字的类型。这里分三种:(1)一是TCP流式套接字(SOCK_STREAM)提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FT

16、P)即使用流式套接字。(2)二是数据报式套接字(SOCK_DGRAM)提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。(3)三是原始式套接字(SOCK_RAW)该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。参数protocol说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为0,使用默认的连接模式。根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。因此,socket()系统调用实际上指定了相关五

17、元组中的“协议”这一元。指定本地地址bind() 当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名。bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地半相关。其调用格式如下:int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int namelen);参数s是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。参数name 是赋给套接字s的本地地址(名字),其长度可变,结构随通信域的不同而不同。namele

18、n表明了name的长度。如果没有错误发生,bind()返回0。否则返回SOCKET_ERROR。建立套接字连接connect()与accept()这两个系统调用用于完成一个完整相关的建立,其中connect()用于建立连接。accept()用于使服务器等待来自某客户进程的实际连接。connect()的调用格式如下:int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR * name, int namelen);参数s是欲建立连接的本地套接字描述符。参数name指出说明对方套接字地址结构的指针。对方套接字地址长度由namelen说明。

19、如果没有错误发生,connect()返回0。否则返回值SOCKET_ERROR。在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。由于地址族总被包含在套接字地址结构的前两个字节中,并通过socket()调用与某个协议族相关。因此bind()和connect()无须协议作为参数。accept()的调用格式如下:SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen);参数s为本地套接字描述符,在用做accept()调用的参数前应该先调用过listen()。addr 指向客户方套接

20、字地址结构的指针,用来接收连接实体的地址。addr的确切格式由套接字创建时建立的地址族决定。addrlen 为客户方套接字地址的长度(字节数)。如果没有错误发生,accept()返回一个SOCKET类型的值,表示接收到的套接字的描述符。否则返回值INVALID_SOCKET。accept()用于面向连接服务器。参数addr和addrlen存放客户方的地址信息。调用前,参数addr 指向一个初始值为空的地址结构,而addrlen 的初始值为0;调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,而连接请求是由客户方的connect()调用发出的。当有连接请求到达时,accep

21、t()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr 和addrlen,并创建一个与s有相同特性的新套接字号。新的套接字可用于处理服务器并发请求。四个套接字系统调用,socket()、bind()、connect()、accept(),可以完成一个完全五元相关的建立。socket()指定五元组中的协议元,它的用法与是否为客户或服务器、是否面向连接无关。bind()指定五元组中的本地二元,即本地主机地址和端口号,其用法与是否面向连接有关:在服务器方,无论是否面向连接,均要调用bind(),若采用面向连接,则可以不调用bind(),而通过connect()自动完成。若采用无连接,客

22、户方必须使用bind()以获得一个唯一的地址。监听连接listen() 此调用用于面向连接服务器,表明它愿意接收连接。listen()需在accept()之前调用,其调用格式如下:int PASCAL FAR listen(SOCKET s, int bcklog);参数s标识一个本地已建立、尚未连接的套接字号,服务器愿意从它上面接收请求。backlog表示请求连接队列的最大长度,用于限制排队请求的个数,目前允许的最大值为5。如果没有错误发生,listen()返回0。否则它返回SOCKET_ERROR。listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必须的连接,并建立

23、长度为backlog的请求连接队列。调用listen()是服务器接收一个连接请求的四个步骤中的第三步。它在调用socket()分配一个流套接字,且调用bind()给s赋于一个名字之后调用,而且一定要在accept()之前调用。数据传输send()与recv() 当一个连接建立以后,就可以传输数据了。常用的系统调用有send()和recv()。send()调用用于s指定的已连接的数据报或流套接字上发送输出数据,格式如下:int PASCAL FAR send(SOCKET s, const char FAR *buf, int len, int flags);参数s为已连接的本地套接字描述符。b

24、uf 指向存有发送数据的缓冲区的指针,其长度由len 指定。flags 指定传输控制方式,如是否发送带外数据等。如果没有错误发生,send()返回总共发送的字节数。否则它返回SOCKET_ERROR。recv()调用用于s指定的已连接的数据报或流套接字上接收输入数据,格式如下:int PASCAL FAR recv(SOCKET s, char FAR *buf, int len, int flags);参数s 为已连接的套接字描述符。buf指向接收输入数据缓冲区的指针,其长度由len 指定。flags 指定传输控制方式,如是否接收带外数据等。如果没有错误发生,recv()返回总共接收的字节数

25、。如果连接被关闭,返回0。否则它返回SOCKET_ERROR。输入/输出多路复用select() select()调用用来检测一个或多个套接字的状态。对每一个套接字来说,这个调用可以请求读、写或错误状态方面的信息。请求给定状态的套接字集合由一个fd_set结构指示。在返回时,此结构被更新,以反映那些满足特定条件的套接字的子集,同时, select()调用返回满足条件的套接字的数目,其调用格式如下:int PASCAL FAR select(int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds,

26、 const struct timeval FAR * timeout);参数nfds指明被检查的套接字描述符的值域,此变量一般被忽略。参数readfds指向要做读检测的套接字描述符集合的指针,调用者希望从中读取数据。参数writefds 指向要做写检测的套接字描述符集合的指针。exceptfds指向要检测是否出错的套接字描述符集合的指针。timeout指向select()函数等待的最大时间,如果设为NULL则为阻塞操作。select()返回包含在fd_set结构中已准备好的套接字描述符的总数目,或者是发生错误则返回SOCKET_ERROR。关闭套接字closesocket() closesocket()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。closesocket()的调用格式如下:BOOL PASCAL FAR closesocket(SOCKET s);参数s待关闭的套接字描述符。如果没有错误发生,closesocket()返回0。否则返回值SOCKET_ERROR。对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问:1. 什么是TCP/IP、UDP?2. Socket在哪里呢?3. Sock

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论