广州市品高软件股份有限公司7月招聘面试题174道2020713

阅读以下程序说明和C++程序,将程序段中(1)~(7)空缺处的语句填写完整。

[说明]

使用MFC的CSocket类在两个或者多个应用程序之间建立通信。服务器应用程序先创建一个特殊的 Socket,用于监听客户应用程序的连接请求,然后再创建新的Socket来完成连接。从客户和服务器两端读取该连接,直到一个需要处理的报文到来为止。以下C++程序将封装这些功能,这样所有应用程序需要完成的只是创建一个Socket连接,然后处理到来的报文。这将包括一个新的服务器Socket类、新客户端Socket类和新的报文队列类。

创建新的服务器Socket类程序的框架如下。第1个函数ListenEx()用于通知Socket开始监听客户应用程序。第2个函数OnAccept()在接收到连接请求时被调用。在其中创建新的Socket,并立刻设置它开始从客户应用程序读取报文,这些是通过调用第3个函数RecvThread()来完成的,该函数位于它自己的线程中。

[C++程序]

[ListenEX()函数]


正确答案:这是一道要求读者使用Socket与另一个Windows应用程序或者与任何支持Socket的应用程序通信的编程题。本题的解答思路如下。 题干已给出“函数ListenEx()用于通知Socket开始监听客户应用程序”ListenEx()通过调用CSocket的Listen()函数监听来自客户应用程序的连接请求。ListenEx()同时在结构中设置其调用参数这些参数最终被传递到RecvThread()函数以实现读操作。因此()空缺处应填入“Listen()”。 函数OnAccept()在接收到连接请求时被调用。它使用文本编辑器(TextEdit)重载CSocket的OnAccept()函数在其中将创建新的Socket用于建立与客户应用程序的连接同时使用由用户定义的标识符作为关键字将该Socket保存到对象映射表中。然后设置Socket进入同步模式并创建一个线程从套接字中读取数据。因此(2)空缺处应填入“newCSocket”用于完成初始化工作。 函数RecvThread()使用CSocket的Receive()函数等待直到通过套接字接收到新的报文。该线程假定每一个报文包含固定字长的报头和可变长度的报文体。对于每一个新的套接字报文RecvThread()还向应用程序发送WM_New_MESSAGE消息通知新的报文等待处理。如果套接字关闭线程将在终止前向应用程序发送WM_DONE_MESSAGE消息所以(3)空缺处应填入“len+=res”。该函数没有返回值所以(4)空缺处应填入“return 0”。 接下来添加函数SendEx()向客户应用程序发回报文该函数将根据用户定义的标识符从对象映射表中取出Socket对象然后调用线程函数向该Socket发送报文因此(5)空缺处应填入“m_mapSockets[id]”。 SendThread使用CSocket类的Send()函数将报文数据发送出去因此(6)空缺处应填入“Send”。 服务器套接字类中的最后需要创建关闭函数这个函数不仅将关闭监听套接字而且将关闭创建的所有与客户端连接的套接字因此(7)空缺处应填入“Close()”。
这是一道要求读者使用Socket与另一个Windows应用程序或者与任何支持Socket的应用程序通信的编程题。本题的解答思路如下。 题干已给出“函数ListenEx()用于通知Socket开始监听客户应用程序”,ListenEx()通过调用CSocket的Listen()函数监听来自客户应用程序的连接请求。ListenEx()同时在结构中设置其调用参数,这些参数最终被传递到RecvThread()函数以实现读操作。因此()空缺处应填入“Listen()”。 函数OnAccept()在接收到连接请求时被调用。它使用文本编辑器(TextEdit)重载CSocket的OnAccept()函数,在其中将创建新的Socket,用于建立与客户应用程序的连接,同时使用由用户定义的标识符作为关键字将该Socket保存到对象映射表中。然后,设置Socket进入同步模式,并创建一个线程从套接字中读取数据。因此(2)空缺处应填入“newCSocket”,用于完成初始化工作。 函数RecvThread()使用CSocket的Receive()函数等待,直到通过套接字接收到新的报文。该线程假定每一个报文包含固定字长的报头和可变长度的报文体。对于每一个新的套接字报文,RecvThread()还向应用程序发送WM_New_MESSAGE消息,通知新的报文等待处理。如果套接字关闭,线程将在终止前向应用程序发送WM_DONE_MESSAGE消息,所以(3)空缺处应填入“len+=res”。该函数没有返回值,所以(4)空缺处应填入“return 0”。 接下来添加函数SendEx()向客户应用程序发回报文,该函数将根据用户定义的标识符从对象映射表中取出Socket对象,然后调用线程函数向该Socket发送报文,因此(5)空缺处应填入“m_mapSockets[id]”。 SendThread使用CSocket类的Send()函数将报文数据发送出去,因此(6)空缺处应填入“Send”。 服务器套接字类中的最后需要创建关闭函数,这个函数不仅将关闭监听套接字,而且将关闭创建的所有与客户端连接的套接字,因此(7)空缺处应填入“Close()”。


