c++面试题(网络通信篇)

●TCP和UDP的区别

UDP 与 TCP 的主要区别在于 UDP 不一定提供可靠的数据传输,它不能保证数据准确无误地到达,不过UDP在许多方面非常有效。当程序是要尽快地传输尽可能多的信息时,可以使用 UDP。TCP它是通过三次握手建立的连接,它在两个服务之间始终保持一个连接状态,目的就是为了提供可靠的数据传输。许多程序使用单独的TCP连接和单独的UDP连接,比如重要的状态信息用可靠的TCP连接发送,而主数据流通过UDP发送。

●TCP连接建立的时候3次握手的具体过程,以及其中的每一步是为什么

因为TCP是一个双向通讯协议,所以要三次握手才能建立:

第一次握手是客户端向服务端发送连接请求包(SYN=J),服务端接收到之后会给客户端发个确认标志(也就是两个包,一个是确认包ACK=J+1,另一个是连接询问请求包SYN=K),这是第二次握手。第三次握手就是客户端会再次给服务端发送消息确认标志ACK=K+1,表示能正常接收可以开始通信。第三次握手的目的是为了防止已经失效的连接请求突然又传送到了服务端,因为网络中有可能存在延迟的问题,如果采用二次握手就会让服务端误认为client是再次发出新的连接请求,然后server一直等待client发来数据,这样就浪费了很多资源。这三次握手是在connect,bind,listen和accept函数中完成的,这几个函数创建了比较可靠的连接通道。其实断开连接的四次握手是跟连接的时候一样的,唯一多了一步就是因为双方都处在连接的时候,而且有可能在传输数据,在服务端接收到客户端的关闭连接请求后它会给客户端确认,但是由于数据还没有传送完毕,此时会进入一个TIME_WAIT状态,所以在数据传送好之后会再次给客户端发消息,这就是多出来的那一步。

●TCP报文的格式,字段的意义

TCP报文段分为首部和数据两部分,首部的前20个字节是固定的,有源端口和目的端口,序号,确认序号,数据偏移,确认ACK,推送复位同步等等。

●TCP协议如何来保证传输的可靠性

第一个是它将数据截断为合理的长度,这一点和UDP完全不同。第二个是超时重发和检验机制,还有对于收到的请求它会给出确认响应。最后它还可以进行流量控制,防止较慢主机的缓冲区溢出。

●TIME_WAIT状态

当有一方接收到另一方的关闭请求并给出确认时,就会进入TIME_WAIT状态。

存在原因:

(1)为了实现TCP全双工连接的可靠释放

(2)为了使一些旧的数据包在网络中因过期而消失

●CAsyncSocket的运作流程

CAsyncSocket是一个异步非阻塞通信机制,可以随时发包,也可以随时收包,但是不能保障发送和接收的完成,可以调用GetLastError来判断是哪个错误代码,

连接建立的同时,OnSend就被第一次触发了,主动调用send来发送数据也会触发OnSend函数,由于发送数据有可能不能一次完成,它要干的事情就是根据任务和发送进度调用Send继续发,这个跟接收流程逻辑不同,你永远不需要主动调用Recieve,你只应该在OnRecieve中等待。每次OnRecieve被触发,然后被动调用一次Recieve来接受固定长度的数据,连接可能因为各种原因中断,所以你需要判断m_hSocket是否是连接状态进行自动重连。

CAsyncSocket与CSocket的区别

CSocket是从CAsyncSocket派生而来,它提供了更高层的WinSockAPI接口,,CSocket对象提供阻塞模式,如果需要低层控制和高效率就使用CAsyncSock,如果想要方便的话就使用CSocket类。

●socket阻塞与非阻塞,同步与异步

同步/异步主要是针对client端

同步:就是在client端发出一个功能调用时,在没有得到结果之前,该调用就不返回。

异步:与同步相对,当client端调用发出后,会立即返回,但调用者不能立刻得到结果,而是由其它通知或回调来通知调用者。

