什么时候去发送 update windos报文

/* Clean up the receive buffer for full frames taken by the user,
 * then send an ACK if necessary.  COPIED is the number of bytes
 * tcp_recvmsg has given to the user so far, it speeds up the
 * calculation of whether or not we must ACK for the sake of
 * a window update.
 */
static void tcp_cleanup_rbuf(struct sock *sk, int copied)
{
struct tcp_sock *tp = tcp_sk(sk);
bool time_to_ack = false;


struct sk_buff *skb = skb_peek(&sk->sk_receive_queue);


WARN(skb && !before(tp->copied_seq, TCP_SKB_CB(skb)->end_seq),
     "cleanup rbuf bug: copied %X seq %X rcvnxt %X\n",
     tp->copied_seq, TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt);


if (inet_csk_ack_scheduled(sk)) {
const struct inet_connection_sock *icsk = inet_csk(sk);
   /* Delayed ACKs frequently hit locked sockets during bulk
    * receive. */
if (icsk->icsk_ack.blocked ||
    /* Once-per-two-segments ACK was not sent by tcp_input.c */
    tp->rcv_nxt - tp->rcv_wup > icsk->icsk_ack.rcv_mss ||
    /*
     * If this read emptied read buffer, we send ACK, if
     * connection is not bidirectional, user drained
     * receive buffer and there was a small segment
     * in queue.
     */
    (copied > 0 &&
     ((icsk->icsk_ack.pending & ICSK_ACK_PUSHED2) ||
      ((icsk->icsk_ack.pending & ICSK_ACK_PUSHED) &&
       !icsk->icsk_ack.pingpong)) &&
      !atomic_read(&sk->sk_rmem_alloc)))
time_to_ack = true;
}


/* We send an ACK if we can now advertise a non-zero window
* which has been raised "significantly".
*
* Even if window raised up to infinity, do not send window open ACK
* in states, where we will not receive more. It is useless.
*/
if (copied > 0 && !time_to_ack && !(sk->sk_shutdown & RCV_SHUTDOWN)) {
__u32 rcv_window_now = tcp_receive_window(tp);


/* Optimize, __tcp_select_window() is not cheap. */
if (2*rcv_window_now <= tp->window_clamp) {
__u32 new_window = __tcp_select_window(sk);


/* Send ACK now, if this read freed lots of space
* in our buffer. Certainly, new_window is new window.
* We can advertise it now, if it is not less than current one.
* "Lots" means "at least twice" here.
*/
if (new_window && new_window >= 2 * rcv_window_now)
time_to_ack = true;
}
}
if (time_to_ack)
tcp_send_ack(sk);
}
### Typora 安装时提示电脑不支持 Windows 10 64位解决方法 在安装 Typora 时,如果系统提示“电脑不支持 Windows 10 64位”,可能是由于安装包版本不匹配、系统兼容性问题或注册表设置错误导致的。以下是解决此类问题的详细方法: 1. **确认下载的版本适配系统** 确保从 [Typora 官网](https://typora.io/) 下载的安装包是适用于 Windows 64 位系统版本。如果误下载了 32 位版本,可能会导致安装失败。建议重新下载正确的版本,并尝试安装。 2. **以管理员身份运行安装程序** 右键点击安装程序,选择“以管理员身份运行”,这可以避免因权限不足导致的安装失败问题。 3. **关闭杀毒软件或防火墙** 某些杀毒软件(如 Windows Defender、360 安全卫士等)可能会阻止 Typora 的正常安装。在安装前,建议临时关闭这些软件,安装完成后可重新开启。 4. **检查系统兼容性设置** 右键点击安装程序 → 选择“属性” → 在“兼容性”选项卡中,取消勾选“以管理员身份运行”以外的其他兼容性设置,确保安装程序与当前系统兼容。 5. **修改注册表以支持安装** 如果安装程序检测到系统环境不匹配,可以通过修改注册表绕过检测。 - 按 `Win + R` 打开运行窗口,输入 `regedit`,回车打开注册表编辑器。 - 定位到路径:`HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion`。 - 在右侧找到 `CurrentVersion` 和 `CurrentBuild`,确保它们的值与当前系统版本一致(例如 Windows 10 64 位的版本号为 10.0.xxxx)。如果不一致,可以尝试修改为匹配的值。 6. **手动替换 JS 文件以跳过激活提示(可选)** 如果安装成功但提示未激活或弹窗干扰,可以参考以下路径修改 JS 文件: 进入安装目录 `D:\Typora\resources\page-dist\static\js`,打开对应的 JS 文件,将 `e.hasActivated="true"==e.hasActivated` 替换为 `e.hasActivated="true"=="true"`。这样可以跳过激活检查。 7. **禁用激活提示弹窗** 修改 `D:\Typora\resources\page-dist` 目录下的 HTML 文件,在 `</body>` 标签后添加以下代码,以禁用激活提示弹窗: ```html <script>window.onload=function(){setTimeout(()=>{window.close();},5);}</script> ``` 这将使程序在启动时自动关闭激活提示窗口。 8. **修改语言文件以隐藏未激活提示** 进入 `D:\Typora\resources\locales\zh-Hans.lproj` 目录,找到 `"UNREGISTERED":"未激活"`,将其替换为 `"UNREGISTERED":""`,以隐藏未激活的提示信息。 通过以上方法,可以有效解决 Typora 在 Windows 10 64 位系统上安装时提示“电脑不支持”的问题。如果问题依旧存在,建议尝试在其他设备上安装,或联系官方技术支持获取帮助。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值