关于tcp非阻塞发送

zjz800800 2012-06-01 02:44:31
关于非阻塞发送请教一下大家:

平台是windows xp
1.我测试了一下系统的接收和发送缓冲都是8192
2.我使用select下的tcp非阻塞发送
3.按照一些文章中的介绍,当发送数据大于缓冲(自己和对方)的话数据会阻塞在底层(有好几种情况,暂不叙述)

现在问题是:

比如我发送56M数据,第一次send时,返回值尽然也是56M

例:res = send(g_fd_ArrayC[nLoopi],pBuff,1024 * 1024 *56,0);

res返回值不是-1,是1024 * 1024 *56;为什么会这样?
...全文
319 点赞 收藏 21
写回复
21 条回复
zjz800800 2012年06月26日
测试的结果1024 * 1024 *56是正确的,问题已经解决,对大家回答不满意,不过感谢大家,给分先。
回复 点赞
zdcju 2012年06月21日
再说TCP是基于数据流的 不是像UDP那样基于数据包的
所以对TCP来说 你设置 1024 * 1024 *56 还是 1024 没区别
是TCP和底层协议 为你去计算每次发送 多大的数据 所以计算的结果肯定不是 1024 * 1024 *56。。。。。
回复 点赞
zdcju 2012年06月21日
感觉还是不太可能 1024 * 1024 *56 返回值 除非你是本地回来才有可能这个结果

应该是 发送的时候 1024 * 1024 *56 大的数据
应该是分成若干次 recv 加起来等于1024 * 1024 *56 才对
回复 点赞
zhouhangjay 2012年06月21日
强烈建议阅读TCP\ip协议,发送的时候,即使你发出去了,tcp/ip会将大的数据包分成小的片段,到达目的地后在组装起来,所以发送的数据会返回真实的大小,接受也会返回真实接受的数据大小
回复 点赞
zjz800800 2012年06月21日
大家回答不满意,我怎么结贴啊,不过既然大家来了,分总是要给的,再放几天结贴
回复 点赞
zjz800800 2012年06月13日
没有人知道怎么回事情吗?大牛们,快来
回复 点赞
success_happy_one 2012年06月07日
我也正在研究这个问题 大家多多讨论呀
回复 点赞
zjz800800 2012年06月04日
[Quote=引用 5 楼 的回复:]

引用 1 楼 的回复:

补充一下,发送的时候,接收方不接收的时候返回也是1024 * 1024 *56,而不是-1,为什么呢?

你在本地回路上测试的? 你用两台计算机测试 应该就不是这个结果了。。。。。。
[/Quote]


你好,我本地和局域网内两台机器都测过了,1024 * 1024 *56是成功的,但如果这个成功的话分配这么大的空间是谁给的,tcp协议栈吗?如果一个进程这么起上10个socket这么发送那岂不是数据量很大,另外成功应该就是阻塞在底层了,因为接收端不接收
回复 点赞
Eleven 2012年06月04日
协议会分~
回复 点赞
ouyh12345 2012年06月04日
localhost?
本机回路不经过网卡的
回复 点赞
zdcju 2012年06月04日
[Quote=引用 1 楼 的回复:]

补充一下,发送的时候,接收方不接收的时候返回也是1024 * 1024 *56,而不是-1,为什么呢?
[/Quote]
你在本地回路上测试的? 你用两台计算机测试 应该就不是这个结果了。。。。。。
回复 点赞
zdcju 2012年06月04日
下面的协议会帮你分析处理分包的。。。。。。。。。再说本来TCP就是基于流的 再大再小都是以数据流去对待 这和UDP不一样
回复 点赞
zdcju 2012年06月04日
太大了会分包 但分包发送又不是TCP层的功能 TCP只负责把数据交给传输层 应该是只要交了就成功了 具体怎么分包TCP一点都管不着 是下面协议的事
回复 点赞
glovel0425 2012年06月04日
错误返回-1,按照你说的 3.这个情况,返回的也不应该是-1吧。 而且是不是这些数据已经发出去了,至于会不会阻塞在底层,socket根本就不管,因为这些数据已经发送成功了。返回的就是实际发送的长度。仅供参考……
回复 点赞
百事烟 2012年06月04日
谁是管理员啊

该回复于2012-06-04 16:05:09被管理员删除
回复 点赞
zjz800800 2012年06月04日
我确实测试是这样的结果,第一次send 会成功,对端不接收,测试的时候最大到100M而128M中间的某个中间值才会返回-1,否则返回是发送的数据的大小,不知原因。
回复 点赞
zdcju 2012年06月04日
[Quote=引用 8 楼 的回复:]
你好,我本地和局域网内两台机器都测过了,1024 * 1024 *56是成功的,但如果这个成功的话分配这么大的空间是谁给的,tcp……
[/Quote]
如果你是两台机子测试 不可能返回1024 * 1024 *56。。。。。。。。。
应该是分多次接受才能接收的玩 你send 1024 * 1024 *56 底层会自动给你分包发送的
回复 点赞
wyx100 2012年06月04日
回复于:2012-06-04 10:17:50localhost?
本机回路不经过网卡的

回复 点赞
zjz800800 2012年06月01日
补充一下,发送的时候,接收方不接收的时候返回也是1024 * 1024 *56,而不是-1,为什么呢?
回复 点赞
发动态
发帖子
网络编程
创建于2007-09-28

7880

社区成员

6.4w+

社区内容

VC/MFC 网络编程
社区公告
暂无公告