TCP协议的“三次握手”中,第一次握手指的是什么( )。

A、客户端再次向服务器端发送确认信息,确认连接

B、服务器端向客户端回送一个响应,通知客户端收到了连接请求

C、客户端向服务器端发出连接请求,等待服务器确认

D、以上答案全部错误


参考答案:C


为实现可靠传输,TCP在数据传输之前要通过三次握手建立连接,下面说话正确的是( )。

A、在三次握手中,不仅要完成初始化建立连接,同时也在传送应用层数据

B、SYN标志位只有在建立连接时才被置为1,握手完成后就被置为0

C、所有主机的序列号都是从1开始

D、其中一台主机以序列号X开始,则另外一台主机的应答序列号以X+1开始


正确答案:BD


● TCP 使用三次握手协议来建立连接,设甲乙双方发送报文的初始序号分别为 X和 Y,甲方发送 (69) 的报文给乙方,乙方接收报文后发送 (70) 的报文给甲方,然后甲方发送一个确认报文给乙方便建立了连接。


正确答案:A,C


TCP使用三次握手协议来建立连接,设甲乙双方发送报文的初始序号分别为X和 Y,甲方发送(69)的报文给乙方,乙方接收报文后发送(70)的报文给甲方,然后甲方发送一个确认报文给乙方便建立了连接。

(注:ACK的下标为捎带的序号)

A.SYN=1,序号=X

B.SYN=1,序号=X+1,ACKX=1

C.SYN=1,序号=Y

D.SYN=1,序号=Y,ACKY+1=1


正确答案:A


广州市品高软件股份有限公司7月招聘面试题面试题面试官常问到的一些题目整理如下:问题 Q1: Tornado 的核心是什么?可用的回答 : Tornado 的核心是 ioloop 和 iostream 这两个模块, 前者提供了一个高效的 I/O 事件循环,后者则封装了 一个无阻塞的 socket 。 通过向 ioloop 中添加网络 I/O 事件,利用无阻塞的 socket, 再搭配相应的回调函数,便可达到梦寐以求的高效异步执行。 问题 Q2:简述 三次握手、四次挥手的流程?可用的回答 : 三次握手: 初始状态:客户端A和服务器B均处于CLOSED状态,然后服务器B创建socket,调用监听接口使得服务器处于LISTEN状态,等待客户端连接。(后续内容用A,B简称代替) 1、A首先向B发起连接,这时TCP头部中的SYN标识位值为1,然后选定一个初始序号seq=x(一般是随机的), 消息发送后,A进入SYN_SENT状态,SYN=1的报文段不能携带数据,但要消耗一个序号。 2、B收到A的连接请求后,同意建立连接,向A发送确认数据,这时TCP头部中的SYN和ACK标识位值均为1,确认序号为ack=x+1, 然后选定自己的初始序号seq=y(一般是随机的),确认消息发送后, B进 入SYN_RCVD状态,与连接消息一样,这条消息也不能携带数据,同时消耗一个序号。 3、A收到B的确认消息后,需要给B回复确认数据,这时TCP头部中的ACK标识位值为1, 确认序号是ack=y+1,自己的序号在连接请求的序号上加1,也就是seq=x+1, 此时A进入ESTABLISHED状态,当B收到A的确认回复后,B也进入ESTABLISHED状态, 至此TCP成功建立连接,A和B之间就可以通过这个连接互相发送数据了。 四次挥手: 初始状态:客户端A和服务器B之间已经建立了TCP连接,并且数据发送完成,打算断开连接, 此时客户端A和服务器B是等价的,双方都可以发送断开请求,下面以客户端A主动发起断开请求为例。(后续内 容用A,B简称代替) 1、A首先向B发送断开连接消息,这时TCP头部中的FIN标识位值为1,序号是seq=m,m为A前面正常发送数据最后一个字节序号加1得到的, 消息发送后A进入FNI_WAIT_1状态,FIN=1的报文段不能携带数据,但要消耗一个序号。 2、B收到A的断开连接请求需要发出确认消息,这时TCP头部中的ACK标识位值为1,确认号为 ack=m+1, 而自己的序号为seq=n,n为B前面正常发送数据最后一个字节序号加1得到的, 然后B进入 CLOSE_WAIT状态,此时就关闭了A到B的连接, A无法再给B发数据,但是B仍然可以给A发数据,同时B端通知上方应用层,处理完成后被动关闭连接。 然后A收到B的确认信息后,就进入了 FIN_WAIT_2状态。 3、B端应用层处理完数据后,通知关闭连接, B向A发送关闭连接的消息,这时TCP头部中的FIN和ACK标识位值均为1, 确认号ack=m+1,自己的序号为seq=k,消息发送后B进入LACK_ACK状态。 4、A收到B的断开连接的消息后,需要发送确认消息, 这是这时TCP头部中的ACK标识位值为1,确认号ack=k+1,序号为m+1(因为A向B发送断开连接的消息时消耗了一个消息号), 然后A进入TIME_WAIT 状态,若等待时间经过2MSL后,没有收到B的重传请求, 则表明B收到了自己的确认,A进入CLOSED状态, B收到A的确认消息后则直接进入CLOSED状态。至此TCP成功断开连接。 问题 Q3:谷歌的无头浏览器?可用的回答 : 无头浏览器即headless browser,是一种没有界面的浏览器。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面而已。 Python中selenium模块中的PhantomJS即为无界面浏览器(无头浏览器):是基于QtWebkit的无头浏览器。 问题 Q4:如何在Flask中访问会话?可用的回答 :会话基本上允许您记住从一个请求到另一个请求的信息。在一个Flask中,它使用签名cookie,以便用户可以查看会话内容并进行修改。如果只有密钥Flask.secret_key,则用户可以修改会话。问题 Q5:你对Django的认识?可用的回答 : Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。 Django内置的ORM跟框架内的其他模块耦合程度高。 应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利; 理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛胚房做全新的装修。 Django的卖点是超高的开发效率,其性能扩展有限;采用Django的项目,在流量达到一定规模后,都需要对其进行重构,才能满足性能的要求。 Django适用的是中小型的网站,或者是作为大型网站快速实现产品雏形的工具。 Django模板的设计哲学是彻底的将代码、样式分离; Django从根本上杜绝在模板中进行编码、处理数据的可能。 问题 Q6:数据库的优化?可用的回答 : 1. 优化索引、SQL 语句、分析慢查询; 2. 设计表的时候严格根据数据库的设计范式来设计数据库; 3. 使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO; 4. 优化硬件;采用SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等; 5. 采用MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率; 6. 垂直分表;把一些不经常读的数据放在一张表里,节约磁盘I/O; 7. 主从分离读写;采用主从复制把数据库的读操作和写入操作分离开来; 8. 分库分表分机器(数据量特别大),主要的的原理就是数据路由; 9. 选择合适的表引擎,参数上的优化; 10. 进行架构级别的缓存,静态化和分布式; 11. 不采用全文索引; 12. 采用更快的存储方式,例如

TCP使用3次握手协议来建立连接,设甲乙双方发送报文的初始序号分别为X和Y,甲方先发送(6)的报文给乙方,乙方接收报文后发送(7)的报文给甲方,然后甲方发送一个确认报文给乙方便建立连接(注:ACK的下标为捎带的序号)。

A.SYN=1,序号=X

B.SYN=1,序号=X+1,ACKX=1

C.SYN=1,序号=Y

D.SYN=1,序号=Y,ACKY+1=1


正确答案:A


TCP 协议在建立连接的过程中可能处于不同的状态,用 netstat 命令显示出 TCP 连接的状态为 SYN_SEND时,则这个连接正处于()。

A. 监听对方的建立连接请求
B. 已主动发出连接建立请求
C. 等待对方的连接释放请求
D. 收到对方的连接建立请求

答案:B
解析:
主机主动发出连接建立请求,状态变为syn-send


Windows中的Netstat命令显示有关协议的统计信息。当TCP连接处于SYN_SENT状态时,表示( )。

A. 已经发出了连接请求
B. 连接已经建立
C. 处于连接监听状态
D. 等待对方的释放连接响应

答案:A
解析:


TCP 协议使用三次握手机制建立连接,其中被请求方在第二次握手时需应答的关键信息及其作用是( ) 。

A.确认号是发起方设定的初始序号加1之后的数值,确认被请求者的身份
B.确认号是发起方设定的初始序号+1,确认发起方的身份
C.确认号是被请求者设定的初始序号+1,同步将要接收的数据流编号
D.确认号是被请求者设定的初始序号+1,确认发起方的身份

答案:A
解析:
TCP建立连接采用三次握手的机制,其过程如下图所示。

