嵌入式常见的面试题1
在嵌入式 Linux 应用层使用 TCP socket 发送数据时write()/send()返回成功是否意味着数据已送达对端如何确保对端应用层确实收到了数据考察点TCP 协议栈缓冲区机制、可靠传输的误解、应用层确认协议。参考答案write()成功仅表示数据已从用户空间拷贝到内核 TCP 发送缓冲区且缓冲区剩余空间足够容纳此次写入。它绝不代表数据已发出网卡。数据已被对端 ACK。对端应用已调用read()取走数据。确保应用层收到的方法应用层 ACK 协议接收方在成功处理完业务数据后主动发回一个确认消息例如自定义的 ACK 包。发送方必须等待此 ACK 才能认为传输完成。结合shutdown()与SO_LINGER在关闭连接前调用shutdown(sockfd, SHUT_WR)发送 FIN并配合setsockopt(..., SO_LINGER, ...)设置超时确保对端关闭了连接暗示其应用已close()但这仍不等同于业务处理完成。心跳与超时重传对于需要高可靠性的场景如工业控制设计请求-响应模式发送方带序列号接收方按序确认超时未收到 ACK 则重传。在一个裸机嵌入式设备上如何实现一个简单有效的 TCP 粘包/拆包处理逻辑考察点TCP 流式传输特性理解、嵌入式协议栈内存管理。参考答案原因TCP 是流协议没有消息边界多次发送的小包可能合并到一个 TCP 段中粘包或一个长包被 IP 分片、TCP 分段。常用解决策略裸机环境定长消息规定每个数据包固定长度如 128 字节不足补零。解析时从流中逐个切分。缺点浪费带宽。分隔符协议在消息末尾添加特殊字节如\r\n或0x00。接收方在 lwIP 的recv回调中遍历缓冲区寻找分隔符。注意裸机环境下避免使用strstr等动态内存操作应直接基于环形缓冲区状态机扫描。头部定长 长度字段最常见定义包头结构如下textstruct pkt_hdr { uint16_t magic; // 可选帧头校验 uint16_t len; // 后续负载长度 };接收处理逻辑状态机初始为WAIT_HEADER累积到头部长度后解析len转入WAIT_PAYLOAD。累积到len字节后校验通过则交给应用处理指针回退并重新进入WAIT_HEADER。lwIP 特有注意tcp_recv回调可能一次收到多个 TCP 段必须循环调用pbuf_copy_partial()或直接遍历pbuf链表将数据拷入内部环形缓冲区再触发状态机解析避免在回调中长时间阻塞导致协议栈丢包。嵌入式设备通过 4G 模块联网使用 MQTT 协议与云端通信。若设备发送一个 PUBLISH 报文QoS1后在未收到 PUBACK 之前网络断开了重连后应如何处理未确认的消息考察点MQTT 协议状态机、会话保持机制。参考答案关键依赖CONNECT报文中的Clean Session标志。若Clean Session 0持久会话服务端会为客户端保存未确认的 QoS 1/2 消息。客户端重连时只要使用相同的Client ID服务端会在CONNACK中返回Session Present 1。随后服务端会立即重发之前未确认的 PUBLISH 报文给客户端客户端应能按原Packet ID处理并响应 PUBACK。若Clean Session 1大多数物联网低功耗设备的默认选择会话状态不保留服务端在连接断开后丢弃所有未确认消息。客户端必须自行负责重传机制在应用层实现本地存储队列如 SPI Flash 或文件系统。每条 PUBLISH 消息在收到 PUBACK 前保留在队列中标记为“未确认”。网络恢复并重连 MQTT 后遍历队列中所有“未确认”消息按顺序重新 PUBLISH使用新的Packet ID。在 Linux 系统中编写一个基于 UDP 的客户端程序如何检测到对端服务已经崩溃对端主机未关闭 socket而是整机掉电考察点UDP 无连接特性与异常检测的工程方法。参考答案UDP 原生缺陷UDP 没有连接状态sendto()通常成功只要 ARP 表有记录不会因对端崩溃而报错。检测策略ICMP 错误报文监听被动方式若对端主机崩溃当本机继续发送 UDP 数据时若路径上的路由器或最终主机ARP 失败返回ICMP Port Unreachable或ICMP Host Unreachable这些错误会被内核记录在 socket 的错误队列中。应用层可通过recvmsg()配合MSG_ERRQUEUE标志获取挂起的错误从而得知目的不可达。缺点如果停止发送数据将永远得不到通知。应用层心跳协议主动方式客户端定期发送“心跳请求”UDP 包对端必须回复“心跳应答”。若连续 N 次心跳未收到应答判定对端失联。这是工程上最可靠的方法。SO_KEEPALIVE无效性TCP 的SO_KEEPALIVE选项对 UDP 无效不可混淆。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2505502.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!