加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

答网友问——lwip的tcp接收窗口问题

(2012-12-02 17:03:37)
标签:

lwip

tcp

接收窗口为0

raw

api

分类: LwIP常见问题

前两天网友来信,又是同样的一个问题,这也是好多基于raw api做开发的朋友最容易忽略的一个问题,来信原文摘录(陈兄,侵犯您版权啦。。。):

五木您好!
很荣幸在网上看到您发表的一些关于lwip的文章,写的非常好。
我现在有个小问题想请教您一下,就是服务器发命令给我,然后我回复服务器,在回复的TCP首部中,窗口一直在减少,最初是2920个字节,最后减成0了,然后服务器就不跟我通讯了。后来我把下面红色语句部分改成pcb->rcv_ann_wnd = pcb->rcv_wnd,使得rcv_ann_wnd是一个定值,但这样rcv_ann_right_edge 会在不停地变大,这样要不要紧呀,麻烦您指点我一下,非常感谢。
u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)
{
u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {

pcb->rcv_ann_wnd = pcb->rcv_wnd;
return new_right_edge - pcb->rcv_ann_right_edge;
} else {
if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {

pcb->rcv_ann_wnd = 0;
} else {

pcb->rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;
}
return 0;
}
}
 
答: 你自己客户端的窗口为什么变成0了?你是使用raw API编程的吧,这里你需要自己调用tcp_recved函数更新本地接收窗口,不然协议栈一直以为接收的数据未被应用层接收,那当然只能向服务器通告0窗口了,服务器也没法往客户端发数据了。一般情况下,内核不会有问题,所以不建议去修改内核的代码。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有