服务器应答的信息中,ack=x+l中的x是发起方设定的一个初始序号,应答方应答此序号表明应答者确实收到了发起方的信息,据此预防冒充者应答,因冒充者收不到发起方的报文,不知道x的值。


TCP会话通过3次握手来建立连接。其中第一次握手:源主机发送一个同步标志位SYN=( )的TCP数据段。源主机进入SYN_SENT状态。第二次握手:目标主机接收到SYN包后发回确认数据报文。该数据报文ACK=1。

A.0
B.1
C.2
D.3

答案:B
解析:
TCP会话通过三次握手来建立连接。三次握手的目标是使数据段的发送和接收同步,同时也向其他主机表明其一次可接收的数据量(窗口大小)并建立逻辑连接。这三次握手的过程可以简述如下:双方通信之前均处于CLOSED状态。(1)第一次握手源主机发送一个同步标志位SYN=1的TCP数据段。此段中同时标明初始序号(Initial Sequence Number,ISN)。ISN是一个随时间变化的随机值,即SYN=1,SEQ=x。源主机进入SYN-SENT状态。(2)第二次握手目标主机接收到SYN包后发回确认数据报文。该数据报文ACK=1,同时确认序号字段表明目标主机期待收到源主机下一个数据段的序号,即ACK=x+1(表明前一个数据段已收到且没有错误)。此外,在此段中设置SYN=1,并包含目标主机的段初始序号y,即ACK=1,确认序号ACK=x+1,SYN=1,自身序号SEQ=y。此时目标主机进入SYN-RCVD状态,源主机进入ESTABLISHED 状态。(3)第三次握手源主机再回送一个确认数据段,同样带有递增的发送序号和确认序号(ACK=1,确认序号ACK=y+1,自身序号SEQ),TCP会话的三次握手完成。接下来,源主机和目标主机可以互相收发数据。三次握手的过程如图 4所示。

更多 “广州市品高软件股份有限公司7月招聘面试题174道2020713” 相关考题
考题 单选题TCP协议的“三次握手”中,第一-次握手指的是什么?()A 客户端再次向服务器端发送确认信息,确认连接B 服务器端向客户端回送一.个响应,通知客户端收到了连接请求C 客户端向服务器端发出连接请求,等待服务器确认D 以上答案全部错误正确答案:B解析:暂无解析

考题 TCP会话通过( )次握手来建立连接。其中第一次握手:源主机发送一个同步标志位SYN=( )的TCP数据段。源主机进入( )状态。A.SYN-SENT B.SYN-RCVD C.ESTABLISHED D.CLOSE-WAIT 答案:A解析: TCP会话通过三次握手来建立连接。三次握手的目标是使数据段的发送和接收同步,同时也向其他主机表明其一次可接收的数据量(窗口大小)并建立逻辑连接。这三次握手的过程可以简述如下:双方通信之前均处于CLOSED状态。(1)第一次握手源主机发送一个同步标志位SYN=1的TCP数据段。此段中同时标明初始序号(Initial Sequence Number,ISN)。ISN是一个随时间变化的随机值,即SYN=1,SEQ=x。源主机进入SYN-SENT状态。(2)第二次握手目标主机接收到SYN包后发回确认数据报文。该数据报文ACK=1,同时确认序号字段表明目标主机期待收到源主机下一个数据段的序号,即ACK=x+1(表明前一个数据段已收到且没有错误)。此外,在此段中设置SYN=1,并包含目标主机的段初始序号y,即ACK=1,确认序号ACK=x+1,SYN=1,自身序号SEQ=y。此时目标主机进入SYN-RCVD状态,源主机进入ESTABLISHED 状态。(3)第三次握手源主机再回送一个确认数据段,同样带有递增的发送序号和确认序号(ACK=1,确认序号ACK=y+1,自身序号SEQ),TCP会话的三次握手完成。接下来,源主机和目标主机可以互相收发数据。三次握手的过程如图 4所示。

考题 以下哪个事件发生于传输层三次握手期间()。A、两个应用程序交换数据。B、TCP初始化会话的序列号。C、UDP确定要发送的最大字节数。D、服务器确认从客户端接收的数据字节数。正确答案:B

