|
|
|
|
移动端

3.4 网络编程

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍网络编程。

作者:猿媛之家来源:机械工业出版社|2017-12-07 11:25

开发者盛宴来袭!7月28日51CTO首届开发者大赛决赛带来技术创新分享

3.4 网络编程

【真题 338】 winsock建立连接的主要步骤是什么?

答案:1)服务器端: socket()建立套接字,绑定( bind)并监听(listen),用 accept()等待客户端连接。

2)客户端:socket()建立套接字,连接( connect)服务器,连接上后使用函数 recv()和函数 send(),在套接字上读写数据,直至数据交换完毕, closesocket()关闭套接字。

3)服务器端: accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。新产生

的套接字使用函数 recv()和函数 send()读写数据,直至数据交换完毕, closesocket()关闭套接字。

【真题 339】下列关于网络编程的描述中,错误的是()。

A.TCP建立和关闭连接都只需要三次握手

B.UDP是可靠服务

C.主动关闭的一端会出现 TIME_WAIT状态

D.服务端编程会调用 listen(),客户端也可以调用 bind() 答案:A、B。对于选项 A,TCP的关闭连接需要四次握手,而不是三次。所以,选项 A描述错误。对于选项 A,UDP提供的是面向无连接的不可靠服务。所以,选项 B描述错误。对于选项 C,TCP主动关闭连接导致 TIME_WAIT状态。所以,选项 C描述正确。对于选项 D,服务器和客户端都可以调用 bind()方法, bind()方法并不是服务器的专利,但一般情况

下客户端是不用调用 bind()方法的,一切都交给内核处理。所以,选项 D描述正确。

【真题 340】 Linux中调用 write发送网络数据返回 n(n > 0)表示()。

A.对端已收到 n个字节 B.本地已发送 n个字节

C.系统网络 buff已收到 n个字节 D.系统调用失败答案:B。函数 write 的原型为 ssize_t write(int fd,const void *buf,size_t nbytes) ,它的作用是将 buf中的 nbytes

个字节内容写入文件描述符 fd,当 write的返回值大于 0时,表示写了部分或者是全部的数据,成功时返回写的字节数,当返回值小于 0时,表示此时出现了错误。所以,选项 B正确。

【真题 341】如果在一个建立了 TCP连接的 socket上调用 recv函数,返回值为 0,则表示()。

A.还没有收到对端数据 B.连接发生错误

C.对端关闭了连接 D.对端发送了一段长度为 0的数据答案:C。 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的和基于字节流的传

输层通信协议,由 IETF的 RFC 793定义。它本身是可靠的,并不等于应用程序使用 TCP发送数据就一定是可靠的。

在阻塞模式下, send函数的过程是将应用程序请求发送的数据复制到发送缓存中发送,并得到确认后再返回,但由于发送缓存的存在,如果发送缓存大小比请求发送的大小要大,那么 send函数立即返回,同时向网络中发送数据;否则, send函数向网络发送缓存中不能容纳的那部分数据,并等待接收端确认后再返回(接收端只要将数据收到接收缓存中,就会确认,并不一定要等待应用程序调用 recv函数)。

在非阻塞模式下, send函数的过程仅仅是将数据复制到协议栈的缓存区而已,如果缓存区可用空间不够,则尽量复制,返回成功复制的大小;如果缓存区可用空间为 0,则返回-1,同时设置 errno的值为 EAGAIN。如果 recv函数在等待协议接收数据时网络中断了,那么它返回 0。

默认情况下,socket 是阻塞的。阻塞与非阻塞 recv函数的返回值没有区分,返回值小于 0表示出错,返回值等于 0表示连接关闭,返回值大于 0表示接收到数据大小。为了更好地说明该过程,以下将对 socket中的 send函数和 recv函数进行详细讲解。

(1)send函数

send 函数的原型为 int send( SOCKET s, const char FAR *buf, int len, int flags )。函数的第一个参数指定发送端套接字描述符,第二个参数指明一个存放应用程序要发送数据的缓冲区,第三个参数指明实际

要发送的数据的字节数,第四个参数一般置 0。

无论是客户端应用程序还是服务器应用程序,它们都使用 send函数来向 TCP连接的另一端发送数据。区别仅在于客户端应用程序使用 send函数向服务器发送请求,而服务器则用 send函数来向客户程序发送应答。

以下是同步 socket的 send函数的执行流程。当调用该函数时,具体步骤如下:

1)send函数先比较待发送数据的长度 len和套接字 s的发送缓冲的长度,如果 len大于 s的发送缓冲区的长度,该函数返回 SOCKET_ERROR。

2)如果

len小于或者等于 s的发送缓冲区的长度,那么 send函数首先检查协议是否正在发送套接字 s的发送缓冲中的数据,如果是,就等待协议把数据发送完,如果协议还没有开始发送套接字 s的发送缓冲中的数据或者套接字 s的发送缓冲中没有数据,那么 send函数就比较套接字 s的发送缓冲区的剩余空间和 len的大小。

3)如果发送数据的长度 len大于剩余空间大小,那么 send函数就一直等待协议把套接字 s的发送缓冲中的数据发送完。

4)如果发送数据的长度 len小于剩余空间大小,那么 send函数就仅仅把缓冲区 buf中的数据复制到剩余空间里(注意,并不是 send函数把套接字 s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send函数仅仅是把缓冲区 buf中的数据复制到套接字 s的发送缓冲区 buf的剩余空间里)。

如果 send函数复制数据成功,那么 send函数就返回实际复制的字节数,如果 send函数在复制数据时出现错误,那么 send函数就返回 SOCKET_ERROR;如果 send函数在等待协议传送数据时网络断开,那么 send函数也返回 SOCKET_ERROR。

需要注意的是,当 send函数把缓冲区 buf中的数据成功复制到套接字 s的发送缓冲的剩余空间里后,它就返回了,但是此时这些数据并不一定马上被传到接收端。如果协议在后续的传送过程中出现网络错误的话,那么下一个 socket函数就会返回 SOCKET_ERROR。(每一个除 send函数外的 socket函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该 socket函数就返回 SOCKET_ERROR)

注意:在 Unix系统下,如果 send函数在等待协议传送数据时网络断开,调用 send函数的进程会接收到一个 SIGPIPE信号,进程对该信号的默认处理是进程终止。通过测试发现,异步 socket的 send函数在网络刚刚断开时还能发送返回相应的字节数,同时使用 select检测也是可写的,但是过几秒钟之后,再 send就会出错了,返回-1。select也不能检测出可写了。

(2) recv函数

recv函数的原型为 int recv( SOCKET s, char FAR *buf, int len, int flags),该函数的第一个参数指定接收端套接字描述符,第二个参数指明一个缓冲区,该缓冲区用来存放 recv函数接收到的数据,第三个参数指明 buf的长度,第四个参数一般置 0。

无论是客户端应用程序还是服务器应用程序,都使用 recv函数从 TCP连接的另一端接收数据。以下只描述同步 socket的 recv函数的执行流程。当应用程序调用 recv函数时,会执行以下步骤:

1)recv函数先等待 s的发送缓冲中的数据被协议传送完毕,如果协议在传送 s的发送缓冲中的数据时出现网络错误,那么 recv函数返回 SOCKET_ERROR。

2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后, recv函数先检查套接字 s的接收缓冲区,如果 s接收缓冲区中没有数据或者协议正在接收数据,那么 recv函数就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕, recv函数就把 s的接收缓冲中的数据复制到 buf中(注意协议接收到的数据可能大于 buf的长度,所以,在这种情况下,要调用几次 recv函数才能把 s的接收缓冲中的数据复制完。 recv函数仅仅是复制数据,真正的接收数据是协议来完成的)。

事实上,recv函数返回其实际复制的字节数。如果 recv函数在复制时出错,那么它返回 SOCKET_ ERROR;如果 recv函数在等待协议接收数据时网络中断了,那么它返回 0。注意:在 Unix系统下,如果 recv函数在等待协议接收数据时网络中断了,那么调用 recv函数的进

程就会接收到一个 SIGPIPE信号,进程对该信号的默认处理是进程终止。

所以,本题的答案为 C。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网管员必读-网络管理(第2版)

本书是对《网管员必读—网络管理》第1版的全面重写,因为书中所涉及的两个主要网络操作系统都已升级。本书介绍的是Windows Server 2003 R2...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