阻塞/非阻塞主要针对server端

阻塞调用是指调用结果返回之前,当前线程会被挂起,函数只有在得到结果之后才会返回。 非阻塞则会立刻返回。像Recv接口是阻塞的,RecvFrom非阻塞的。

有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

●HTTP请求

(1)http请求报文:由请求行,请求头,请求数据三部分组成。

请求行包括请求方法、URL和HTTP协议版本。请求方法有GET,POST,HEAD等等。

GET:当客户端要从服务端读取数据时用GET,使用GET方法时,请求参数和对应的值 附加在URL后面,利用一个问号(?)代表URL的结尾和请求参数的开始,传递参数长度受限制,例:/index.jsp?id=100&op=bind

POST:是向服务器提交数据,POST方法请求参数封装在HTTP请求数据中,可以传输大量数据,可用来传送文件。

请求头:由关键字/值对组成,每行一对,关键字和值用冒号隔开,请求头是通知服务端有关于客户端请求的信息。如Host:请求的主机名

请求数据:用于POST方法中。

(2)Get和Post请求的区别

Get是向服务器索取数据的一种请求,而Post是向服务器提交数据的一种请求。Get请求的参数会跟在url后进行传递,它对传输的数据有大小限制。POST请求的数据会放置在HTML Header内提交。Post比Get安全,当数据是中文或者不敏感的数据,则用get,因为使用get,参数会显示在地址上,对于敏感数据和不是中文字符的数据则用POST。

(3)如何查看GET/POST请求是否发送成功

借助抓包工具,由返回的结果得出是否请求成功。如HttpAnalyzerstdv7。

(4)HTTP状态码:表示网页服务器HTTP响应状态的3位数字代码。一般状态码的第一个数字代表了响应的五种状态。

比如2XX开头的代表成功,像200代表请求已成功,表示正常状态。202代表服务器已接受请求,但尚未处理。

3XX代表重定向,需要客户端采取进一步操作才能完成请求。

4XX代表请求错误,401请求身份验证,403表示拒绝执行,404表示请求失败。

5开头代表服务器错误。

(5)cookie和Session的区别:cookie是客户端保持状态的机制,明文的,可以被篡改,大小有限制,session保存在服务器上,加密的,可以对应无限大的数据。

  • 5
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当谈到C++面试题中的网络编程,以下是一些常见的问题和答案: 1. 什么是套接字(Socket)? 套接字是一种用于网络通信的编程接口,它提供了一种机制,使得不同主机上的进程可以通过互联网进行通信。 2. TCP和UDP的区别是什么? TCP(传输控制协议)是一种面向连接的协议,它提供可靠的数据传输和流控制。UDP(用户数据报协议)是一种无连接的协议,它提供了一种简单的、无保证的数据传输方式。 3. 如何在C++中创建一个TCP套接字? 在C++中,可以使用socket()函数创建一个TCP套接字。例如: ``` #include <sys/socket.h> int sockfd = socket(AF_INET, SOCK_STREAM, 0); ``` 4. 如何在C++中创建一个UDP套接字? 在C++中,可以使用socket()函数创建一个UDP套接字。例如: ``` #include <sys/socket.h> int sockfd = socket(AF_INET, SOCK_DGRAM, 0); ``` 5. 如何将套接字绑定到特定的IP地址和端口? 可以使用bind()函数将套接字绑定到特定的IP地址和端口。例如: ``` #include <sys/socket.h> #include <netinet/in.h> struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(1234); bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)); ``` 6. 如何在C++中使用套接字进行TCP客户端编程? 可以使用connect()函数连接到服务器,并使用send()和recv()函数发送和接收数据。例如: ``` #include <sys/socket.h> #include <netinet/in.h> int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(1234); serverAddr.sin_addr.s_addr = inet_addr("服务器IP地址"); connect(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)); ``` 这些是一些常见的C++网络编程面试问题。在面试前,建议你深入了解这些概念,并准备好相关的代码示例和解释。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值