考题 TCP会话通过( )次握手来建立连接。其中第一次握手:源主机发送一个同步标志位SYN=(本题)的TCP数据段。源主机进入( )状态。A.0 B.1 C.2 D.3 答案:B解析: TCP会话通过三次握手来建立连接。三次握手的目标是使数据段的发送和接收同步,同时也向其他主机表明其一次可接收的数据量(窗口大小)并建立逻辑连接。这三次握手的过程可以简述如下:双方通信之前均处于CLOSED状态。(1)第一次握手源主机发送一个同步标志位SYN=1的TCP数据段。此段中同时标明初始序号(Initial Sequence Number,ISN)。ISN是一个随时间变化的随机值,即SYN=1,SEQ=x。源主机进入SYN-SENT状态。(2)第二次握手目标主机接收到SYN包后发回确认数据报文。该数据报文ACK=1,同时确认序号字段表明目标主机期待收到源主机下一个数据段的序号,即ACK=x+1(表明前一个数据段已收到且没有错误)。此外,在此段中设置SYN=1,并包含目标主机的段初始序号y,即ACK=1,确认序号ACK=x+1,SYN=1,自身序号SEQ=y。此时目标主机进入SYN-RCVD状态,源主机进入ESTABLISHED 状态。(3)第三次握手源主机再回送一个确认数据段,同样带有递增的发送序号和确认序号(ACK=1,确认序号ACK=y+1,自身序号SEQ),TCP会话的三次握手完成。接下来,源主机和目标主机可以互相收发数据。三次握手的过程如图 4所示。

考题 单选题通过在传输层使用UDP与服务器建立通信时,客户端将执行哪个操作?()A 客户端将设置会话的窗口大小。B 客户端将发送ISN到服务器以开始三次握手。C 客户端将随机选择源端口号。D 客户端将发送同步数据段以开始会话。正确答案:A解析:暂无解析

考题 TCP会话通过三次握手来建立连接。其中第一次握手:源主机发送一个同步标志位SYN=1的TCP数据段。源主机进入SYN-SENT 状态。第二次握手:目标主机接收到SYN包后发回确认数据报文。该数据报文ACK=1。此时目标主机进入( )状态。A.SYN-SENT B.SYN-RCVD C.ESTABLISHED D.CLOSE-WAIT 答案:B解析: TCP会话通过三次握手来建立连接。三次握手的目标是使数据段的发送和接收同步,同时也向其他主机表明其一次可接收的数据量(窗口大小)并建立逻辑连接。这三次握手的过程可以简述如下:双方通信之前均处于CLOSED状态。(1)第一次握手源主机发送一个同步标志位SYN=1的TCP数据段。此段中同时标明初始序号(Initial Sequence Number,ISN)。ISN是一个随时间变化的随机值,即SYN=1,SEQ=x。源主机进入SYN-SENT状态。(2)第二次握手目标主机接收到SYN包后发回确认数据报文。该数据报文ACK=1,同时确认序号字段表明目标主机期待收到源主机下一个数据段的序号,即ACK=x+1(表明前一个数据段已收到且没有错误)。此外,在此段中设置SYN=1,并包含目标主机的段初始序号y,即ACK=1,确认序号ACK=x+1,SYN=1,自身序号SEQ=y。此时目标主机进入SYN-RCVD状态,源主机进入ESTABLISHED 状态。(3)第三次握手源主机再回送一个确认数据段,同样带有递增的发送序号和确认序号(ACK=1,确认序号ACK=y+1,自身序号SEQ),TCP会话的三次握手完成。接下来,源主机和目标主机可以互相收发数据。三次握手的过程如图 4所示。

考题 以下关于TCP连接“三次握手”过程的描述中,错误的是()A、客户进程发送“连接建立请求报文”不携带数据,需要给报文一个序号seqB、“连接建立请求报文”的序号seq值x是随机产生的,可以为0C、服务器进程同意建立连接,则发送SYN=1、ACK=1的“连接建立请求确认报文”D、客户进程用“连接建立请求确认报文”来确认TCP连接建立正确答案:B

考题 TCP协议的“三次握手”中,第一-次握手指的是什么?()A、客户端再次向服务器端发送确认信息,确认连接B、服务器端向客户端回送一.个响应,通知客户端收到了连接请求C、客户端向服务器端发出连接请求,等待服务器确认D、以上答案全部错误正确答案:C

考题 TCP协议三次握手中的第一步是()A、客户端向服务器主动发送SYN建立连接B、服务器根据客户端SYN回复一个SYN/ACKC、客户端发送ACK确认来自服务器的SYN/ACKD、客户端向服务器主动发送带有FIN标识的数据包正确答案:A

考题 建立Sochet类的服务器端需要哪些步骤?()A、服务器端对任意指定的IP地址和端口号进行监听B、监听端口,等待客户端的连接C、建立一个服务器端对象,提供监听的端口号D、当获得其它客户端的连接后,停止监听,创建一个Socket类,用于通讯E、服务器端在此端口继续进行监听正确答案:B,E