免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3699 | 回复: 12
打印 上一主题 下一主题

[C] 新手, 在线等. 为什么TCP发包不完整? [复制链接]

论坛徽章:
1
2015亚冠之大阪钢巴
日期:2015-07-02 09:26:01
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-29 17:26 |只看该作者 |倒序浏览

int len = 12807;
if(web_send(peerfd, sbuf, len) == -1)
{
        fprintf(fs, "Web_send error in ordertype_1105_func\n");
        exit(1);
}

static int web_send(int fd, const unsigned char *ptr, size_t nbytes)
{
        int n;

        while (nbytes > 0)
        {
                n = send(fd, (char*)ptr, nbytes, 0);
                if (n == -1)
                {
                        return -1;
                }
                ptr += n;
                nbytes -= n;
        }           
        return 0;
}

以上用套接字发送12807字节的包, 但是用wiresshark查看发的并不全.
一次:107        0.050341000        192.168.249.20        192.168.249.1        TCP        1514        8002→64130 [PSH, ACK] Seq=10221 Ack=14 Win=5888 Len=1460
两次:109        0.051341000        192.168.249.20        192.168.249.1        TCP        1181        8002→64130 [PSH, ACK] Seq=11681 Ack=14 Win=5888 Len=1127

然后就没有了.

大家帮看看是怎么回事. thx

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
2 [报告]
发表于 2015-05-29 18:01 |只看该作者
本帖最后由 egmkang 于 2015-05-29 18:03 编辑

static int web_send(int fd, const unsigned char *ptr, size_t nbytes)
{
        int n;

        while (nbytes > 0)
        {
                n = send(fd, (char*)ptr, nbytes, 0);
                if (n == -1 && errno == EAGAIN) continue;
                else return -1;

                ptr += n;
                nbytes -= n;
        }           
        return 0;
}
你这个代码不对吧,比如你现在要发12K的东西,滑动窗口就8K,满了,那么无论怎么send都send不出去,返回永远是-1,你还得检测一下errno,看看errno是不是EAGAIN,如果是的话,继续循环发

论坛徽章:
1
2015亚冠之大阪钢巴
日期:2015-07-02 09:26:01
3 [报告]
发表于 2015-05-29 18:17 |只看该作者
回复 2# egmkang

我可以设置这个窗口值,  但即使我现在没设置, 我抓包他已经push了2次数据了,  就是push的不完整.

另外, 我client和serve的系统时间不一致, 这个没影响吧?


   

论坛徽章:
1
2015亚冠之大阪钢巴
日期:2015-07-02 09:26:01
4 [报告]
发表于 2015-05-29 18:21 |只看该作者
另外, 我GDB跟了程序 send函数返回的值就是12807.  回复 2# egmkang


   

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
5 [报告]
发表于 2015-05-29 21:12 |只看该作者
qq493288977 发表于 2015-05-29 17:26
int len = 12807;
if(web_send(peerfd, sbuf, len) == -1)
{

没有为什么,就是不完整,你自己想办法解决。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2015-05-29 21:56 |只看该作者
你得明白TCP是个流,不是UDP

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
7 [报告]
发表于 2015-05-29 23:00 |只看该作者
如果服务端已经send成功了,那么只要客户端不停的recv,总归能收完

论坛徽章:
0
8 [报告]
发表于 2015-05-30 19:51 |只看该作者
wiresshark 应该有分片的

MSS, 每个包的大小不会超过他的

论坛徽章:
0
9 [报告]
发表于 2015-05-30 19:54 |只看该作者
mtu  ,上面说错了 是 mtu 不是 mss

论坛徽章:
1
2015亚冠之大阪钢巴
日期:2015-07-02 09:26:01
10 [报告]
发表于 2015-06-01 18:20 |只看该作者
谢谢,大家 已经解决了,  是我关闭套接字太早了, RST导致数据丢失了, 包传输没问题.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP