CodeWarning

1.有时需要对key的方式取值(key-value),类似于map,但是key的顺序要保存,

对key排序,std::vector,或者数组,数组容易出错但是在声明时,把需要的key都写好,方便一点, 然后加一个map,遍历数组,存放value, 遍历的时候数组的大小,尽量用规范。

2.mfc中发送消息id,尽量使用在同一处声明的宏定义。保证消息的准确性,还有保证自定义的消息和已有的消息不重复。如果在别的消息中触发到此消息事件,极有可能自己定义的消息id和那个消息id重复了、

3.上传文件时,最好限制大小,还有判断文件是否存在。

4.跨进程的时候,最好自己写一个进程的管理类,大概有以下功能,获取这个进程的信息(句柄),什么时候启动,什么时候关闭。保证单实例启动,然后在此类生命周期结束时,结束此进程。

 

转载于:https://my.oschina.net/u/2334725/blog/825379

<think>好的,我现在要解决用户的两个问题:一是理解为什么在特定条件下`icsk_retransmits`会被置0,二是解决编译时出现的`ISO C90 forbids mixed declarations and code`警告。首先,我需要回顾之前关于`icsk_retransmits`的讨论,并结合用户提供的引用内容来回答。 关于`icsk_retransmits`清零的问题,用户之前已经得到详细的解释,但可能还存在疑问。我需要确认之前的回答是否涵盖了用户提到的`FLAG_SND_UNA_ADVANCED`标志的作用,以及新确认的数据如何影响重传计数。需要确保回答中明确说明当接收到新的ACK确认数据时,`icsk_retransmits`被重置的逻辑,以及这与网络恢复和拥塞控制的关系。同时,引用用户提供的资料,比如内核编码规范与普通C语言的不同,可能需要关联到代码结构的问题,但这里用户的问题更侧重于TCP协议栈的逻辑,因此需要明确区分。 然后是解决`ISO C90 forbids mixed declarations and code`的警告。根据用户提供的引用内容,这个错误是由于在代码中混合了变量声明和执行语句,而C90标准要求变量声明必须在作用域的开头。用户提供的引用中提到了内核代码的编写规则与其他C语言实践不同,这可能意味着在内核开发中更严格地遵循C90标准。解决方案是将所有变量声明集中在函数或作用域的起始位置,避免在代码中间声明变量。需要详细说明如何调整代码结构,可能给出示例代码,如用户提供的错误和正确做法,帮助用户理解如何修改。 另外,用户提到的第二个引用中关于错误使用memset初始化结构体指针的问题,虽然与当前问题无直接关联,但可能需要提醒用户在解决警告时注意其他潜在错误,比如正确使用sizeof操作符来初始化结构体,避免仅初始化指针本身的大小。 用户的问题可能是在进行内核模块开发或修改TCP协议栈相关代码时遇到的,因此需要强调内核编码规范的特殊性,尤其是在变量声明和内存初始化方面的严格要求。需要确认用户是否在开发内核模块,如果是,可能需要更详细地解释内核编码规范与普通应用程序的不同之处,以及如何遵循这些规范以避免编译错误。 最后,要确保回答结构清晰,分点解答每个问题,结合用户提供的引用内容,引用标记正确,并生成相关问题。同时,注意使用中文,保持口语化,避免使用Markdown格式,符合用户的要求。</think>### **问题 1: 为什么在特定条件下 `icsk_retransmits` 会被置 0?** 在 Linux TCP 协议栈中,`icsk_retransmits` 表示**连续重传次数**。其清零逻辑与网络状态恢复和拥塞控制直接相关: 1. **新数据确认触发网络恢复信号** 当 `after(ack, prior_snd_una)` 为真时(即收到的 ACK 确认了新的数据段),表明网络可能从丢包中恢复。此时: - **退出拥塞恢复状态**:若处于 `TCP_CA_Recovery`(拥塞恢复)或 `TCP_CA_CWR`(拥塞窗口缩减)状态,清零计数器以允许拥塞窗口重新增长[^1]。 - **避免过度重传**:连续重传的累积会被中断,防止因历史丢包干扰当前决策(例如,新 ACK 可能意味着网络路径已部分恢复)[^3]。 2. **乐观响应网络正向反馈** - 即使仍有未确认的重传数据,新 ACK 的到达被视为**部分成功**,清零 `icsk_retransmits` 以优先响应正向信号。后续丢包会重新触发重传并递增计数器(如快速重传或超时重传)[^3]。 3. **与 `FLAG_SND_UNA_ADVANCED` 的协同** - `FLAG_SND_UNA_ADVANCED` 标记 `snd_una`(发送未确认指针)的推进,触发拥塞窗口调整和队列清理。此时 `icsk_retransmits` 的清零与拥塞状态机同步,确保窗口增长不受旧重传计数影响[^1][^5]。 --- ### **问题 2: 如何解决 `ISO C90 forbids mixed declarations and code` 警告?** 此警告源于 **C90 标准禁止在代码中混合变量声明与执行语句**。解决方案如下: #### **1. 调整变量声明位置** C90 要求所有变量声明必须在作用域(如函数、代码块)的**起始位置**,不能与执行语句交替出现。 **错误示例:** ```c void func() { int a = 1; printf("%d\n", a); int b = 2; // 错误:声明在代码后 } ``` **正确做法:** ```c void func() { int a = 1; int b = 2; // 所有声明在作用域开头 printf("%d\n", a); } ``` #### **2. 内核编码规范的特殊性** Linux 内核代码强制遵循 C90 标准,而用户态程序可能允许更宽松的 C99(支持混合声明)。因此在内核开发中需严格遵守: - **变量集中声明**:在函数开头定义所有变量。 - **避免动态声明**:如 `for (int i=0; ...)` 在 C90 中非法,需改为: ```c int i; for (i=0; ...) ``` #### **3. 其他潜在问题** 用户提供的引用中还提到 **`memset` 误用问题**(如错误初始化结构体指针): - **错误示例**: ```c struct info *p = malloc(sizeof(struct info)); memset(p, 0, sizeof(p)); // 错误:sizeof(p) 是指针大小(8字节) ``` - **正确做法**: ```c memset(p, 0, sizeof(struct info)); // 初始化整个结构体 ``` --- ### **总结** | 问题类型 | 关键解决策略 | |---------------------------|-------------------------------------------------| | `icsk_retransmits` 清零 | 响应新 ACK 确认,退出拥塞恢复状态,避免过度重传 | | C90 编译警告 | 变量声明集中在作用域开头,遵循内核编码规范 | --- ### 相关问题 1. **C90 和 C99 在变量声明规则上有哪些其他差异?** 2. **Linux 内核为何坚持使用 C90 标准?** 3. **`tp->retrans_out` 和 `icsk_retransmits` 在 TCP 重传中分别记录什么?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值